Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Лучшая эмуляция getElementsByClassName для IE8 на ваш взгляд (https://javascript.ru/forum/dom-window/59790-luchshaya-ehmulyaciya-getelementsbyclassname-dlya-ie8-na-vash-vzglyad.html)

eddin 26.11.2015 18:27

Лучшая эмуляция getElementsByClassName для IE8 на ваш взгляд
 
Добрый вечер!
Собственно весь вопрос в названии темы. В интернетах нашел несколько вариантов, но так как я в JS не очень силен, то не знаю какой вариант более оптимальный. Да и мнения расходятся. А какую реализацию используете вы и (самое главное!) почему именно её?

ruslan_mart 26.11.2015 18:29

eddin, getElementsByClassName никогда не использую. Всегда использую эту конструкцию:

document.querySelectorAll('.className');


Работает в IE8+

Лично мне удобнее использовать именно querySelector, особенно когда нужно получить только первый элемент:

var elem = document.querySelector('.className');


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

eddin 26.11.2015 19:04

Ruslan_xDD, спасибо за ответ!
Да, этот вариант я тоже находил. Пишут, что он более ресурсоемкий по сравнению с getElementsByClassName.

Вот подумалось. А есть ли в JS возможность всем современным браузерам подставить под обработку getElementsByClassName, а для IE8+ querySelectorAll. Ну что-то типа условных комментариев в HTML.

Конечно можно (возможно, всё же я JS плохо знаю) с теми самыми коментариями и заморочиться, но по моему это будет совсем извращение. Да и плюс глобальные переменные придется объявлять походу...

ruslan_mart 26.11.2015 19:12

А нужно ли? Ведь IE8 уже умер.

if(!document.getElementsByClassName) { //Теперь в IE8 есть getElementsByClassName
     document.getElementsByClassName = Element.prototype.getElementsByClassName = function(className) {
           return this.querySelectorAll('.' + className.replace(/\s+/g, '.'));
     }
}

eddin 26.11.2015 19:51

Ruslan_xDD, спасибо! (форум вам карму не дает поднять, говорит нельзя подряд неск. раз, надо сначала кому-нибудь другому это сделать...)
вот так сделал, чтобы ошибка в IE не выскакивала:
if(document.getElementsByClassName){
   var action_title = action_list.getElementsByClassName('action_title');
}
else {
   var action_title = action_list.querySelectorAll('.action_title');
}

Насчет IE8 не соглашусь, тк периодически вижу машины с XP, как правило в офисах, а иногда и дома. Правда дома это обычно "второй" комп, который стал таковым после покупки нового, но всё же его тоже активно используют...

Кстати, Ruslan_xDD, форум подсказывает, что у вас сегодня День рождения!:)
От лица всех участников поздравляю вас с этим событием! Желаю всего самого лучшего! Пусть все ваши стремления оперативно перерастут в достижения! И спасибо вам за вашу помощь нам и поддержку такого замечательного сайта!:victory:

ruslan_mart 26.11.2015 20:12

eddin, Вы меня не поняли. :) Код выше, который я дал, он встроит getElementsByClassName в IE8, не нужны никакие условия, просто вставьте код в head и пользуйтесь getElementsByClassName на здоровье. ;)

Ну, а если серьёзно, то все эти извращения не нужны, просто используйте везде querySelectorAll, он мощнее и удобнее.

А за поздравления спасибо. :)

eddin 26.11.2015 20:30

Цитата:

Сообщение от Ruslan_xDD (Сообщение 397796)
просто вставьте код в head и пользуйтесь getElementsByClassName

Точно! Получилось, спасибо!)
Ruslan_xDD, а как можно научить IE8 вот такому?
window.addEventListener('resize',setHeight);

Я пробовал вот так:
window.attachEvent('onresize', setHeight);

и так:
window.attachEvent('onresize', function(){setHeight();});

не работает...

ruslan_mart 26.11.2015 20:41

Например, так:

if(!window.addEventListener) {
    window.addEventListener = document.addEventListener = Element.prototype.addEventListener = function(type, callback) {
         var self = this;
         this.attachEvent('on' + type, function() {
             callback.call(self, window.event);
         });
    };
}


На скорую руку написал. Ещё нужно для removeEventListener полифил написать, ну и target в event добавить.

eddin 26.11.2015 20:51

Ruslan_xDD, спасибо! Буду разбираться)

boor1 18.01.2017 17:40

Ничерта это в IE8 НЕ РАБОТАЕТ.
-----------------------------

querySelectorAll, равно как и querySelector

"Object doesn't support this property or method" (IE8 Сборка 8.0.6001.18702)


Равно как и код через прототип Element выдаёт ошибку "Element is undefined". Объект Element в IE8 отсутствует.


Часовой пояс GMT +3, время: 07:33.