IEのKB 927917問題を解決します.
3514 ワード
ページエラーメッセージ:
Unbale to modify the parent container element before the child element is closed(KB 927917)
簡単な説明:サブHTML要素には、子容器の親容器要素を変更しようとするスクリプトが含まれています.
この問題は偉大なブラウザIEが発見したもので、各ブラウザはこのようなフィードバックがない.原因は解析のJavaScriptの仕組みが違っているからだ.この問題はIE 8まで存在しています.JavaScriptを解析する解析IEは読みながら実行されるので、スクリプトが親要素の修正を許可し、またサブ要素がオフされていない場合は、理性を失うことになります.
まずマイクロソフトの詳細説明です.http://support.microsoft.com/kb/927917
インターネット上で一般的に発生している状況は、例えば以下のように、apendChildまたはinners HTMLである.
IE Developerデバッグによって得られた正確な位置は以下の通りである.
最後に考えてみましたが、マイクロソフト独特の問題で、マイクロソフトのもう一つの独特な属性「defer」を思い出しました.使用後、問題はすぐに解決されました.
これは参加してももとのコードは変更しなくてもいいです.各種ブラウザに対応しています.問題は解決します.
最後に、実はマイクロソフトのMSDNにはすでに解決方法が挙げられています.deferを使うことも含まれています.また一周回ったようです.自分でマイクロソフトのためにため息をつくことができないで、自分のした問題、自分の方法を使って解決して、最後に苦労したのはやはり私達です.えっと、
具体的なMSDNアドレス:
http://blogs.msdn.com/ie/archive/2008/04/23/what-happened-to-operation-aborted.aspx
公式の解決方法は以下の通りです.
1.Moving your script execution to a function that is invoked after parsing is coplete(e.g.onload)
2.Adding the defer bootlean atribute to the script block(this defers execution of the script content until parsing is comple)
3.Limiting your tree modifitions to the script-element's immediate parent
4.Moving the location of your script block to a child of the body.
Unbale to modify the parent container element before the child element is closed(KB 927917)
簡単な説明:サブHTML要素には、子容器の親容器要素を変更しようとするスクリプトが含まれています.
この問題は偉大なブラウザIEが発見したもので、各ブラウザはこのようなフィードバックがない.原因は解析のJavaScriptの仕組みが違っているからだ.この問題はIE 8まで存在しています.JavaScriptを解析する解析IEは読みながら実行されるので、スクリプトが親要素の修正を許可し、またサブ要素がオフされていない場合は、理性を失うことになります.
まずマイクロソフトの詳細説明です.http://support.microsoft.com/kb/927917
インターネット上で一般的に発生している状況は、例えば以下のように、apendChildまたはinners HTMLである.
<html>
<body>
<div>
<script type="text/javascript">
var newElem = document.createElement('foo');
document.body.appendChild(newElem);
</script>
</div>
</body>
</html>
しかし、私が出会ったのは、 var isKonqueror = /KHTML/.test(navigator.userAgent);
var isIE = ( /MSIE/.test(navigator.userAgent) && !/(Opera|Gecko|KHTML)/.test(navigator.userAgent) );
var iframe = document.createElement("iframe");
iframe.style.width = "100%";
iframe.style.height = "20px";
iframe.style.overflowX = "auto";
iframe.scrolling = "no";
iframe.marginWidth = 0;
iframe.marginHeight = 0;
iframe.border = 0;
iframe.frameBorder = 0;
iframe.style.border = "none";
function resizeAndNullIframe() { resizeIframe(); iframe = null;};
function resizeIframe() {
if (iframe !=null) {
var w = iframe.offsetWidth, b = iframe.contentWindow.document.body;
if (b.scrollWidth > w) {
b.style.overflow = "auto";
b.style.width = w + "px";
} else {
iframe.style.width = b.scrollWidth -20 + "px";
}
var i_frame = iframe;
//alert(b.scrollHeight+"|"+iframe.offsetHeight);
var _delay = isIE ? 300 : 0 ;
setTimeout(function(){ i_frame.style.height = b.scrollHeight + 30 + "px";}, _delay);
}
};
document.getElementById("iframeBody1").appendChild(iframe);
iframeBody 1は、このコードを格納するコンテナIDである.最大の疑いはdocument.creat Element(「iframe」)の一節だが、改めるのは面倒くさい.IE Developerデバッグによって得られた正確な位置は以下の通りである.
iframe.style.width = b.scrollWidth -20 + "px";
長い間見ましたが、まだ原因が分かりません.デバッグはこの文を削除しても、エラーを報告します.しかし、IE Developerはもう何のヒントもありません.単純なエラーです.最後に考えてみましたが、マイクロソフト独特の問題で、マイクロソフトのもう一つの独特な属性「defer」を思い出しました.使用後、問題はすぐに解決されました.
これは参加してももとのコードは変更しなくてもいいです.各種ブラウザに対応しています.問題は解決します.
最後に、実はマイクロソフトのMSDNにはすでに解決方法が挙げられています.deferを使うことも含まれています.また一周回ったようです.自分でマイクロソフトのためにため息をつくことができないで、自分のした問題、自分の方法を使って解決して、最後に苦労したのはやはり私達です.えっと、
具体的なMSDNアドレス:
http://blogs.msdn.com/ie/archive/2008/04/23/what-happened-to-operation-aborted.aspx
公式の解決方法は以下の通りです.
1.Moving your script execution to a function that is invoked after parsing is coplete(e.g.onload)
2.Adding the defer bootlean atribute to the script block(this defers execution of the script content until parsing is comple)
3.Limiting your tree modifitions to the script-element's immediate parent
4.Moving the location of your script block to a child of the body.