web-dev-qa-db-ja.com

IEのHTMLパーサーの問題

選択したブラウザがIE(任意のバージョン)の場合にのみ表示されるダイアログボックスを作成しようとしていますが、このエラーが表示されます。

メッセージ:HTML解析エラー:子要素が閉じる前に親コンテナー要素を変更できません(KB927917)

それはすべて「Line/Char/Code」0にあるので、エラーがどこにあるのかわかりません。私が使用しているコードは次のとおりです。

 <script type="text/javascript"> 
  <!--  
  if(BrowserDetect.browser.contains("Explorer"))
  {     
    var Nachricht = 'Hemos detectado que está utilizando ' + BrowserDetect.browser + ' ' +
  BrowserDetect.version + '. Puede que algunas funciones no estén habilitadas. <p></p> Si desea experimentar todo el potencial del portal, por favor intente desde otro navegador (browser). <p></p>Gracias
 showDialog('¡Aviso Importante!',Nachricht,'warning',10);
 } 
 </script>

「BrowserDetect.browser」と.versionを削除するとエラーが削除されることに気づきましたが、チェックする必要があります=/...すべてのアイデアが評価されます=)。

35
Tsundoku

ロード中のドキュメントを変更しています(ブラウザがこの要素の終了タグを「表示」していない場合)。これにより、パーサーとIEでは許可されません。

IEブログ に説明があります。

解決策は、ドキュメントの初期段階にあり、完全にロードされた別の要素を変更することです(ブラウザでは既にその終了タグが表示されています)。


ところで:文字列</<script>要素では許可されていません。 JS文字列と同等の安全な<\/を使用します。

27
Kornel

同じ問題がありました。私の問題は、含むdivが閉じる前にJavascript関数を呼び出していたことです。

問題を修正するために、jQuery readyイベントハンドラー内でJavascript関数を呼び出します。

$(document).ready(function(){
    some_random_javascript_function();
});
9
Nick

PorneLでリンクされた doc を読んで、この問題の簡単な回避策を見つけました。スクリプトにパラメーター 'defer'を追加すると、すべて正常に動作します。

<script defer=true>
7
Pablo Alba

ブラウザのスニッフィングは、可能な場合は避ける必要のある厄介なものです。使用したいcapabilityをスニッフィングするのが最善です。 document.evaluate()を使用してXPath式を実行したいが、サポートされているかどうかわからないとします。サポートされているブラウザをスニッフィングする代わりに、これを実行します。

if (document.evaluate) {
    // go ahead and use it
} else {
    // browser doesn't support it; do something else
}
3

セルゲイ・キリエンコが言ったように:条件付きコメントを使う。以下のコードはInternet Explorerによってのみ実行されます。マイクロソフトは this ページに良い情報を持っています。

<!--[if IE]>
<script type="text/javascript"> 
 showDialog('¡Aviso Importante!','message','warning',10);
 </script>
<![endif]-->

特定のバージョンが必要な場合は、それについてもテストできます。

<!--[if lte IE 7]>
    <script type="text/javascript"> 
     showDialog('¡Aviso Importante!','Your are using a too old version of Internet Explorer. Please upgrade','warning',10);
    </script>
<![endif]-->
3
some

IEのみに対応する最良の方法は、条件付きコメントです。JavaScriptを使用する必要さえありません。例 http://www.positioniseverything.net/articles/ie7-dehacker.html

2
Sergey Kirienko

javascriptはnavigator.appNameを使用すると非常に簡単に機能します。 ( http://de.selfhtml.org/javascript/objekte/navigator.htm を参照)これでif-queryを作成できます。非常に簡単、試してみてください!

0
David

https://apis.google.com/js/plusone.js の現在のバージョンは、私のサイトのIE8でこのバグを引き起こしました。

最も簡単なソリューション-google +を削除します。

簡単な解決策-jqueryのdocument.ready -functionまたは同様のコードをラップします。

$(document).ready(function(){
     var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
     po.src = 'https://apis.google.com/js/plusone.js';
     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
});
0
Apeli

少し遅いかもしれませんが、SWFObjectを使用していて、同じIDを持つ2つのdivがある場合にも、このエラーがポップアップします。

重複したdivがありました(コピー&ペーストのおかげでid = "flashcontent"を使用)。

一意のIDを持つdivの名前を変更することで解決しました。

0
robasta