Nano Hash - криптовалюты, майнинг, программирование

Рекурсивная функция JavaScript для обхода разрывов DOM в IE8

Я воздержался от публикации здесь, так как я не чувствую, что у меня еще есть уровень навыков, чтобы отдать должное сообществу, но это меня полностью поставило в тупик.

У меня есть рекурсивная функция JavaScript, которая добавляет счетчик в конец всех элементов id и name в дереве узлов. Функция работает в FF, Chrome, Safari и IE9, но не в IE8.

function counterAppend(nodes,counter)
{
    var newField = nodes.childNodes;
    for (var i=0;i<newField.length;i++)
    {
        var theName = newField[i].name;
        if (theName)
        {
            newField[i].name = theName + counter;
        }
        var theId = newField[i].id;
        if (theId)
        {
            newField[i].id = theId + counter;
        }

        //recursive part
        if(newField[i].childNodes.length>0)
        {
            newField[i] = counterAppend(newField[i],counter);
        }
    }
    return nodes;
}

Я получаю сообщение об ошибке в строке: newField[i] = counterAppend(newField[i],counter);

В отладке он говорит: Прерывание ошибки времени выполнения JS - объект не поддерживает это свойство или метод

В чем разница между IE8 и другими браузерами и как я могу изменить это, чтобы обойти ошибку?


  • Возможно, это может помочь: forums.devshed.com /javascript-разработка-115/ 15.12.2012
  • это, вероятно, как-то связано с тем фактом, что childNodes дает вам NodeList, а не массив. 15.12.2012
  • У меня такие же мысли, как у @jbabey. Попробуйте преобразовать NodeList в массив. Здесь вы можете найти примеры. Для IE8 for loop выглядит лучшим вариантом. 15.12.2012
  • почему вы должны повторно воздействовать на возврат counterAppend? По-видимому, вам нужно изменить только имена и идентификаторы, поэтому эта аффектация не является обязательной. 15.12.2012
  • @jbabey - разве мне не нужен NodeList, если дерево, которое я изменяю, глубже слоя? 15.12.2012
  • @ user1905055 такие вещи, как .length и [i], могут не работать с NodeList во всех браузерах. это поведение массива. 15.12.2012
  • Он не мог использовать for...in? bonsaiden.github.com/JavaScript-Garden/#object.forinloop 15.12.2012

Ответы:


1

Почему вы назначаете возврат функции обратно через newField[i]? Я понятия не имею, чего вы ожидаете от этого. Если код просто изменяет идентификаторы/имена, вам не нужно возвращаемое значение. Я должен думать, что именно это сбивает с толку IE, я не уверен, почему это не сбивает с толку другие браузеры...

14.12.2012
  • Работает! Спасибо. Я не понимал, что функция влияет на исходную переменную, а не создает другую локальную переменную с тем же именем. 15.12.2012

  • 2

    Вопросы. Кроме того, проверяли ли вы, когда получаете сообщение об ошибке? Сколько раз вы выполняете цикл, если вообще делаете это, прежде чем получите сообщение об ошибке? Попробуйте несколько операторов вывода.

    Некоторые альтернативные алгоритмы обхода DOM: getElementsByTagName() эквивалентны для текстовых узлов

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

    IE не включает текстовые узлы, содержащие только пробелы, в список узлов childNodes, как это делают другие браузеры. Я предлагаю вместо этого использовать getElementsByTagName(). Таким образом, вам также не нужно вручную проходить каждый уровень узлов в вашем коде.

    через http://www.quirksmode.org/dom/w3c_core.html.

    Most browsers will correctly view the blank space between tags as a text node containing only white space characters (such as space, line-break or tab), even if the blank space is not rendered, such as a gap in between a tag and a tag or a blank gap in between

    tags. However, some browsers (mainly Internet Explorer 8-, and 9+ in quirks mode) will not view this empty space as a text node at all.

    через http://www.howtocreate.co.uk/tutorials/javascript/dombasics

    14.12.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..