瀏覽器的嗅探現在已經不推薦了,但在某些場合還是需要的。比如一些統計腳本。在標準瀏覽器里,提供了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寫了一篇文章,來判斷瀏覽器對某種事件的支持。里面給出的實現如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 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補間動畫。它們在事件結束時都用事件回調。但在標準化過程中,瀏覽器給它們起的名字相當于沒規則。這個也需要預先偵測出來。
新聞熱點
疑難解答