Подтвердить что ты не робот

GetElementsByName в IE7

У меня есть код, который делает это:

 var changes = document.getElementsByName(from);
 for (var c=0; c<changes.length; c++) {
   var ch = changes[c];
   var current = new String(ch.innerHTML);
   etc.
 }

Это отлично работает в FF и Chrome, но не в IE7. Предположительно, потому что getElementsByName не работает в IE. Какое лучшее обходное решение?

4b9b3361

Ответ 1

Если вы не знаете, почему это не работает в IE, документация MSDN для этой функции:

Когда вы используете метод getElementsByName, все элементы в документе, у которых есть указанный атрибут NAME или значение атрибута ID, возвращаются.

Элементы, которые поддерживают атрибут NAME и атрибут ID, включаются в коллекцию, возвращаемую методом getElementsByName, но элементы с расширением NAME не включены в коллекцию; поэтому этот метод нельзя использовать для извлечения пользовательских тегов по имени.

Firefox позволяет getElementsByName() извлекать элементы, которые используют NAME expando, поэтому он работает. Независимо от того, является ли это Good Thing ™, может быть обсуждено, но это реальность.

Таким образом, один из вариантов заключается в использовании метода DMA getAttribute(), чтобы запросить атрибут NAME, а затем проверить значение, чтобы увидеть, это то, что вы хотите, и если да, добавьте его в массив. Это потребовало бы, однако, чтобы вы перебирали все узлы на странице или, по крайней мере, в подразделе, что было бы не самым эффективным. Вы можете заранее ограничить этот список, используя, возможно, что-то вроде getElementsByTagName().

Другим способом сделать это, если вы контролируете HTML-страницу страницы, является предоставление всем интересующим элементам идентификатора, который изменяется только по числу, например:

<div id="Change0">...</div>
<div id="Change1">...</div>
<div id="Change2">...</div>
<div id="Change3">...</div>

И тогда есть JavaScript вроде этого:

// assumes consecutive numbering, starting at 0
function getElementsByModifiedId(baseIdentifier) {
    var allWantedElements = [];
    var idMod = 0;
    while(document.getElementById(baseIdentifier + idMod)) { // will stop when it can't find any more
        allWantedElements.push(document.getElementById(baseIdentifier + idMod++));
    }
    return allWantedElements;
}

// call it like so:
var changes = getElementsByModifiedId("Change");

Это взломать, конечно, но он выполнит нужную вам работу и не будет слишком неэффективным по сравнению с некоторыми другими хаками.

Если вы используете какой-либо фреймворк/инструментарий JavaScript, ваши варианты намного лучше, но у меня нет времени на то, чтобы понять эти особенности, если вы не указали, что используете их. Лично я не знаю, как люди живут без них, они экономят так много времени, усилий и разочарований, что вы не можете позволить себе не использовать их.

Ответ 2

Есть несколько проблем:

  • IE действительно запутывает id="" с помощью name=""
  • name="" не разрешено на <span>

Чтобы исправить, я предлагаю:

  • Измените все name="" на class=""
  • Измените свой код следующим образом:

-

var changes = document.getElementById('text').getElementsByTagName('span');
for (var c=0; c<changes.length; c++) {
 var ch = changes[c];

 if (ch.className != from)
continue;

 var current = new String(ch.innerHTML);

Ответ 3

Не очень часто найти элементы, используя свойство NAME. Я бы рекомендовал переключиться на свойство ID.

Однако вы можете найти элементы с определенным именем, используя jQuery:

 $("*[name='whatevernameYouWant']");

это вернет все элементы с заданным именем.

Ответ 4

getElementsByName поддерживается в IE, но есть ошибки. В частности, он возвращает элементы, "id которых соответствует указанному значению, а также" имя ". Не могу определить, есть ли у вас проблема, у вас нет немного больше контекста, кода и фактических сообщений об ошибках.

В общем случае getElementsByName, вероятно, лучше избегать, потому что атрибут name в HTML имеет несколько перекрывающихся целей, которые могут смутить. Использование getElementById намного надежнее. Когда вы работаете с полями формы, вы можете более надежно использовать form.elements [имя] для поиска полей, которые вы ищете.

Ответ 6

У меня был успех, используя оболочку, чтобы вернуть массив элементов. Работает в IE 6 и 7 тоже. Имейте в виду, что это не 100% то же самое, что и document.getElementsByName, поскольку это не NodeList. Но для чего мне это нужно, то есть просто запустить цикл for в массиве элементов, чтобы делать простые вещи, такие как установка .disabled = true, он работает достаточно хорошо.

Несмотря на то, что эта функция все еще использует getElementsByName, она работает, если используется так. Посмотрите сами.

function getElementsByNameWrapper(name) {
  a = new Array();

  for (var i = 0; i < document.getElementsByName(name).length; ++i) {
    a.push(document.getElementsByName(name)[i]);
  }

  return a;
}

Ответ 7

Обход

                var listOfElements = document.getElementsByName('aName'); // Replace aName with the name you're looking for
            // IE hack, because it doesn't properly support getElementsByName
            if (listOfElements.length == 0) { // If IE, which hasn't returned any elements
                var listOfElements = [];
                var spanList = document.getElementsByTagName('*'); // If all the elements are the same type of tag, enter it here (e.g.: SPAN)
                for(var i = 0; i < spanList.length; i++) {
                    if(spanList[i].getAttribute('name') == 'aName') {
                        listOfElements.push(spanList[i]);
                    }
                }
            }