Лучшая эмуляция 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, время: 07:33. |