Javascript-форум (https://javascript.ru/forum/)
-   Opera, Safari и др. (https://javascript.ru/forum/css-html-browser/)
-   -   Забавный баг (фича?) в Chrome / Safari (https://javascript.ru/forum/css-html-browser/7854-zabavnyjj-bag-ficha-v-chrome-safari.html)

Cr@ZyBoY 22.02.2010 15:46

Забавный баг (фича?) в 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 нужны, но пока из-за них ничего не работает...

subzey 22.02.2010 15:51

this для addEventListener получается не document, а window
var addEvent = function(){
(document.addEventListener || document.attachEvent).apply(document, arguments)
}

Должно помочь.

PeaceCoder 22.02.2010 15:53

Знакомая конструкция.... ща скажу откуда взял... из 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

e1f 22.02.2010 15:57

PeaceCoder, код subzey поизящнее, не находите? ;)

PeaceCoder 22.02.2010 15:58

Цитата:

Сообщение от e1f
не находите?

неа. я описал почему.

subzey 22.02.2010 16:04

PeaceCoder,
Ухтыжка! И впрямь, нет! И прототипа нет. И присвоить
document.attachEvent.call = Function.call
нельзя.

Снимаю шляпу.

Cr@ZyBoY 22.02.2010 16:09

PeaceCoder,
вам и subzey плюсик в карму за помощь, спасибо :)

e1f 22.02.2010 16:13

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;
  }
};

PeaceCoder 22.02.2010 16:22

Цитата:

Сообщение от e1f
А разве для attachEvent мы type не должны через on указывать

Для этих типов вроде нет. Т.к. это события дерева, а не пользовательские.

e1f 22.02.2010 16:36

Да, если говорить о событиях aka DOMAttrModified -- в ИЕ же их нет, так? Вроде бы там onpropertychange.


Часовой пояс GMT +3, время: 08:11.