ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript ドキュメント オブジェクト モデル - DOM 拡張機能

JavaScript ドキュメント オブジェクト モデル - DOM 拡張機能

黄舟
黄舟オリジナル
2017-01-20 14:44:231173ブラウズ

DOM に対する W3C の要件に従って、ブラウザーは DOM に独自にプロパティとメソッドを追加して、その機能を強化できます。新機能の一部は下位互換性のためのものですが、その他は一般的な問題に関する開発者のフィードバックに基づいて追加されています。

プレゼンテーション モード

IE6 以降、IE ブラウザは標準モードと混合モードを区別するため、ブラウザを使用するときにどのモードであるかを区別する必要があります。 IE は、compatMode という属性をドキュメント オブジェクトに追加します。この属性の唯一の役割は、ブラウザーがどのモードであるかを識別することです。たとえば、次の例では、標準モードの場合、document.compatMode の値は「CSS1Compat」に等しく、混合モードの場合、document.compatMode の値は「BackCompat」に等しくなります。

if(document.compatMode == "CSS1Compat"){
    alert("标准模式");
}else{
    alert("混杂模式");
}

IE 以降、Firefox、Chrome、Opera ブラウザにもこの属性が実装されました。 Safari ブラウザは、バージョン 3.1 以降、 document.compatMode プロパティを実装します。

その後、IE8 では、ドキュメント オブジェクトに documentMode と呼ばれる新しいプロパティが導入されました。使用方法を以下に示します。

if(document.compatMode > 7){
    alert("IE8+ 标准模式");
}

これは、IE8 には 3 つの異なるレンダリング モードがあり、この属性はこれらのモードを区別するために正確に導入されているためです。この属性の値が 5 の場合は混合モード (IE5 モード) を示し、値が 7 の場合は IE7 エミュレーション モードを示し、8 の場合は IE8 標準モードを示します。

contains() メソッド

DOM を操作するとき、特定のノードが別のノードの子孫ノードであるかどうかを判断する必要があることがよくあります。 IE ブラウザでは、DOM ツリー全体を走査せずにこの情報を取得できる contains() メソッドが初めて導入されました。 contains() メソッドは、検索の開始点として祖先ノードで呼び出される必要があります。このメソッドは、検出される子孫ノードである 1 つのパラメーターを受け取ります。渡されたノードが現在のノードの子孫である場合は true を返し、それ以外の場合は false を返します。たとえば、

alert(document.documentElement.contains(document.body));   //true

要素が 要素の子孫であるかどうかをテストします。それが適切にフォーマットされた HTML ページである場合、true を返します。

IE、Safari3+、Opera8+、および Chrome ブラウザはすべて contains() メソッドをサポートしています。

Firefox ブラウザは contains() メソッドをサポートしていませんが、Firefox は DOM3 レベルで代替メソッドであるcompareDocumentPosition() メソッドを実装しています。 (Opera9.5 以降のブラウザもこの方法をサポートしています)。このメソッドは 2 つのノード間の関係を決定するために使用され、関係を表すビットマスク (ビットマーク) を返します。このビットマスクの値を次の表に示します。

JavaScript ドキュメント オブジェクト モデル - DOM 拡張機能


contains() メソッドを模倣する必要がある場合は、マスク 16 に注意する必要があります。 CompareDocumentPosition() メソッドの結果に対してビットごとの AND 演算を実行して、参照ノード (compareDocumentPosition() メソッドが呼び出された現在のノード) に指定されたノード (引数として渡されたノード) が含まれているかどうかを判断できます。たとえば、次の例:

var result = document.documentElement.compareDocumentPosition(document.body);
console.info("result="+result);
console.info("按位与操作后的布尔值结果为:"+!!(result & 16));

JavaScript ドキュメント オブジェクト モデル - DOM 拡張機能

上記のコードでcompareDocumentPosition()メソッドを実行した後、得られる結果は20で、これは「後方」4と「含まれる」16を意味します。次に、マスク 16 に対するビット単位の AND 演算により、ゼロ以外の値が返されます。 2 つの論理 NOT 演算子は、数値をブール値タイプに変換するために使用されます。

ブラウザの機能検出を通じて、一般的な contains() 関数を作成できます。

/*********************************************************/
/* 浏览器通用contains()方法
/* 参数:refNode - 参考节点 */
/* 参数:otherNode - 要检测的节点 */
/* 返回值: refNode包含otherNode是返回true,否则返回false*/
/*********************************************************/
function contains(refNode,otherNode){
    if(typeof refNode.contains == "function"){
        return refNode.contains(otherNode);
    }else if(typeof refNode.compareDocumentPosition == "function"){
        return !!(refNode.compareDocumentPosition(otherNode) & 16);
    }else{
        var node = otherNode.parentNode;
        do{
            if (node === refNode) {
                return true;
            }else{
                node = node.parentNode;
            }
        }while(node !== null);
        return false;
    }
}

この一般的な contains() 関数は 3 つのメソッドを使用して、ノードが別のノードの子孫ノードであるかどうかを判断します。関数の最初のパラメータは参照ノード、2 番目のパラメータは検出されるノードです。

関数本体では、最初に refNode に contains() メソッドが存在するかどうかを確認し、次に、compareDocumentPosition() メソッドがあるかどうかを確認します。関数の最後のステップは、otherNode から開始して DOM ツリーを上方向に走査し、再帰的に取得することです。 parentNode を調べて、それが refNode と等しいかどうかを確認します。ドキュメント ツリーの最上位では、parentNode の値が null に等しくなり、ループが終了します。

上記は JavaScript Document Object Model-DOM 拡張機能の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。