Постоянное имя флажка из JS заставляет IE работать медленно, а не FF? - PullRequest
0 голосов
/ 09 июля 2009

У меня есть список флажков. Для отмеченных флажков я изменяю его имя перед отправкой. В ФФ функция работает. В IE я получаю:

Сценарий на этой странице вызывает медленную работу Internet Explorer. Если оно продолжает работать, ваш компьютер может перестать отвечать.

Хотите отменить сценарий? ДА / НЕТ

Не знаете, почему этот цикл вызывает проблемы в IE, а не в FF?

 function sub()
{

    var x=document.getElementsByName("user");
    for (i = 0; i < x.length; i++) //for all check boxes
    {
        if (x[i].checked == true)
        {
            x[i].name="id"; //change name of data so we know it is for an id
            //By renaming the first element of the list, we have reduced the length of the list by one 
            //and deleted the first element. This is why we need to keep i at it's current position after a name change.
            i=i-1;  
        }

    }//end for

    document.checks.submit();

}

Ответы [ 4 ]

2 голосов
/ 09 июля 2009

Я бы не стал писать такой скрипт - это похоже на цикл for / i ++, вызывающий функцию, которая изменяет индекс как побочный эффект - непредсказуемый. Вы запускаете итератор через NodeList, изменяя список внутри цикла. Вы не можете быть уверены, что это работает, пока не узнаете, как именно реализован NodeList.

Это неприятно, но я сначала скопировал бы список в «настоящий» массив, а затем сделал бы переименование.

1 голос
/ 09 июля 2009

Это должно работать как со списком, так и без него.

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

 function sub()
{

    var x=document.getElementsByName("user");
    var nodesToChangeIndex=0;
    var nodesToChange=new Array();
    for (i = 0; i < x.length; i++) //for all check boxes
    {
        if (x[i].checked == true)
        {
                nodesToChange[nodesToChangeIndex++] = x[i];
        }

    }//end for

    for(i=0; i < nodesToChangeIndex; i++)
    {
        nodesToChange[i].name="id";
    }
    document.checks.submit();

}
1 голос
/ 09 июля 2009

Internet Explorer глючит. Он не возвращает живой список узлов, а просто снимок.

Использование фреймворка, такого как jQuery, - лучший выбор для достижения полной совместимости.

0 голосов
/ 09 июля 2009

Редактировать: Это неправильно, Ник прав. Хотя мне бы очень хотелось убедиться, что IE на самом деле правильно реализует NodeList, поскольку все равно звучит так, как будто вы работаете с бесконечным циклом в IE.

Спасибо за внимание, Ник, сегодня я узнал что-то новое. Javascript не перестает меня удивлять:)


Простое переименование элемента в массиве не приведет к его удалению из массива - getElementsByName не запускается постоянно, только в начальный момент его вызова. Так что IE застрял в бесконечном цикле, где он продолжает проверять один и тот же проверенный элемент снова и снова. Я, честно говоря, не уверен, почему Firefox также не застревает в одном и том же бесконечном цикле.

Насколько я понимаю, строка i=i-1 совершенно не нужна.

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