Java Script извлекает объекты документа в бесконечном цикле - PullRequest
1 голос
/ 20 августа 2011

Я пишу код для добавления div в зависимости от набора «объекта», найденного в документе при нажатии кнопки.

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

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

Поместите точку останова в свой внутренний цикл for и проверьте значения j, i и getElementsByTagName ('object'). Length, а также swf [j] .getElementsByTagName ('param'). Length после первой итерации иопубликовать результаты.Попытайтесь получить свою длину вне петли (которая является хорошей практикой в ​​любом случае).Также используйте ключевое слово var в своих циклах:

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

Вы не добавляете больше тега объекта в ваш div и просто опускаете этот код?

2 голосов
/ 20 августа 2011

Я думаю, что проблема в том, что вы зацикливаетесь на длине динамического массива, возвращенного из getElementsByTagName('object'), а затем внутри этого цикла вы добавляете новый тег объекта, который увеличит массив, что приведет к расширению цикласнова, который добавит еще один объект, который снова будет расширять цикл - навсегда.Вы можете исправить это, не зацикливаясь на .length, но получая длину исходного массива и только зацикливаясь на этом.Вот и другие вещи, которые я предлагаю вам исправить.

  1. Используйте локальные переменные, а не глобальные переменные.
  2. Когда вы используете getElementsByTagName, они возвращают динамические массивы, которые могут изменяться по длине при манипулированиивещи.Надежнее выполнять цикл по начальной длине и, следовательно, никогда не иметь риска бесконечного цикла.
  3. Вы можете использовать document.body вместо document.getElementsByTagName('body')[0].
  4. Некоторые точки с запятой отсутствуют.

Вот исправленный код с этими фиксированными / защитными функциями.

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

При использовании любого из этих динамических массивов я всегда предварительно извлекаю длину массива в локальную переменную и зацикливаюсь начтобы избежать возникновения такой ситуации.

1 голос
/ 20 августа 2011

Здесь есть две вещи, которые вызывают у меня подозрение.

  • Единственное, что мне действительно кажется подозрительным, это следующая строка:

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

    Вы 'ре модификации DOM здесь.Что это за элемент, который вы здесь изменяете?

  • Структура вашего внешнего цикла:

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

    Его условие завершения предполагает, что swf.length не изменяется.

Я могу представить себе особую ситуацию, в которой эти две вещи могут столкнуться.Что если в итоге вы добавите каждый новый div прямо в элемент SWF?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...