日前,在進行JS測試的時候,不巧碰到了IE8下的KB927917的錯誤。在網絡上搜尋了一番之后,結合實際,給出了自己的解決方案。下面用示例來說明。
先看看下面的示例一的網頁代碼:
< html xmlns ="http://www.w3.org/1999/xhtml">
< head >
< title >KB927917 </ title >
</ head >
< body >
< div id ="GrandFather">
< div id ="Uncle">This is Uncle </ div >
< div id ="Father">
< script type ="text/javascript" >
function $(Id){ return document.getElementById(Id);}
document.write( '<div id="Nephew">This is Nephew</div>');
$( 'GrandFather').appendChild($( 'Nephew'));
</ script >
</ div >
</ div >
</ body >
</ html >
這段示例代碼很簡單,在id為Father的div中,用JS生成一個id為Nephew的div,並將該div添加為id為GrandFather的div的子元素。
然而,這段代碼在IE8下瀏覽,瀏覽器報了KB927917的錯誤。該錯誤所示如下:
HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)
我對該段英文的理解是:在子元素閉合之前不能對其父容器元素進行修改
上面的示例代碼,JS的代碼是放在id為Father的div中,在執行JS代碼時,該div還沒有閉合。此時JS試圖添加子元素到其父容器(id為GrandFather的div)時,就引發了KB927917的錯誤。
雖然上面的代碼在IE8下會報KB927917的錯誤,但是渲染還是正常的。然而,筆者在測試其他網頁的時候,由於該錯誤,導致頁面的按鈕失效。因此,還是要想辦法解決該問題。
網上提到該錯誤的時候,幾乎都是提到一種解決方案,將JS代碼移到Body標簽的后面。經過筆者的實驗,發現將JS代碼移到id為GrandFather的div外面就可以了。也就是JS代碼的執行不影響div的閉合就可以了。
下面是示例二的網頁代碼
< html xmlns ="http://www.w3.org/1999/xhtml">
< head >
< title >KB927917 </ title >
</ head >
< body >
< div id ="GrandFather">
< div id ="Uncle">This is Uncle </ div >
< div id ="Father">
</ div >
</ div >
< script type ="text/javascript" >
function $(Id){ return document.getElementById(Id);}
document.write( '<div id="Nephew">This is Nephew</div>');
$( 'GrandFather').appendChild($( 'Nephew'));
</ script >
</ body >
</ html >
上面的示例代碼就解決了IE8下的KB927917的錯誤。而沒必要將JS代碼放置在Body的標簽后面。
再回看示例一的代碼。在JS代碼執行的時候,id為Father的div沒有閉合,而其父容器id為GrandFather的div此時也沒有閉合。我突然想到,是不是id為GrandFather的div沒有閉合才是引發KB927917錯誤的主要原因。為此,做了一個實驗,修改了一下代碼,將原本“添加為id為GrandFather的div的子元素”改成“添加為id為Uncle的div的子元素”。因為在執行這段JS的代碼時,id為GrandFather的div沒有閉合,而id為Uncle的div已經閉合。
下面是示例三的網頁代碼:
< html xmlns ="http://www.w3.org/1999/xhtml">
< head >
< title >KB927917 </ title >
</ head >
< body >
< div id ="GrandFather">
< div id ="Uncle">This is Uncle </ div >
< div id ="Father">
< script type ="text/javascript" >
function $(Id){ return document.getElementById(Id);}
document.write( '<div id="Nephew">This is Nephew</div>');
$( 'Uncle').appendChild($( 'Nephew'));
</ script >
</ div >
</ div >
</ body >
</ html >
測試這段代碼,一切正常。這也印證我之前的判斷——id為GrandFather的div沒有閉合才是引發KB927917錯誤的主要原因
經過上面的測試,可以總結為,當JS試圖修改一個沒有閉合的元素的時候,會引發KB927917的錯誤。
最后說兩句題外話,同樣的示例一的網頁在IE9下瀏覽正常,似乎IE9自動修正該錯誤。網上說,該錯誤在IE7和IE6會引發長時間的讀取動作,就像死機了一樣,我沒有測試,不好評說。另,在VS2008中直接啟動用IE8瀏覽,該錯誤也似乎被修正,這是什么原因,也就沒有深究了。
