Забавный баг (фича?) в 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 нужны, но пока из-за них ничего не работает... |
this для addEventListener получается не document, а window
var addEvent = function(){
(document.addEventListener || document.attachEvent).apply(document, arguments)
}
Должно помочь. |
Знакомая конструкция.... ща скажу откуда взял... из 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);
Цитата:
|
PeaceCoder, код subzey поизящнее, не находите? ;)
|
Цитата:
|
PeaceCoder,
Ухтыжка! И впрямь, нет! И прототипа нет. И присвоить document.attachEvent.call = Function.callнельзя. Снимаю шляпу. |
PeaceCoder,
вам и subzey плюсик в карму за помощь, спасибо :) |
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;
}
};
|
Цитата:
|
Да, если говорить о событиях aka DOMAttrModified -- в ИЕ же их нет, так? Вроде бы там onpropertychange.
|
| Часовой пояс GMT +3, время: 15:28. |