亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript框架設計之瀏覽器的嗅探和特征偵測

2019-11-20 12:11:49
字體:
來源:轉載
供稿:網友

瀏覽器的嗅探現在已經不推薦了,但在某些場合還是需要的。比如一些統計腳本。在標準瀏覽器里,提供了document.implementation.hasfeature,可惜有bug,不準確,目前,w3c又推出了CSS.supports方法,顯示出大家對這塊的關注。

1.判定瀏覽器。

主流的瀏覽器有ie firefox opera chorme safari 早期這些框架都是通過navigator.userAgent進行判定,目前國外的瀏覽器幾乎都是可以判定的。

關于瀏覽器的判斷腳本,jQuery已經移出本體,形成一個插件。更多的方式不多介紹,

移動設備的相關判定,這個建議看jQuery mobile與zepto的源代碼。

復制代碼 代碼如下:

    isIPone = /isIPone/i.test(navigator.userAgent);
    isIPone4 = window.devicePixelRatio >= 2 //在網頁中,pixel與point比值稱為device-pixel-ratio,普通設備都是1,iPhone4是2,有些 安卓機型是1.5
    isIpad = /ipad/i.test(navigator.userAgent)
    isAndroid = /android/i.test(navigator.userAgent)
    isIOS = isIPone || isIpad

國內的瀏覽器判定可以看Tangrame或qwrap,它們基本是IE,webkit,blink內核。

2.事件的支持偵測

prototype的核心成員kangax寫了一篇文章,來判斷瀏覽器對某種事件的支持。里面給出的實現如下:

  var isEventSupported = (function() {    var TAGNAMES = {      'select':'input','change':'input',      'submit':'form','reset':'form',      'error':'img','load':'img','abort':'img'    }    function isEventSupported(eventName){      var el = document.createElement(TAGNAMES[eventName] || 'div');      eventName = 'on' + eventName;      var isSupported = (eventName in el);      if (!isSupported) {        el.setAttribute(eventName, 'return;');        isSupported = typeof el[eventName] == 'function';      }      el = null;      return isSupported;    }    return isEventSupported;  })();

現在jQuery等框架都是使用腳本的簡化版

不過哪一個也好,這種檢測只對DOM0奏效,像DOMMouseScroll DOMContentLoaded DOMFocusIn DOMFocusOut DOMSubtreeModified DOMNodeInserted DOMNodeRemoved DOMNodeRemovedFromDocument DOMNodeInsertedIntoDocument DOMAttrModified DOMCharactorDataModified這些以DOM開頭的就無能為力了。

這些事件中,有的非常有用,如DOMMouseScroll,firefox一直不支持mousesheel,只能用它做替代品。
DOMContentLoaded是實現domReady的重要事件;DOMNodeRemoved是判定元素是否從其父節點移除,父節點可能是其它元素節點或文檔碎片;DOMNodeRemovedFromDocument 是移離DOM樹,DOMAttrModified 以前經常用于模擬IE的onpropertyChange

css3添加兩種動畫,一種是transition動畫,另外一種是keyframe補間動畫。它們在事件結束時都用事件回調。但在標準化過程中,瀏覽器給它們起的名字相當于沒規則。這個也需要預先偵測出來。

下面是bootstrap的實現。聽說來源于modernizr,比較粗糙。比如你使用的Oprera已經支持不帶事件標準事件名。它還是返回oTransitionEnd.

  $.supports.transition = (function(){    var transitionEnd = (function(){      var el = document.createElement('bootstarp'),          transEndEventNames = {            'WebkitTransition':'webkitTransitionEnd',            'MozTransition':'transitionend',            'OTransition':'OTransitionEnd otransitionend',            'transition':'transitionend'          };        for (var name in transEndEventNames){          if (el.style[name] !== undefined){            return transEndEventNames[name]          }        }    }());    return transitionEnd && {      end: transitionEnd    }  })();

keyframe補間動畫來自mass的fx_neo模塊

  var eventName = {    AnimationEvent:'animationend',    WebKirAnimationEvent: 'WebKirAnimationEnd'  },animationend;  for(var name in eventName) {    if (/object|function/.test(typeof window[name])){      animationend = eventName[name]      break    }  }

3.樣式的支持偵探

css3帶來許多好用的樣式,但是麻煩的是每個瀏覽器都有自己的私有前綴,massFramework提供了一個cssName方法來處理它們,有就返回可用的駝峰樣式名,沒有就null

  var prefixes = ['','-webkit-','-o-','-moz-','-ms-'];  var cssMap = {    "float" : $.support.cssFloat ? 'cssFloat' : 'styleFloat',background:'backgroundColor'  };  function cssName(name, host, camelCase){    if(cssMap[name]) {      return cssMap[name];    }    host = host || document.documentElement    for (var i = 0 || n = prefixes.length; i < n; i++) {      camelCase = $.String.camelize(prefixes[i] + name);      if (camelCase in host) {        return (cssMap[name] = camelCase)      }    }    return null  }

一個樣式對于N種樣式值,比如display有n種取值,如果要偵測瀏覽器是否支持某一種,會很麻煩。為此,瀏覽器做了一個善舉,給出一個css.supports的API,如果不支持,則嘗試下一個開源項目。顯然,不是很完美。

https://github.com/termi/CSS.supports

4.jQuery的一些常用的特征的含義

jQuery在support模塊例舉了一些常用的DOM特征支持情況,不過名字起的很怪,不同版本差別也很大,本章以jQuery1.8為準。

leadingWhitespace:判定瀏覽器在進行innerHTML賦值時,是否存在trimLeft操作,這個功能原本是IE發明的,結果其他瀏覽器認為要忠于以后的原始值,最前面的空白不能神略掉,要變成一個文本節點,最終IE678返回false,其他瀏覽器返回true

tobody:指在用innerHTML動態創建元素時,瀏覽器是否會在table內自動補上tobody,jQuery希望瀏覽器別處理,讓jQuery來補全。判斷瀏覽器是否只能插入tobody。在表格布局的年代,這個特性十分受用。如果沒有tbody,table會在瀏覽器解析到閉合標簽時才顯示出來。如果起始標簽和閉合標簽相隔很遠,換言之,這個表格很長,用戶會什么都看不到,但有了tbody分段顯示和識別,避免了長時間空白后一下子顯示出來的情況。

復制代碼 代碼如下:

    var div = document.createElement("div");
    div.innerHTML = '<table></table>'
    alert(div.innerHTML) //=>ie678返回<table><tbody></tbody></table>,其它返回<table></table>

html.Serialize:判斷瀏覽器是否完好支持用innerHTML轉換一個符合html標簽規則的字符串為一個元素節點,此過程jQuery稱為序列化,但IE支持不夠完好。包括scirpt link style mata在內的no-scope元素都轉換失敗。

style:這個命名很難看懂,不看代碼不知道什么意思,真像是判定getAttribute是否返回style的用戶預設值。IE678沒有返回區分特性的特征,返回一個CSSStyleDeclaration對象。

hrefNormalized:判定getAttribute能否返回href的用戶預設值。IE會補充給你完整的路徑給你

opacity:判定瀏覽器是否支持opacity屬性,ie678要使用濾鏡

cssFloat: 判定float的樣式在DOM的名字是那個,W3c為cssFloat,IE678為styleFloat

CheckOn: 在大多數瀏覽器中checkBox的value為on,chorme返回空字符串

optSelected: 判定是否正確取得動態添加option元素的seleted,ie6-10與老版的safari對動態添加option沒有設置為true。解決辦法,在訪問selected屬性前,先訪問父節點的selectedIndex屬性,再強制計算option的seleted.

<select id='optSelected'></select><script type="text/javascript">  var select = document.getElementById('optSelected');  var option = document.createElement('option');  select.appendChild(option);  alert(option.selected);  select.selectedIndex;  alert(option.selected)</script>

optDisabled : 判定select元素的disable屬性是否影響到子元素的disabled取值.在safari中,一旦select元素被disabled,它的子元素也disabled,導致一個值也取不到

checkClone:是指一個checkbox元素,如果設置了checked=true,且在多次克隆后,它的復制品能否保持為true。這個方法只有在safari4中返回false,其它的都true

inlineBlockNeedsLayout:判定是否使用hasLayout方法讓dispaly:inline-block生效。這個方法只有ie678為true

getSetAttribute:判定是否區分特性屬性,只有ie678為false

noCloneEvent:判定在克隆元素時是否克隆attachEvent綁定事件。只有舊版本的ie及其兼容模式返回false

enctype:判定瀏覽器是否支持encoding屬性,ie67使用encoding屬性來代替

boxModel:判定瀏覽器是否在content-box盒子渲染模式下

submitBubbles, changeBubbles, focusinBubble:判定瀏覽器是否支持這些事件,一直冒泡到document

shrinkWrapBlocks:判定元素是否會被子元素撐開。在IE678中,非替換元素在設置了大小與hasLayout的情況下,將將其父級元素撐大。

html5Clone:判定能否使用cloneNode克隆HTML5新標簽 ,舊版本的IE不支持。需要用到outerHTML

deleteExpando:判定能否刪除元素節點上的自定義元素,這用于jQuery緩存系統。舊版本的IE不支持,直接undefined

pixelPosition:判定getComputedStyle能否轉換元素的top left bottom right元素的百分比值。這個在webkit系統會出現問題,需要用到 Dean Edwards神的hack

reliableMarginRight:判定getComputedStyle能否正確的取得元素的marginRiht.

clearCloneStyle :ie9 10 會出現奇怪的bug,當復制了一個元素的background-*樣式的元素,對復制的元素進行清空時,會清空原來的樣式。

隨著瀏覽器瘋狂更新版本,標準瀏覽器引發的各種bug已經超越IE,特征偵測不退反進,越來越重要了。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人黄色激情网| 久久久久久久久久久国产| 欧美性jizz18性欧美| 日韩av毛片网| 午夜精品国产精品大乳美女| 久久综合网hezyo| 欧美一级淫片丝袜脚交| 亚洲天堂色网站| 日韩精品在线视频美女| 欧美大片网站在线观看| 国产精品美女www爽爽爽视频| 一本一道久久a久久精品逆3p| 91精品视频在线播放| 在线不卡国产精品| 亚洲国产精品视频在线观看| 国产亚洲人成网站在线观看| 成人免费视频在线观看超级碰| 精品久久久久久久久久久久| 亚洲国产日韩欧美在线动漫| 亚洲深夜福利视频| xvideos亚洲| 亚洲欧洲日韩国产| 日韩中文字幕欧美| 国产美女直播视频一区| 98精品国产自产在线观看| 欧洲亚洲免费视频| 成人情趣片在线观看免费| 亚洲视频第一页| 欧美精品制服第一页| 国产成人91久久精品| 精品久久久久久亚洲国产300| 2019中文字幕全在线观看| 欧美性猛交丰臀xxxxx网站| 国产一区二区三区三区在线观看| 久久99精品国产99久久6尤物| 午夜免费久久久久| 欧美日韩国产区| 中文字幕亚洲一区二区三区| 久久久久国产视频| 国产成人精品亚洲精品| 中文字幕自拍vr一区二区三区| 92看片淫黄大片欧美看国产片| 亚洲va久久久噜噜噜| 久久成人精品视频| 深夜福利日韩在线看| 亚洲欧美在线免费观看| 国产在线观看精品一区二区三区| 欧美超级免费视 在线| 97国产成人精品视频| 亚洲另类欧美自拍| 亚洲精品乱码久久久久久金桔影视| 中文字幕欧美精品日韩中文字幕| 日韩在线观看免费全集电视剧网站| 亚洲精品之草原avav久久| 日韩视频在线免费观看| 午夜精品免费视频| 成人中心免费视频| 国产精品亚洲一区二区三区| 91av在线国产| 国产精品久久久久久av下载红粉| 精品久久久久久久大神国产| 欧美性xxxxxx| 国产日韩在线观看av| 欧美精品www在线观看| 一区二区在线视频| 欧美亚洲国产另类| 欧美精品午夜视频| 欧美性感美女h网站在线观看免费| 欧美在线视频在线播放完整版免费观看| 久久精视频免费在线久久完整在线看| 精品久久久久久电影| 国产97在线视频| 亚洲一区二区三区四区视频| 欧美一区二区三区艳史| 九九九热精品免费视频观看网站| 亚洲精品98久久久久久中文字幕| 欧美精品激情视频| 91久久精品美女| 亚洲色图25p| 久久免费少妇高潮久久精品99| 国产剧情久久久久久| 日韩禁在线播放| 51ⅴ精品国产91久久久久久| 国产精品视频白浆免费视频| 欧美激情亚洲激情| 亚洲精品美女免费| 国产亚洲人成a一在线v站| 日韩精品日韩在线观看| 亚洲精品国偷自产在线99热| 亚洲精品小视频| 51精品国产黑色丝袜高跟鞋| 日韩欧美成人网| 91久久久久久久久久久| 亚洲精品在线观看www| 亚洲aa在线观看| 性欧美长视频免费观看不卡| 2020久久国产精品| 欧美视频免费在线观看| 亚洲精品久久久久久久久久久| 色av吧综合网| 久久影院资源站| 国产精品久久久久9999| 久久久久久18| 欧美一区二区.| 久久视频在线看| 国产精品网站视频| 日韩av免费在线观看| 欧美精品videosex性欧美| 91久久久久久久久久| 国内精品小视频在线观看| 在线播放国产一区中文字幕剧情欧美| 两个人的视频www国产精品| 国产精品xxx视频| 66m—66摸成人免费视频| 国产精品色视频| 国产日韩欧美日韩大片| 国产精品扒开腿做爽爽爽视频| 成人福利视频网| 国产裸体写真av一区二区| 奇门遁甲1982国语版免费观看高清| 国产va免费精品高清在线| 亚洲天堂成人在线| 欧美成人网在线| 91精品国产色综合久久不卡98口| 精品久久久久久久久久久久久久| 欧美国产日韩中文字幕在线| 欧美日本黄视频| 亚洲美女精品成人在线视频| 影音先锋欧美在线资源| 精品美女国产在线| 日韩欧美高清在线视频| 欧美一级视频在线观看| 91老司机精品视频| 亚洲第一免费播放区| 欧美精品在线观看| 欧美性xxxx极品hd欧美风情| 亚洲欧洲在线视频| 欧美性xxxx极品高清hd直播| 亚洲а∨天堂久久精品9966| 久久久免费观看| 国产精品88a∨| 日本中文字幕成人| 91av免费观看91av精品在线| 国产午夜精品美女视频明星a级| 国产精品v片在线观看不卡| 日韩大陆欧美高清视频区| 精品国产一区二区三区久久狼黑人| 国产91色在线免费| 久久久精品国产网站| 正在播放国产一区| 欧美性色xo影院| 精品视频在线播放免| 日本久久中文字幕| 亚洲欧美激情在线视频| 亚洲片国产一区一级在线观看| 国产高清在线不卡| 欧美xxxx18国产| 久久久久久亚洲精品中文字幕| 国产精品日韩在线观看| 欧美久久精品一级黑人c片| 日韩欧美a级成人黄色| 久久69精品久久久久久国产越南| 国产精品日韩欧美综合| 中文字幕av一区二区|