Лучшая эмуляция getElementsByClassName для IE8 на ваш взгляд
Добрый вечер!
Собственно весь вопрос в названии темы. В интернетах нашел несколько вариантов, но так как я в JS не очень силен, то не знаю какой вариант более оптимальный. Да и мнения расходятся. А какую реализацию используете вы и (самое главное!) почему именно её? |
eddin, getElementsByClassName никогда не использую. Всегда использую эту конструкцию:
document.querySelectorAll('.className');
Работает в IE8+ Лично мне удобнее использовать именно querySelector, особенно когда нужно получить только первый элемент:
var elem = document.querySelector('.className');
Получать всю коллекцию элементов надобность очень редкая, так как всё реализовываю нормальным способом. |
Ruslan_xDD, спасибо за ответ!
Да, этот вариант я тоже находил. Пишут, что он более ресурсоемкий по сравнению с getElementsByClassName. Вот подумалось. А есть ли в JS возможность всем современным браузерам подставить под обработку getElementsByClassName, а для IE8+ querySelectorAll. Ну что-то типа условных комментариев в HTML. Конечно можно (возможно, всё же я JS плохо знаю) с теми самыми коментариями и заморочиться, но по моему это будет совсем извращение. Да и плюс глобальные переменные придется объявлять походу... |
А нужно ли? Ведь IE8 уже умер.
if(!document.getElementsByClassName) { //Теперь в IE8 есть getElementsByClassName
document.getElementsByClassName = Element.prototype.getElementsByClassName = function(className) {
return this.querySelectorAll('.' + className.replace(/\s+/g, '.'));
}
}
|
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: |
eddin, Вы меня не поняли. :) Код выше, который я дал, он встроит getElementsByClassName в IE8, не нужны никакие условия, просто вставьте код в head и пользуйтесь getElementsByClassName на здоровье. ;)
Ну, а если серьёзно, то все эти извращения не нужны, просто используйте везде querySelectorAll, он мощнее и удобнее. А за поздравления спасибо. :) |
Цитата:
Ruslan_xDD, а как можно научить IE8 вот такому?
window.addEventListener('resize',setHeight);
Я пробовал вот так:
window.attachEvent('onresize', setHeight);
и так:
window.attachEvent('onresize', function(){setHeight();});
не работает... |
Например, так:
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_xDD, спасибо! Буду разбираться)
|
Ничерта это в IE8 НЕ РАБОТАЕТ.
----------------------------- querySelectorAll, равно как и querySelector "Object doesn't support this property or method" (IE8 Сборка 8.0.6001.18702) Равно как и код через прототип Element выдаёт ошибку "Element is undefined". Объект Element в IE8 отсутствует. |
| Часовой пояс GMT +3, время: 03:42. |