2011-08-20 26 views
1

我正在編寫一個代碼來添加一個div,具體取決於單擊按鈕時在文檔中找到的一組「對象」。Java腳本在無限循環中提取文檔對象

當Document.getElementsByTagName('object'); 只有一個對象,但它進入無限循環!讓我在警報中無限增加swf.length的遞增值。 你能幫我做什麼錯嗎?

<script> 
function get2(){ 
    var swf = document.getElementsByTagName('object'); 
    for (j=0;j<swf.length ;j++) 
    { 
     alert(swf.length); 
     var objs = swf[j].getElementsByTagName('param'); 
     for(i=0;i<objs.length;i++){ 
      id = objs[i].getAttribute('name'); 
      if (id == 'src'){ 
       source = objs[i].getAttribute('value') 
       dv = document.createElement('div'); 
       dv.setAttribute('id','myContent'); 
       dv.setAttribute('border','2'); 

       document.getElementsByTagName('body')[0].appendChild(dv); 
       /* code to embed a new swf object in new Div*/ 

      }/*if*/ 
     }/*for*/ 
    }/*outer for*/ 
}/*function*/ 

這裏是HTML部分:

<body> 


<div id="old"> 
</br><h1> Hello </h1> 

<object id="myId1" width="250" height="250" name="movie1" classid="clsid:d27cdb6e-ae6d- 11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"><param name="src" value="whitebird.swf"> 
</object> 
<h1> welcome to flash</h1> 

</div> 
</br> 
<input type="button" onclick="get2()" value="Insert"/> 
</body> 
+0

你會發布html嗎? – TheVillageIdiot

+0

這裏的變量id,i和j是全局的。你可能不希望這樣。 – dyoo

+0

我試圖讓我和j本地,它沒有工作。 – Anna

回答

2

在你的inner for循環中放置一個斷點並檢查j,i和getElementsByTagName('object')。的長度以及第一次迭代之後的swf [j] .getElementsByTagName('param')。length併發布結果。嘗試讓你的長度在循環之外(無論如何,這是一個很好的練習)。還可以使用var關鍵字在你的循環:

var objectLength = swf.length; 
for (var j = 0; j < objectLength; j++) 
{ 
    ... 
} 

你是不是在你的DIV增加更多的對象標記,只是省略了代碼是你嗎?

+0

是的,我沒有刪除嵌入代碼!謝謝你,傑森,你救了我的一天!它的作品,現在沒有無限循環!我感謝您的幫助!有一個愉快的週末:) – Anna

1

這裏有兩件事情,讓我懷疑。

  • 看起來真的懷疑我的唯一的事情是以下行:

    document.getElementsByTagName('body')[0].appendChild(dv); 
    

    你在這裏修改DOM。你在這裏修改的是什麼元素?

  • 您外環的結構:

    for (j=0; j<swf.length; j++) { ... } 
    

    它的終止條件假定swf.length不會改變。

有一種特殊的情況,我可以想象這兩件事會發生什麼衝突。如果您最終將每個新的div添加到SWF元素中,該怎麼辦?

+0

我在下添加div,並在其中嵌入swf。它的工作原理是,只有當它無限循環時,現在隨着Jason的幫助它被修復了。感謝您的意見! – Anna

+0

啊。是的,這是有道理的。所以這就是「/ *代碼在新的Div * /」中嵌入新的swf對象的原因。是的,getElementsByTagName是活的。因此,您添加的每個SWF都會自動成爲您正在迭代的集合的一部分。請參閱:https://developer.mozilla.org/en/DOM/element.getElementsByTagName – dyoo

2

我認爲問題在於你循環的從getElementsByTagName('object')返回的動態數組的長度,然後在該循​​環內添加一個新的對象標記,這將增加數組,這將導致循環再次延長這將添加另一個對象,將再次擴展循環 - 永遠。你可以通過不在.length上循環來解決這個問題,但是通過獲得初始數組的長度並且僅在這個循環上循環。以下是我建議你修復的其他事情。

  1. 使用局部變量而不是全局變量。
  2. 當您使用getElementsByTagName時,它們將返回動態數組,這些動態數組在您操作事物時可以更改長度。在初始長度上循環更安全,因此永遠不會有無限循環風險。可以使用document.body而不是document.getElementsByTagName('body')[0]
  3. 缺少一些分號碼。

這是固定的代碼,它有這些固定/保護。

function get2(){ 
    var swf = document.getElementsByTagName('object'); 
    for (var j = 0, len = swf.length; j < len ; j++) 
    { 
     var objs = swf[j].getElementsByTagName('param'); 
     for(var i=0, oLen = objs.length; i < oLen; i++){ 
      var id = objs[i].getAttribute('name'); 
      if (id == 'src'){ 
       var source = objs[i].getAttribute('value'); 
       var dv = document.createElement('div'); 
       dv.setAttribute('id','myContent'); 
       dv.setAttribute('border','2'); 

       document.body.appendChild(dv); 
       /* code to embed a new swf object in new Div*/ 

      }/*if*/ 
     }/*for*/ 
    }/*outer for*/ 
}/*function*/ 

當使用任何這些動態陣列,我總是預取所述陣列的長度到一個局部變量和環上,爲了避免每一個具有這種情況。

+0

這個信息非常有用,謝謝! – Anna