22.02.2010, 15:46
|
|
Аспирант
|
|
Регистрация: 08.02.2010
Сообщений: 52
|
|
Забавный баг (фича?) в Chrome / Safari
Наткнулся на интересный баг (или не баг) хрома и сафари.
var addEvent = document.addEventListener || document.attachEvent;
addEvent("DOMNodeRemoved", function() {}, false);
addEvent("DOMAttrModified", function() {}, false);
addEvent("DOMNodeInserted", function() {}, false);
alert(true);
addEvent соответственно ставит на события изменения DOM какую-нибудь функцию (Mutation Events).
Код вроде как кросс-браузерный, но... Работает везде, кроме выше перечисленных браузеров, т.е. до alert дело вообще не доходит.
Выскакивает вот это: Uncaught TypeError: Illegal invocation
Кто-нибудь с таким сталкивался? А то Mutation Events нужны, но пока из-за них ничего не работает...
|
|
22.02.2010, 15:51
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
this для addEventListener получается не document, а window
var addEvent = function(){
(document.addEventListener || document.attachEvent).apply(document, arguments)
}
Должно помочь.
|
|
22.02.2010, 15:53
|
|
Профессор
|
|
Регистрация: 15.12.2009
Сообщений: 742
|
|
Знакомая конструкция.... ща скажу откуда взял... из peppy.
Когда я это увидел сразу увидел этот баг. я выкрутился так:
var aEv = 'addEventListener'
aEv = doc[aEv]&&aEv || (aEv='attachEvent')&&doc[aEv]&&aEv;
doc[aEv]("DOMAttrModified", fn, false);
doc[aEv]("DOMNodeInserted", fn, false);
doc[aEv]("DOMNodeRemoved", fn, false);
Сообщение от subzey
|
(document.addEventListener || document.attachEvent).apply(document, arguments)
|
На сколько я помню и не раз расшибал лоб. у attachEvent функци нет методов .apply && .call в IE6
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
Последний раз редактировалось PeaceCoder, 22.02.2010 в 15:59.
|
|
22.02.2010, 15:57
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
PeaceCoder, код subzey поизящнее, не находите?
|
|
22.02.2010, 15:58
|
|
Профессор
|
|
Регистрация: 15.12.2009
Сообщений: 742
|
|
Сообщение от e1f
|
не находите?
|
неа. я описал почему.
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
|
|
22.02.2010, 16:04
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
PeaceCoder,
Ухтыжка! И впрямь, нет! И прототипа нет. И присвоить
document.attachEvent.call = Function.call
нельзя.
Снимаю шляпу.
|
|
22.02.2010, 16:09
|
|
Аспирант
|
|
Регистрация: 08.02.2010
Сообщений: 52
|
|
PeaceCoder,
вам и subzey плюсик в карму за помощь, спасибо
|
|
22.02.2010, 16:13
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
PeaceCoder,
А разве для attachEvent мы type не должны через on указывать? В общем, если без ненужной бравады, то все равно выйдет что-то вроде
function addEvent(el, event, func) {
if (el.addEventListener) {
el.addEventListener(event, func, false);
}
else if (el.attachEvent) {
el.attachEvent('on'+event, func);
}
else {
el['on'+event] = func;
}
};
|
|
22.02.2010, 16:22
|
|
Профессор
|
|
Регистрация: 15.12.2009
Сообщений: 742
|
|
Сообщение от e1f
|
А разве для attachEvent мы type не должны через on указывать
|
Для этих типов вроде нет. Т.к. это события дерева, а не пользовательские.
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
|
|
22.02.2010, 16:36
|
|
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
Да, если говорить о событиях aka DOMAttrModified -- в ИЕ же их нет, так? Вроде бы там onpropertychange.
|
|
|
|