Индекс или размер отрицателен или превышает допустимую сумму (неотрицательные индексы) - PullRequest
3 голосов
/ 15 марта 2011

При использовании Firefox я получаю сообщение об ошибке, описанное в строке темы для этого блока кода:

for(var i = 0; i < tables.length; i++)
{
    var j = rows.length - 1;
    while(j--)
    {                   
        if(hideDP && tables[i].innerHTML.indexOf(">D<") != -1)
        {   
            if(!platTag && !soulSilverTag && pearlTag)
            {
                tables[i].deleteRow(j);//ERROR IS ON THIS LINE
            }
        }

    }//end while loop (rows)
}//end for loop (tables)

Я подозреваю, что это ошибка, потому что я несколько новичок в создании обратных циклов, но я специально сделал обратный цикл в этом случае, потому что это облегчило удаление строк из таблицы. Также обратите внимание, что j - это что-то вроде 24, а i - 0, поэтому они неотрицательны. Может ли кто-то пролить свет на это для меня?

РЕДАКТИРОВАТЬ: Полный код можно найти здесь .

Ответы [ 2 ]

5 голосов
/ 16 марта 2011

Строго отрабатывая код, размещенный в данный момент, вот проблемы, которые я вижу:

  1. Опубликованный код выглядит неполным.Где инициализируется rows?Это может вызвать указанную ошибку.

  2. Учитывая while(j--);Неверная строка var j = rows.length - 1;.То есть , если только вы не знаете, что последнюю строку никогда не нужно будет удалять.Но если это так, то закомментируйте код, чтобы прояснить его.

    Например, если было 4 строки, текущий код инициализирует j 3, но из-за расположения -- оператор, внутри цикла видит: 2, 1, 0. Для кода, как показано, используйте var j = rows.length; или добавьте комментарий, чтобы показать, что логика преднамеренная.

  3. Операторы 2 if() вообще не зависят от j!(По крайней мере, поскольку код размещен здесь.) Если это так, переместите условные выражения за пределы цикла j.

  4. Рассмотрите возможность размещения полного неотредактированного кода.Или ссылка на него на сайте, например Pastebin .



Обновление для полного скрипта, теперь, когда он связан с:

Сканируя полный код, похоже, что tables[i].deleteRow(j); можно вызывать несколько раз для одной и той же строки.

Самое простое решение, которое следует сделать в любом случае, это добавить continue оператор после каждой строки удалить.

Для дополнительного кредита, повторно проанализируйте и упростите флаг, а также if логику.:)



Обновление для целевой страницы, теперь, когда она связана с:

При проверке целевой страницы таблицы, зацикленные этим сценарием, содержат вложенные таблицы.

Это отбрасывает количество строк в этой строке:
var rows = tables[i].getElementsByTagName("tr");

Иногда создается впечатление, что таблица [i] имеет больше строк, чем она имеет непосредственно.

Решение, использовать встроенный массив строк;поэтому строка выглядит следующим образом: var rows = tables[i].rows;

~~~~
При рассмотрении сценария относительно целевой страницы, некоторые другие проблемы казались очевидными:

  1. Не лучше перебирать все таблицы.Нацеливайтесь только на те, которые вам нужны.Итак, это:
    tables = document.getElementsByTagName("table");

    Должно быть изменено на:

    var tables = document.querySelectorAll ("div.KonaBody > table.roundy");
    

    ..., которое выберет только 4 таблицы полезной нагрузки, а не их подтаблицы или другие разбросанные таблицыо.

  2. При точной настройке начального выбора таблицы следующий пробламатический тест не требуется:

    if(tables[i].getAttribute("style").indexOf("border: 3px solid") != -1)
    
  3. Отсутствует var inпередняя часть majorSections инициализации.
0 голосов
/ 15 марта 2011

Эта ошибка также будет сгенерирована, если j>> к количеству строк в таблице, но я не вижу точной проблемы.

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