Javascript以无限循环方式获取Document对象

时间:2011-08-20 18:36:55

标签: javascript javascript-objects

我正在编写一个代码来添加一个div,具体取决于单击按钮时文档中的一组“对象”。

当Document.getElementsByTagName('object'); 只有一个对象,但它会进入无限循环!给我增加的swf.length值在警报中无限增加1。 你能帮我做错了吗?

<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>

3 个答案:

答案 0 :(得分:2)

在你的内部for循环中放置一个断点并检查j,i和getElementsByTagName('object')。length的值以及swf [j] .getElementsByTagName('param')。第一次迭代后的长度和发布结果。尝试让你的长度超出循环(这无论如何都是好的做法)。也可以在循环中使用var关键字:

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

你没有在你的div中添加更多的对象标签,只是省略了你的代码?

答案 1 :(得分:2)

我认为问题在于你循环从getElementsByTagName('object')返回的动态数组的长度,然后在该循​​环内你添加一个新的对象标记,这将增加将导致循环的数组再次扩展将添加另一个将再次扩展循环的对象 - 永远。您可以通过不循环.length来解决这个问题,但是通过获取初始数组的长度并仅循环它。以下是我建议您解决的其他事项。

  1. 使用局部变量,而不是全局变量。
  2. 当您使用getElementsByTagName时,它们会返回动态数组,这些数组在操作时可能会发生长度变化。循环初始长度更安全,因此永远不会有无限循环风险。
  3. 您可以使用document.body代替document.getElementsByTagName('body')[0]
  4. 一些半冒号失踪。
  5. 这是固定代码,其中包含这些固定/保护。

    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*/
    

    当使用这些动态数组中的任何一个时,我总是将数组的长度预取到一个局部变量中并在其上循环以避免每一个都出现这种情况。

答案 2 :(得分:1)

这里有两件事令我怀疑。

  • 对我来说唯一看起来很可疑的是以下几行:

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

    你在这里修改DOM。你在这里修改的元素是什么?

  • 外环的结构:

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

    它的终止条件假定swf.length不会改变。

我可以想象这两件事可能发生冲突的特殊情况。如果您最终将每个新div附加到SWF元素中该怎么办?