26.11.2015, 18:27
|
Аспирант
|
|
Регистрация: 11.10.2010
Сообщений: 60
|
|
Лучшая эмуляция getElementsByClassName для IE8 на ваш взгляд
Добрый вечер!
Собственно весь вопрос в названии темы. В интернетах нашел несколько вариантов, но так как я в JS не очень силен, то не знаю какой вариант более оптимальный. Да и мнения расходятся. А какую реализацию используете вы и (самое главное!) почему именно её?
|
|
26.11.2015, 18:29
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
eddin, getElementsByClassName никогда не использую. Всегда использую эту конструкцию:
document.querySelectorAll('.className');
Работает в IE8+
Лично мне удобнее использовать именно querySelector, особенно когда нужно получить только первый элемент:
var elem = document.querySelector('.className');
Получать всю коллекцию элементов надобность очень редкая, так как всё реализовываю нормальным способом.
Последний раз редактировалось ruslan_mart, 26.11.2015 в 18:32.
|
|
26.11.2015, 19:04
|
Аспирант
|
|
Регистрация: 11.10.2010
Сообщений: 60
|
|
Ruslan_xDD, спасибо за ответ!
Да, этот вариант я тоже находил. Пишут, что он более ресурсоемкий по сравнению с getElementsByClassName.
Вот подумалось. А есть ли в JS возможность всем современным браузерам подставить под обработку getElementsByClassName, а для IE8+ querySelectorAll. Ну что-то типа условных комментариев в HTML.
Конечно можно (возможно, всё же я JS плохо знаю) с теми самыми коментариями и заморочиться, но по моему это будет совсем извращение. Да и плюс глобальные переменные придется объявлять походу...
|
|
26.11.2015, 19:12
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
А нужно ли? Ведь IE8 уже умер.
if(!document.getElementsByClassName) { //Теперь в IE8 есть getElementsByClassName
document.getElementsByClassName = Element.prototype.getElementsByClassName = function(className) {
return this.querySelectorAll('.' + className.replace(/\s+/g, '.'));
}
}
Последний раз редактировалось ruslan_mart, 26.11.2015 в 19:14.
|
|
26.11.2015, 19:51
|
Аспирант
|
|
Регистрация: 11.10.2010
Сообщений: 60
|
|
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, форум подсказывает, что у вас сегодня День рождения!
От лица всех участников поздравляю вас с этим событием! Желаю всего самого лучшего! Пусть все ваши стремления оперативно перерастут в достижения! И спасибо вам за вашу помощь нам и поддержку такого замечательного сайта!
|
|
26.11.2015, 20:12
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
eddin, Вы меня не поняли. Код выше, который я дал, он встроит getElementsByClassName в IE8, не нужны никакие условия, просто вставьте код в head и пользуйтесь getElementsByClassName на здоровье.
Ну, а если серьёзно, то все эти извращения не нужны, просто используйте везде querySelectorAll, он мощнее и удобнее.
А за поздравления спасибо.
|
|
26.11.2015, 20:30
|
Аспирант
|
|
Регистрация: 11.10.2010
Сообщений: 60
|
|
Сообщение от Ruslan_xDD
|
просто вставьте код в head и пользуйтесь getElementsByClassName
|
Точно! Получилось, спасибо!)
Ruslan_xDD, а как можно научить IE8 вот такому?
window.addEventListener('resize',setHeight);
Я пробовал вот так:
window.attachEvent('onresize', setHeight);
и так:
window.attachEvent('onresize', function(){setHeight();});
не работает...
|
|
26.11.2015, 20:41
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Например, так:
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 добавить.
Последний раз редактировалось ruslan_mart, 26.11.2015 в 20:58.
|
|
26.11.2015, 20:51
|
Аспирант
|
|
Регистрация: 11.10.2010
Сообщений: 60
|
|
Ruslan_xDD, спасибо! Буду разбираться)
|
|
18.01.2017, 17:40
|
Интересующийся
|
|
Регистрация: 08.09.2012
Сообщений: 10
|
|
Ничерта это в IE8 НЕ РАБОТАЕТ.
-----------------------------
querySelectorAll, равно как и querySelector
"Object doesn't support this property or method" (IE8 Сборка 8.0.6001.18702)
Равно как и код через прототип Element выдаёт ошибку "Element is undefined". Объект Element в IE8 отсутствует.
Последний раз редактировалось boor1, 18.01.2017 в 17:42.
|
|
|
|