Они все «правильно» в том, что они дают одинаковые результаты (при условии, element
является DOM). Преимущество с window
и document
заключается в том, что вам не придется создавать или находить элемент для тестирования функциональности, что означает, что вы можете более эффективно выполнять свой тест.
Вы говорите, что element
легко доступен: это предполагает, что вы пишете плагин/библиотеку/модуль, который создает элементы и связывает с ними события. Я бы сказал, раскошелиться свои события отдельно:
В то время как вы можете иметь такой код:
function createButton(){
// Create element
var button = document.createElement('input');
// Bind event
if(button.attachEvent){
button.attachEvent('onclick', actionTrigger);
}
else {
button.addEventListener('click', actionTrigger, false);
}
return button;
}
Вы можете быть лучше писать свою собственную функцию-обертку, как таковой:
var bindEvent = (function determineEventBinding(){
if(window.attachEvent){
return function attachEvent(element, hook, func){
element.attachEvent('on' + hook, func);
}
}
else {
return function addEventListener(element, hook, func){
element.addEventListener(hook, func, false);
}
}
}());
. .. И затем забудьте все о головной боли, используя вашу обертку при написании функционального кода:
function createButton(){
// Create element
var button = document.createElement('input');
// Bind event
bindEvent(button, 'click', actionTrigger);
return button;
}
Преимущества многообразны:
- код для определения метода необходимо только один раз запустить
- Этот код может работать, как только начинает выполнение сценария - оставаясь в пути производительности заторы горячих точках, как DOM готов, или пользователь CTA
- Вы можете забыть обо всех различиях браузера при написании своего эзотерического функционального кода, и ваш код будет читать и лучше работать в результате
- Если вам нужно поддерживать новые различия в браузере или исправить существующие, вы можете редактировать код в одном месте, а не трассировку каждый раз, когда вы связываете событие
«Все они должны указывать на то же место в коде, который является родным для браузера» - нет, код (я предполагаю опечатки с намерением '(window || документ || элемент) .attachEvent') вернет первый объект из 'window',' document' и 'element', который возвращает правду (' window') и видит, имеет ли _it_ свойство 'attachEvent'. Если я не пойму вас, и вы спросите, из чего, из 3, быстрее запросить? Я бы сказал, что все так же быстро. – Barney
Ах, правильно - подумал, что было немного странно, что вы делали поразрядные или на элементах DOM. Короткий ответ заключается в том, что нет никакого существенного штрафа за производительность при захвате любого из них. – Barney
'attachEvent' был бы прототипирован в какой-то туманной высшей точке, да.Единственный фактор затрат будет получен из области обхода, чтобы получить объект, на который нужно искать метод ... – Barney