ホームページ  >  記事  >  ウェブフロントエンド  >  innerHTML は、複数のブラウザーと互換性のある HTML コードとスクリプトを動的に追加します_JavaScript スキル

innerHTML は、複数のブラウザーと互換性のある HTML コードとスクリプトを動的に追加します_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 16:34:181126ブラウズ

症状: 要素の innerHTML の値を設定するときに、提供された HTML コードに js スクリプトが含まれている場合、多くの場合、これらのスクリプトは無効であるか、一部のブラウザーでは有効でも他のブラウザーでは有効ではありません。

原因: ブラウザーが異なれば、innerHTML に挿入されたスクリプトを処理する方法も異なります。練習後、次のように要約できます:

IE の場合、まず script タグに defer 属性が必要です。次に、挿入時に innerHTML が属するノードが DOM ツリー内に存在する必要があります。

Firefox および Opera の場合、innerHTML が属するノードは、挿入時に DOM ツリー内に存在することはできません。

上記の結論に基づいて、一般的な設定の innerHTML メソッドは次のようになります。

コードをコピー コードは次のとおりです:

/*
* 説明: クロスブラウザ設定 innerHTML メソッド
* スクリプトとスタイルを含む HTML コードの挿入を許可します
* パラメータ:
* el: DOM ツリー内のノード、その innerHTML
を設定します * htmlCode: 挿入された HTML コード
*テスト済みのブラウザ: ie5、firefox1.5、opera8.5
*/
var set_innerHTML = 関数 (el, htmlCode)
{var ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('msie') >= 0 && ua.indexOf('opera') {htmlCode = '
IE
' htmlCode;
htmlCode = htmlCode.replace(/]*)>/gi,'');
el.innerHTML = htmlCode;
el.removeChild(el.firstChild);
}
それ以外
{var el_next = el.nextSibling;
var el_parent = el.parentNode;
el_parent.removeChild(el);
el.innerHTML = htmlCode;
if (el_next)
el_parent.insertBefore(el, el_next)
それ以外
el_parent.appendChild(el);
}
}

上記のコードには別の問題があります。挿入された HTML コードに document.write ステートメントが含まれている場合、ページ全体が破壊されてしまいます。この状況は、document.write を再定義することで回避できます。コードは次のとおりです:
コードをコピー コードは次のとおりです:

/*
説明: document.write 関数を再定義します。
set_innerHTML を使用する場合は、挿入された HTML コードに document.write ステートメントが含まれるため、元のページが破損する可能性があるため避けてください。
*/
document.write = function(){
var body = document.getElementsByTagName('body')[0];
for (var i = 0; i < argument.length; i ) {
引数 = 引数[i];
if (引数の型 == '文字列') {
var el = body.appendChild(document.createElement('div'));
set_innerHTML(el, 引数)
}
}
}
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。