小議IE8下的KB927917錯誤


  日前,在進行JS測試的時候,不巧碰到了IE8下的KB927917的錯誤。在網絡上搜尋了一番之后,結合實際,給出了自己的解決方案。下面用示例來說明。

  先看看下面的示例一的網頁代碼:

 

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< 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的閉合就可以了。

  下面是示例二的網頁代碼

 

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< 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已經閉合。

  下面是示例三的網頁代碼:

 

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< 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瀏覽,該錯誤也似乎被修正,這是什么原因,也就沒有深究了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM