getElementsByClassName() не работает в старых Internet Explorer, таких как IE6, IE7, IE8.

Следующий код:

var borderTds = document.getElementsByClassName('leftborder');

дает мне сообщение об ошибке в Internet Explorer 6, 7 и 8:

Объект не поддерживает этот метод

Как я могу выбрать элементы по их классу в этих браузерах?

Я предпочитаю не использовать JQuery.


person code511788465541441    schedule 05.07.2011    source источник
comment
возможный дубликат getElementsByClassName и IE   -  person Felix Kling    schedule 05.07.2011
comment
Я думаю, что jQuery поддерживает такую ​​​​функциональность.   -  person ChaosPandion    schedule 05.07.2011
comment
Альтернативой использованию jQuery может быть просто использование механизма выбора Sizzle. Но если все, что вам нужно, это выбрать по классу, то я бы просто написал замену.   -  person user113716    schedule 05.07.2011
comment
@ChaosPandion: Я предпочитаю не использовать JQuery.   -  person Felix Kling    schedule 05.07.2011


Ответы (5)


Это решение может помочь. Это пользовательская функция getElementsByClassName, реализованная на чистом javascript, которая работает в IE.

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

  1. Родная функция document.getElementsByClassName.
  2. document.evaluate, которая позволяет оценивать запросы XPath.
  3. Обход дерева DOM.

Конечно, первый является лучшим с точки зрения производительности, однако последний должен быть доступен везде, включая IE 6.

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

getElementsByClassName("col", "div", document.getElementById("container")); 

Таким образом, функция допускает 3 параметра: класс (обязательный), имя тега (необязательный, ищет все теги, если не указан), корневой элемент (необязательный, документ, если не указан).

Обновление. Решение, указанное в сообщении блога, размещено в Google Code, который закрывается в январе 2016 года. Однако автор сделал его доступным на GitHub. Престижность flodin, указывающему на это в комментариях.

person Andrei    schedule 05.07.2011
comment
-1 просто за публикацию ссылки. В соответствии с часто задаваемыми вопросами ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели некоторое представление о том, что это такое и почему оно там. Всегда цитируйте наиболее релевантную часть важной ссылки на случай, если целевой сайт недоступен или навсегда отключится. - person codemonkeh; 30.06.2014
comment
@codemonkeh, не могу не согласиться, так что давайте его улучшать! Обновил пост. Это выглядит лучше? - person Andrei; 01.07.2014
comment
Примечание для будущих посетителей: связанное решение размещено в Google Code, который закрывается, но первоначальный автор переместил его в Гитхаб. - person flodin; 22.03.2015
comment
@flodin, спасибо, что заметили это, обновил пост для большей наглядности. - person Andrei; 23.03.2015

IE6, Netscape 6+, Firefox и Opera 7+ скопируйте на свою страницу следующий скрипт:

document.getElementsByClassName = function(cl) {
  var retnode = [];
  var elem = this.getElementsByTagName('*');
  for (var i = 0; i < elem.length; i++) {
    if((' ' + elem[i].className + ' ').indexOf(' ' + cl + ' ') > -1) retnode.push(elem[i]);
  }
  return retnode;
}; 
person Peter    schedule 05.07.2011
comment
На самом деле использование \b может привести к проблемам с классами, содержащими -. Лучше добавить пробелы: if((' ' + elem[i].className + ' ').indexOf(' ' + cl + ' ') > -1).... Это метод, который использует jQuery. - person Felix Kling; 05.07.2011
comment
Я застрял, работая в IE6. Кажется, в IE6 нет .indexOf(), как показывает ваш код. Пришлось сделать краткую замену функции: function indexOf(Arr, Match) { var Result = -1; вар я; for (i=0; i ‹ Arr.length; i++) { if (Arr[i] != Match) continue; Результат = я; ломать; } вернуть результат; } - person kdtop; 13.01.2016

Метод не существует в IE6. Если вы хотите выбрать элементы по классу и не хотите использовать библиотеку, вам просто нужно перебрать все элементы на странице и проверить наличие класса в их свойстве className.

function getElementsByClassName(className) {
  var found = [];
  var elements = document.getElementsByTagName("*");
  for (var i = 0; i < elements.length; i++) {
    var names = elements[i].className.split(' ');
    for (var j = 0; j < names.length; j++) {
      if (names[j] == className) found.push(elements[i]);
    }
  }
  return found;
}

Демонстрация: http://jsfiddle.net/kYdex/1/

person Guffa    schedule 05.07.2011

Internet Explorer 8 и более ранние версии не поддерживают getElementsByClassName(). Если вам нужно решение только для IE8, оно поддерживает querySelectorAll(), вместо этого вы можете использовать один из них. Для более старых IE вы должны предоставить свою собственную реализацию, а для некоторых других старых браузеров, которые ее поддерживают, вы также можете использовать evaluate(), который запускает выражения XPath.

Этот код предоставляет метод document.getElementsByClassName, если он еще не существует, используя методы, которые я описал:

if (!document.getElementsByClassName) {
  document.getElementsByClassName = function(search) {
    var d = document, elements, pattern, i, results = [];
    if (d.querySelectorAll) { // IE8
      return d.querySelectorAll("." + search);
    }
    if (d.evaluate) { // IE6, IE7
      pattern = ".//*[contains(concat(' ', @class, ' '), ' " + search + " ')]";
      elements = d.evaluate(pattern, d, null, 0, null);
      while ((i = elements.iterateNext())) {
        results.push(i);
      }
    } else {
      elements = d.getElementsByTagName("*");
      pattern = new RegExp("(^|\\s)" + search + "(\\s|$)");
      for (i = 0; i < elements.length; i++) {
        if ( pattern.test(elements[i].className) ) {
          results.push(elements[i]);
        }
      }
    }
    return results;
  }
}

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

person kapa    schedule 31.07.2014

Если getElementsByClassname не поддерживает, это ошибка в некоторых старых браузерах. Просто попробуйте var modal = document.getElementById('myModal'); modal.onclick= function(){ Затем выполните любую функцию onclick или другую функцию, используя getElementById modal.style.display = "none"; }

person user1214683    schedule 17.02.2017