jQuery.supportの実装方法
jQuery.support
jQuery.support は、ブラウザーのさまざまな機能のサポートを確認するために使用されます。チェック項目は最大27項目あります。
まず、サポートに含まれるチェック項目をテストするコードを使用してみましょう:
<script src='jquery.js'></script> <script> support = $.support; for (key in support) { document.write('support.' + key + ' = ' + support[key] + '<br />'); } </script>
IE での出力結果は次のとおりです:
support.leadingWhitespace = false support.tbody = false support.htmlSerialize = false support.style = false support.hrefNormalized = false support.opacity = false support.cssFloat = false support.checkOn = true support.optSelected = false support.getSetAttribute = false support.submitBubbles = false support.changeBubbles = false support.focusinBubbles = true support.deleteExpando = false support.noCloneEvent = false support.inlineBlockNeedsLayout = false support.shrinkWrapBlocks = true support.reliableMarginRight = true support.noCloneChecked = false support.optDisabled = true support.radioValue = false support.checkClone = undefined support.appendChecked = false support.boxModel = false support.reliableHiddenOffsets = false support.ajax = true support.cors = false
FireFox での表示結果は次のとおりです:
support.leadingWhitespace = true support.tbody = true support.htmlSerialize = true support.style = true support.hrefNormalized = true support.opacity = true support.cssFloat = true support.checkOn = true support.optSelected = true support.getSetAttribute = true support.submitBubbles = true support.changeBubbles = true support.focusinBubbles = false support.deleteExpando = true support.noCloneEvent = true support.inlineBlockNeedsLayout = false support.shrinkWrapBlocks = false support.reliableMarginRight = true support.noCloneChecked = true support.optDisabled = true support.radioValue = true support.checkClone = undefined support.appendChecked = true support.boxModel = true support.reliableHiddenOffsets = true support.ajax = true support.cors = true
ソース コード内の checkClone チェックには問題があることに注意してください。これについては後述します。
次に、これらの検査項目を一つ一つ分析していきます。
leadingWhitespace
innerHTML で割り当てるときに、先行する空白文字が保持されるかどうかを確認します。
IE では false ですが、Firefox では true です。
実装は次のとおりです:
$ = function(){ var p = document.createElement( "p" ); p.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; var support = { leadingWhitespace: (p.firstChild.nodeType === 3) } return { support : support } }();
このコードでは、最初に p が作成され、次に innerHTML を使用して p に値が割り当てられます。
次に、p の最初の子要素の nodeType が 3 であるかどうかがチェックされます。 (テキストを示す)、
はいの場合、空白文字は保持されますが、それ以外の場合は保持されません。
tbody
tbodyがテーブルに自動的に挿入されるかどうかを確認します。挿入されない場合は、trueになります。
IE では false ですが、FireFox では true です。
実装方法は以下の通りです。
$ = function(){ // Other codes ... var support = { leadingWhitespace: (p.firstChild.nodeType === 3), tbody: !p.getElementsByTagName("tbody").length } // Other codes ... }();
このコードは独自にサポートするtbody属性を追加し、tbodyタグが取得できるか確認します。
innerHTMLにはすでにtableタグが含まれているので、tbodyタグが取得できればテーブルにtbodyが自動挿入されることを意味し、そうでない場合はtbodyが自動挿入されないことを意味します。
htmlSerialize
リンクタグが正しくシリアル化できるか確認します。
IE では false ですが、FireFox では true です。
実装は以下の通りです:
$ = function(){ // Other codes ... var a = p.getElementsByTagName("a")[0]; var support = { // Other codes ... tbody: !p.getElementsByTagName( "tbody" ).length, htmlSerialize: !!p.getElementsByTagName("link").length } return { support : support } }();
このコードは独自にサポートするhtmlSerialize属性を追加し、リンクタグが取得できるかどうかを確認します。
innerHTML には既に link タグが含まれているため、getElementsByTagName でリンク タグが取得できればリンクが正しくシリアル化できていることを意味し、そうでない場合はリンク タグが正しくシリアル化できないことを意味します。
style
DOM要素のスタイルが「style」属性を通じて取得できるかどうかを確認します。
IE では false ですが、Firefox では true です。
実装方法は以下の通りです:
$ = function(){ // Other codes ... var a = p.getElementsByTagName("a")[0]; var support = { // Other codes ... htmlSerialize: !!p.getElementsByTagName("link").length, style: /top/.test(a.getAttribute("style")) } return { support : support } }();
このコードはまずgetElementsByTagName("a")でリンクを表すDOM要素を取得し、
次に独自にサポートするstyle属性を追加し、渡せるかどうかを確認します。 getAttribute("style ") スタイルを取得します。
hrefNormalized
リンクの「href」属性が正常にシリアル化できるか確認します。
IE では false ですが、FireFox では true です。
実装は次のとおりです:
$ = function(){ // Other codes ... var support = { // Other codes ... style: /top/.test(a.getAttribute("style")), hrefNormalized: (a.getAttribute("href") === "/a") } return { support : support } }();
このコードは getAttribute("href") を使用して "href" 属性の値を取得します。
が正しく取得できた場合、それはリンクの "href" 属性を意味します。正しくシリアル化できます。
opacity
CSSスタイルの透明度設定が効果的にサポートできることを確認します。
IE では false ですが、FireFox では true です。
実装は次のとおりです:
$ = function(){ // Other codes ... var support = { // Other codes ... hrefNormalized: (a.getAttribute("href") === "/a"), opacity: /^0.55$/.test(a.style.opacity) } return { support : support } }();
このコードは、a.style.opacity を使用して透明度設定を取得し、正規表現 /^0.55$/ を使用して CSS 内の透明度を確認します。スタイルは効果的にサポートできますが、そうでない場合はサポートできないことを意味します。
cssFloat
CSS スタイルの float 属性が効果的にサポートされていることを確認します。
IE では false ですが、FireFox では true です。
実装方法は以下の通りです:
$ = function(){ // Other codes ... var support = { // Other codes ... opacity: /^0.55$/.test(a.style.opacity), cssFloat: !!a.style.cssFloat } return { support : support } }();
这段代码通过 a.style.cssFloat 来获取 float 属性,并通过 !! 将属性转为 boolean 值(undefined 将被转为 false ,而其他值将被转为 true)。
checkOn
检查 chebox 的 value 是否为 “on”。
IE 和 FireFox 中都为true,而 Chrome 中则为 false 。
实现方式如下:
$ = function(){ // Other codes ... var a = p.getElementsByTagName("a")[0], input = p.getElementsByTagName("input")[0]; var support = { // Other codes ... cssFloat: !!a.style.cssFloat, checkOn: (input.value === "on") } return { support : support } }();
这段代码先通过 getElementsByTagName("input") 获取 checkbox,然后检查 checkbox 的 value 是否为 “on”。
optSelected
检查 select 中的第一个 option 能否被默认选中。
IE 中为 false , FireFox 中为 true 。
$ = 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 } }();
这段代码先通过 createElement("select") 创建了一个 select,
然后将一个 “option” 添加到了 select 中。
接着在 support 中增加了属性 optSelected,检查 opt.selected 是否为true 。
getSetAttribute
检查能够功过 getAttribute("calssName") 和 setAttribute("className", "...") 来获取和设置 p 的 css class。
实际上只检查 setAttribute("className", "...")。
IE 中为 false , FireFox 中为 true 。
$ = function(){ // Other codes ... p.setAttribute("className", "t"); var support = { // Other codes ... optSelected: opt.selected, getSetAttribute: p.className !== "t" } return { support : support } }();
这段代码通过 p.setAttribute("classsName", "t") 将 p 的 css class 设置为 “t”,然后在 support 中增加 getSetAttribute 属性, 检查 p 的 className 是否为 “t”。
submitBubbles, changeBubbles, focusinBubbles
检查 submit、change、focus 事件是否在“冒泡阶段”触发。实际上只针对 IE 进行检查。因为大多数浏览器(及IE9)使用 addEventListener 附加事件,函数的第三个参数 useCapture (是否在“捕捉阶段”触发事件)既可以为 false ,也可以为 true 。
而 IE (IE9之前)使用 attachEvent 函数附加事件,该函数无法指定在哪个阶段触发事件,一律都为“冒泡阶段”触发。
关于 Bubble Event 的更多内容,可以参考 iteye 里其他相关的文章:
http://www.iteye.com/search?query=bubble+event&type=blog
实现方式如下:
$ = function(){ // Other codes ... var support = { // Other codes ... getSetAttribute: p.className !== "t", submitBubbles: true, changeBubbles: true, focusinBubbles: false } if (p.attachEvent) { for(var i in { submit: 1, change: 1, focusin: 1 }) { var eventName = "on" + i; var isSupported = (eventName in p); if (!isSupported) { p.setAttribute(eventName, "return;"); isSupported = ( typeof p[eventName] === "function" ); } support[i + "Bubbles"] = isSupported; } } return { support : support } }();
首先,在 support 中增加 submitBubbles, changeBubbles, focusinBubbles,默认值分别为 true, true, false ,这是针对大多数浏览器的。
然后,针对IE (也就是存在 DOMElement.attachEvent 函数的情况),检查 "onXXX" 事件是否存在,以及能否通过 setAttribute(eventName, xxx)进行设置,可以的话就判断为“冒泡阶段”触发(即只要支持该事件,就判断为“冒泡阶段”触发)。
事实上,jQuery 中的 focusin 事件是在 focus 的基础上进行模拟的,浏览器并不支持该事件,所以 focusinBubbles 总是为 false。
从源代码中的注释来看,似乎还考虑到了跨站脚本攻击:
Short-circuiting here helps us to avoid an eval call (in setAttribute) which can cause CSP to go haywire.
大意是说在这里进行简短的检查(typeof p[eventName] === "function"),而不是直接用 eval 执行事件,可以避免不可控的跨站脚本攻击。(我不确定有没有翻译错)
deleteExpando
检查是否允许删除附加在 DOM Element 上的数据。
IE 中为 false , FireFox 中为 true 。
实现方式如下:
$ = function(){ // Other codes ... var support = { // Other codes ... focusinBubbles: false, deleteExpando: true } // Other codes ... try { delete p.test; } catch(e) { support.deleteExpando = false; } return { support : support } }();
首先在 support 中增加属性 deleteExpando ,默认值为 true 。
然后尝试删除 p.test ,发生错误则将 deleteExpando 设为 false 。
noCloneEvent
检查复制 DOM Element 时是否会连同 event 一起复制,会则为 false , 不会则为true 。
IE 中为 false , FireFox 中为 true 。
实现方式如下:
$ = function(){ // Other codes ... var support = { // Other codes ... deleteExpando: true, noCloneEvent: true } // Other codes ... if (!p.addEventListener && p.attachEvent && p.fireEvent) { p.attachEvent( "onclick", function click() { support.noCloneEvent = false; p.detachEvent( "onclick", click ); }); p.cloneNode(true).fireEvent("onclick"); } return { support : support } }();
首先在 support 中增加属性 noCloneEvent , 默认值为 true 。
然后复制 p, 并触发其 “onclick” 事件,触发成功则为将 noCloneEvent 设为 false。
从判断条件来看,依旧是针对 IE 的事件体系的检查。
inlineBlockNeedsLayout, shrinkWrapBlocks
都是针对 offsetWidth 的检查。
inlineBlockNeedsLayout 表示将原本 display 为 block 的 DOM Element 设置为 disylay: inline 时,是否与 inline 形式的 DOM Elemnt 一致( offsetWidth 为 2 )。
IE 8 及之前的浏览器中为 true , FireFox 中为 false 。
shrinkWrapBlocks 表示内部 DOM Element 的样式是否会影响外部 DOM Element 的样式。
IE 6 中为 true , 多数浏览器中为 false 。
实现方式如下:
$ = function(){ // Other codes ... var support = { // Other codes ... noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false } // Other codes ... if ( "zoom" in p.style ) { p.style.display = "inline"; p.style.zoom = 1; support.inlineBlockNeedsLayout = ( p.offsetWidth === 2 ); p.style.display = ""; p.innerHTML = "<p style='width:4px;'></p>"; support.shrinkWrapBlocks = ( p.offsetWidth !== 2 ); } return { support : support } }();
首先在 support 中增加这两个属性,然后将 p 的 css 样式中的 display 设为 inline ,并检查 offsetWidth ,以确定 inlineBlockNeedsLayout 的值。
接着在 p 内部增加一个 p, 并将其宽度设为 4px ,并检查 offsetWith 的值,以确定外部的 p 是否会受到影响而收缩。
reliableMarginRight
检查 Margin Right 的计算是否可靠。 各浏览器中都为 true 。
原注释中提到某些老版本的 Webkit 内核的浏览器中为 false 。
实现方式如下:
$ = function(){ // Other codes ... var support = { // Other codes ... shrinkWrapBlocks: false, reliableMarginRight: true } // Other codes ... if ( document.defaultView && document.defaultView.getComputedStyle ) { var marginp = document.createElement( "p" ); marginp.style.width = "0"; marginp.style.marginRight = "0"; p.appendChild( marginp ); support.reliableMarginRight = ( parseInt( document.defaultView.getComputedStyle( marginp, null ).marginRight, 10 ) || 0 ) === 0; } return { support : support } }();
简单地说,就是将 width 和 marginRight 设为 0 时,获取的 marginRignt 应为 0 。
noCloneChecked
检查复制 checkbox 时是否连选中状态也一同复制,若复制则为 false ,否则为 true 。
实现方式如下:
$ = function(){ // Other codes ... input.checked = true; support.noCloneChecked = input.cloneNode(true).checked; return { support : support } }();
这段代码将 input 的选中状态设为 true ,然后复制 input ,并检查 checked 是否为 true 。
optDisabled
已经被设为 disable 的 select ,其内部的 option 的 disable 不应为 true 。
这个名称有一定的误导性,可能称为 “optNotDisabled” 更合适一些。
在各浏览器上的值都为 true 。
根据原注释,某些老版本的 Webkit 内核的浏览器上,该值为 false 。
实现如下:
$ = function(){ // Other codes ... select.disabled = true; support.optDisabled = !opt.disabled; return { support : support } }();
这段代码先将 select 的状态设为 disable , 然后检查其中的 option 的 disable 的值。
radioValue
检查 input 元素被设为 radio 类型后是否仍然保持原来的值。
IE 中为 false , FireFox 中为 true 。
实现方式如下:
$ = function(){ // Other codes ... input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; return { support : support } }();
这段代码先创建了 input 元素,将 value 设为 “t” ,然后将其类型设置为 “radio”,最后检查器 input 原来的值是否仍然保留。
checkClone
检查 fragment 中的 checkbox 的选中状态是否能被复制,IE 中为 false ,FireFox 中为 true 。
实现方式如下:
$ = function(){ // Other codes ... p.innerHTML = ""; input.setAttribute("checked", "checked"); p.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( p.firstChild ); support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; return { support : support } }();
这段代码创建了一个 fragment ,并将一个处于选中状态的 checkbox 加入,连续复制两遍后检查 checkbox 是否为选中状态。(这里源代码中的实现似乎有问题,没有将 p 的 innerHTML 清空,导致 p 的 firstChild 并非 checkbox,使得 checkclone 在各浏览器中的值均为 undefined 。)
appendChecked
检查被添加到 DOM 中的 checkbox 是否仍然保留原来的选中状态。
IE 中为 false ,FireFox 中为 true 。
实现方式如下:
$ = function(){ // Other codes ... support.appendChecked = input.checked; return { support : support } }();
实际上只是简单地检查之前添加到 fragment 中的 checkbox 的选中状态。
boxModel
检查页面渲染是否符合 W3C Box Model 。
在 IE 中没有 DocType 声明时为 false ,其余情况为 true 。
实现方式如下:
$ = function(){ // Other codes ... p.innerHTML = ""; p.style.width = p.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(p); document.documentElement.appendChild(body); support.boxModel = p.offsetWidth === 2; body.innerHTML = ""; document.documentElement.removeChild( body ); return { support : support } }();
将 p 的 width 和 paddingLeft 设为 1px ,然后将它添加到 body 中,检查 p 的 offsetWidth 是否为 2 。
reliableHiddenOffsets
检查 hidden 状态下的 offsetWidth 和 offsetHeight 是否正确。
IE 中为 false , FireFox 中为 true 。
实现方式如下(插入到清空 body.innerHTML 之前):
$ = function(){ // Other codes ... p.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>"; var tds = p.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 } }();
检查将一个 td 隐藏时, 相邻的 td 的 offsetHeight 是否为 0 。
ajax, cors
检查是否支持 ajax 请求,以及是否支持跨域 ajax。
IE 与 FireFox 中 ajax 均为 true ,IE 中 cors 为 false , FireFox 中 cros 为 false 。
实现方式如下:
$ = 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 } }();
尝试创建 ajax 对象,创建成功,则 ajax 为 true ;如果 ajax 对象中包含了 "withCredentials" 属性,则表示支持跨域 ajax。
以上がjQuery.supportの実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか?ソーシャルメディアの台頭により、WeChatは人々の日常生活に欠かせないコミュニケーションツールの1つになりました。ただし、多くの人は、同じ携帯電話で同時に複数の WeChat アカウントにログインするという問題に遭遇する可能性があります。 Huawei 社の携帯電話ユーザーにとって、WeChat の二重ログインを実現することは難しくありませんが、この記事では Huawei 社の携帯電話で WeChat の二重ログインを実現する方法を紹介します。まず第一に、ファーウェイの携帯電話に付属するEMUIシステムは、デュアルアプリケーションを開くという非常に便利な機能を提供します。アプリケーションのデュアルオープン機能により、ユーザーは同時に

Java コードによる愛のアニメーション効果の実現 プログラミングの分野では、アニメーション効果は非常に一般的で人気があります。 Java コードを使用してさまざまなアニメーション効果を実現できますが、その 1 つがハートのアニメーション効果です。この記事では、Java コードを使用してこの効果を実現する方法と、具体的なコード例を紹介します。ハートのアニメーション効果を実現する鍵は、ハートの形を描き、ハートの位置や色を変えることでアニメーション効果を実現することです。簡単な例のコードは次のとおりです: importjavax.swing。

プログラミング言語 PHP は、さまざまなプログラミング ロジックやアルゴリズムをサポートできる、Web 開発用の強力なツールです。その中でも、フィボナッチ数列の実装は、一般的で古典的なプログラミングの問題です。この記事では、PHP プログラミング言語を使用してフィボナッチ数列を実装する方法を、具体的なコード例を添付して紹介します。フィボナッチ数列は、次のように定義される数学的数列です。数列の最初と 2 番目の要素は 1 で、3 番目の要素以降、各要素の値は前の 2 つの要素の合計に等しくなります。シーケンスの最初のいくつかの要素

Huawei 携帯電話に WeChat クローン機能を実装する方法 ソーシャル ソフトウェアの人気と人々のプライバシーとセキュリティの重視に伴い、WeChat クローン機能は徐々に人々の注目を集めるようになりました。 WeChat クローン機能を使用すると、ユーザーは同じ携帯電話で複数の WeChat アカウントに同時にログインできるため、管理と使用が容易になります。 Huawei携帯電話にWeChatクローン機能を実装するのは難しくなく、次の手順に従うだけです。ステップ 1: 携帯電話システムのバージョンと WeChat のバージョンが要件を満たしていることを確認する まず、Huawei 携帯電話システムのバージョンと WeChat アプリが最新バージョンに更新されていることを確認します。

Golang で正確な除算演算を実装することは、特に財務計算を含むシナリオや高精度の計算が必要なその他のシナリオでよくあるニーズです。 Golang の組み込みの除算演算子「/」は浮動小数点数に対して計算されるため、精度が失われる場合があります。この問題を解決するには、サードパーティのライブラリまたはカスタム関数を使用して、正確な除算演算を実装します。一般的なアプローチは、math/big パッケージの Rat タイプを使用することです。これは分数の表現を提供し、正確な除算演算を実装するために使用できます。

今日のソフトウェア開発分野では、効率的で簡潔かつ同時実行性の高いプログラミング言語として、Golang (Go 言語) が開発者にますます好まれています。豊富な標準ライブラリと効率的な同時実行機能により、ゲーム開発の分野で注目を集めています。この記事では、ゲーム開発に Golang を使用する方法を検討し、具体的なコード例を通じてその強力な可能性を示します。 1. ゲーム開発における Golang の利点 Golang は静的型付け言語として、大規模なゲーム システムの構築に使用されます。

PHP ゲーム要件実装ガイド インターネットの普及と発展に伴い、Web ゲーム市場の人気はますます高まっています。多くの開発者は、PHP 言語を使用して独自の Web ゲームを開発することを望んでおり、ゲーム要件の実装は重要なステップです。この記事では、PHP 言語を使用して一般的なゲーム要件を実装する方法を紹介し、具体的なコード例を示します。 1. ゲームキャラクターの作成 Web ゲームにおいて、ゲームキャラクターは非常に重要な要素です。ゲームキャラクターの名前、レベル、経験値などの属性を定義し、これらを操作するメソッドを提供する必要があります。

Go 言語で演算子のオーバーロードを実装するにはどうすればよいですか? Go 言語は、その簡潔な構文と効率的なパフォーマンスにより開発者に好まれている最新のプログラミング言語です。ただし、Go 言語は、C++ や Python などの言語のような演算子のオーバーロード機能を提供しません。演算子のオーバーロードとは、さまざまなデータ型にわたって演算子を再定義または拡張して、特定のオブジェクトまたは操作に適用できるようにする動作を指します。 Go 言語では演算子のオーバーロードを直接サポートしていませんが、他の方法で同様の機能を実現できます。 Go言語で
