jQuery.support 的实现方式
jQuery.support
jQuery.support 用于检查浏览器对各项特性的支持。检查项多达 27 个。
首先,让我们用一段代码测试一下 support 中包含的检查项:
<script src='jquery.js'></script><script>support = $.support;for (key in support) {document.write('support.' + key + ' = ' + support[key] + '<br />');}</script>support.leadingWhitespace = falsesupport.tbody = falsesupport.htmlSerialize = falsesupport.style = falsesupport.hrefNormalized = falsesupport.opacity = falsesupport.cssFloat = falsesupport.checkOn = truesupport.optSelected = falsesupport.getSetAttribute = falsesupport.submitBubbles = falsesupport.changeBubbles = falsesupport.focusinBubbles = truesupport.deleteExpando = falsesupport.noCloneEvent = falsesupport.inlineBlockNeedsLayout = falsesupport.shrinkWrapBlocks = truesupport.reliableMarginRight = truesupport.noCloneChecked = falsesupport.optDisabled = truesupport.radioValue = falsesupport.checkClone = undefinedsupport.appendChecked = falsesupport.boxModel = falsesupport.reliableHiddenOffsets = falsesupport.ajax = truesupport.cors = false
support.leadingWhitespace = truesupport.tbody = truesupport.htmlSerialize = truesupport.style = truesupport.hrefNormalized = truesupport.opacity = truesupport.cssFloat = truesupport.checkOn = truesupport.optSelected = truesupport.getSetAttribute = truesupport.submitBubbles = truesupport.changeBubbles = truesupport.focusinBubbles = falsesupport.deleteExpando = truesupport.noCloneEvent = truesupport.inlineBlockNeedsLayout = falsesupport.shrinkWrapBlocks = falsesupport.reliableMarginRight = truesupport.noCloneChecked = truesupport.optDisabled = truesupport.radioValue = truesupport.checkClone = undefinedsupport.appendChecked = truesupport.boxModel = truesupport.reliableHiddenOffsets = truesupport.ajax = truesupport.cors = true
$ = function(){ var div = document.createElement( "div" ); div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; var support = { leadingWhitespace: (div.firstChild.nodeType === 3) } return { support : support }}();$ = function(){ // Other codes ... var support = { leadingWhitespace: (div.firstChild.nodeType === 3), tbody: !div.getElementsByTagName("tbody").length } // Other codes ...}();$ = function(){ // Other codes ... var a = div.getElementsByTagName("a")[0]; var support = { // Other codes ... tbody: !div.getElementsByTagName( "tbody" ).length, htmlSerialize: !!div.getElementsByTagName("link").length } return { support : support }}();$ = function(){ // Other codes ... var a = div.getElementsByTagName("a")[0]; var support = { // Other codes ... htmlSerialize: !!div.getElementsByTagName("link").length, style: /top/.test(a.getAttribute("style")) } return { support : support }}();$ = function(){ // Other codes ... var support = { // Other codes ... style: /top/.test(a.getAttribute("style")), hrefNormalized: (a.getAttribute("href") === "/a") } return { support : support }}();$ = function(){ // Other codes ... var support = { // Other codes ... hrefNormalized: (a.getAttribute("href") === "/a"), opacity: /^0.55$/.test(a.style.opacity) } return { support : support }}();$ = function(){ // Other codes ... var support = { // Other codes ... opacity: /^0.55$/.test(a.style.opacity), cssFloat: !!a.style.cssFloat } return { support : support }}();$ = function(){ // Other codes ... var a = div.getElementsByTagName("a")[0], input = div.getElementsByTagName("input")[0]; var support = { // Other codes ... cssFloat: !!a.style.cssFloat, checkOn: (input.value === "on") } return { support : support }}();$ = function(){ // Other codes ... var select = document.createElement("select"); var opt = select.appendChild(document.createElement("option")); var support = { // Other codes ... checkOn: (input.value === "on"), optSelected: opt.selected } return { support : support }}();$ = function(){ // Other codes ... div.setAttribute("className", "t"); var support = { // Other codes ... optSelected: opt.selected, getSetAttribute: div.className !== "t" } return { support : support }}();$ = function(){ // Other codes ... var support = { // Other codes ... getSetAttribute: div.className !== "t", submitBubbles: true, changeBubbles: true, focusinBubbles: false } if (div.attachEvent) { for(var i in { submit: 1, change: 1, focusin: 1 }) { var eventName = "on" + i; var isSupported = (eventName in div); if (!isSupported) { div.setAttribute(eventName, "return;"); isSupported = ( typeof div[eventName] === "function" ); } support[i + "Bubbles"] = isSupported; } } return { support : support }}();$ = function(){ // Other codes ... var support = { // Other codes ... focusinBubbles: false, deleteExpando: true } // Other codes ... try { delete div.test; } catch(e) { support.deleteExpando = false; } return { support : support }}();$ = function(){ // Other codes ... var support = { // Other codes ... deleteExpando: true, noCloneEvent: true } // Other codes ... if (!div.addEventListener && div.attachEvent && div.fireEvent) { div.attachEvent( "onclick", function click() { support.noCloneEvent = false; div.detachEvent( "onclick", click ); }); div.cloneNode(true).fireEvent("onclick"); } return { support : support }}();$ = function(){ // Other codes ... var support = { // Other codes ... noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false } // Other codes ... if ( "zoom" in div.style ) { div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); div.style.display = ""; div.innerHTML = "<div style='width:4px;'></div>"; support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); } return { support : support }}();$ = function(){ // Other codes ... var support = { // Other codes ... shrinkWrapBlocks: false, reliableMarginRight: true } // Other codes ... if ( document.defaultView && document.defaultView.getComputedStyle ) { var marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( document.defaultView.getComputedStyle( marginDiv, null ).marginRight, 10 ) || 0 ) === 0; } return { support : support }}();$ = function(){ // Other codes ... input.checked = true; support.noCloneChecked = input.cloneNode(true).checked; return { support : support }}();$ = function(){ // Other codes ... select.disabled = true; support.optDisabled = !opt.disabled; return { support : support }}();$ = function(){ // Other codes ... input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; return { support : support }}();$ = function(){ // Other codes ... div.innerHTML = ""; input.setAttribute("checked", "checked"); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.firstChild ); support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; return { support : support }}();$ = function(){ // Other codes ... support.appendChecked = input.checked; return { support : support }}();$ = function(){ // Other codes ... div.innerHTML = ""; div.style.width = div.style.paddingLeft = "1px"; body = document.createElement( "body" ); bodyStyle = { visibility: "hidden", width: 0, height: 0, border: 0, margin: 0, background: "none" }; for (var i in bodyStyle ) { body.style[i] = bodyStyle[i]; } body.appendChild(div); document.documentElement.appendChild(body); support.boxModel = div.offsetWidth === 2; body.innerHTML = ""; document.documentElement.removeChild( body ); return { support : support }}();$ = function(){ // Other codes ... div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>"; var tds = div.getElementsByTagName("td"); var isSupported = (tds[0].offsetHeight === 0); tds[0].style.display = ""; tds[1].style.display = "none"; support.reliableHiddenOffsets = isSupported && (tds[0].offsetHeight === 0); body.innerHTML = ""; document.documentElement.removeChild( body ); return { support : support }}();$ = function(){ // Other codes ... var xhr = window.ActiveXObject ? !this.isLocal && createStandardXHR() || createActiveXHR() : createStandardXHR(); support.ajax = !!xhr; support.cors = !!xhr && ( "withCredentials" in xhr ) function createStandardXHR() { try { return new window.XMLHttpRequest(); } catch( e ) {} } function createActiveXHR() { try { return new window.ActiveXObject("Microsoft.XMLHTTP"); } catch( e ) {} } return { support : support }}();