Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > addEventListener в Opera 7.54


Автор: 12345c 23.10.2006, 05:19
Решил воспользоваться подключаемыми обработчиками и написал такое выражение:
Код
onload=function(){
  var o=document.getElementById('d1'),p='',ad='addEventListener',at='attachEvent';
  (o[ad]||(p='on',o[at]))(p+'mouseover',F,!1);
}
F=function(){alert(0);}
в расчёте, что у дива с id=d1 он сработает. Оказалось, что в IE, FF, Opera 8.01 работает, в Opera 7.54 - нет. Она действительно их не поддерживает или помешала хитроумность конструкции?

Добавлено @ 05:22 
tst

Автор: skyboy 23.10.2006, 08:24
проверить не могу - такой старой Оперы под рукой нет. Скажу лишь, что http://forum.vingrad.ru/index.php?showtopic=73457&view=findpost&p=849405 с подобной проблемой: Opera 8.54 заявляет, что метод addEventListener у неё есть, но обработчики не работают, в то время, как attachEvent срабатывает. Я покрутил-покрутил, и в конце-концов в конструкции, подобной твоей, стал проверять сначала на attachEvent, и только потом уже - на addEventListener

Автор: AKS 23.10.2006, 08:40
12345c,  такая конструкция:
Код

(o[ad]||(p='on',o[at]))(p+'mouseover',F,!1);

не будет работать не только в ранних Opera, но еще и в Gecko < 1.8. Ошибка в следующем:
Цитата

Illegal operation on WrappedNative prototype object

Автор: Zeroglif 23.10.2006, 09:56
Цитата(AKS @  23.10.2006,  08:40 Найти цитируемый пост)
но еще и в Gecko < 1.8.

Это дело (Illegal operation на прототипе) по кускам начали править с FF1.0.4. Конкретно этот случай у меня работает, начиная с FF1.0.6. А вообще, конструкция конечно хаковая, но сам лично пользуюсь для дома, для семьи... smile

Автор: AKS 24.10.2006, 11:12
Zeroglif, 
Цитата

этот случай у меня работает, начиная с FF1.0.6

Может быть потому, что у Вас "лисичка" пропатчена и т.д., и т.п.? У меня-то Gecko-бразы нетронуты обновлениями ("девственно-оригинальны") - вот они и не понимают подобных фишек. 
Мне наверно надо было написать: "Не работает в Gecko моложе 2006 г. выпуска".

Автор: 12345c 25.10.2006, 18:54
Спасибо за подсказки, особенно skyboy, потому что, поменяв проверку обработчика, запустил эту конструкцию под проверяемыми браузерами (Ie6, FF1.07, Op7.54, Op9.01). 
Опера повела себя наоборот по сравнению с описанным Op8.54 :  o[at]('onmouseover',F,!1); не работает в ней, o[ad]('mouseover',F,!1); - работает.
Хитроумная конструкция сходит с ума везде, кроме IE6: в FF начинает думать, что повешена на document, в Операх - по разному от версии, но и того хуже. Даже если написать её по-другому:
Код
  var o=document.getElementById('d1'),p='on',ad='addEventListener',at='attachEvent';
  (o.attachEvent||(p='',o.'addEventListener'))(p+'mouseover',F,!1);
или
Код
<div id=d2>></div>
<div id=d3>(пусто)</div>
<div id=d1>12345</div>
<script>onload=function(){
  var o=document.getElementById('d1'),p='on',ad='addEventListener',at='attachEvent';
  (o[at]||(p='',o[ad]))(p+'mouseover',F,!1);
}
F=function(){document.getElementById('d2').innerHTML+='+';}
</script>

Вывод: o[имя_функции] работает, а  ()||() - нет, и приводит к сумасшествию подопытных. Не пользуйтесь этой конструкцией. Корректно будет вести себя код в данном примере:
Код
<div id=d2>></div>
<div id=d3>(пусто)</div>
<div id=d1>12345</div>
<script>onload=function(){
  var ad,o=document.getElementById('d1'),p='';
  o[o[ad='addEventListener']?ad:(p='on','attachEvent')](p+'mouseover',F,!1);
}
F=function(){document.getElementById('d2').innerHTML+='+';}
</script>
(Возможно, 8-е Оперы поведут иначе?)
Или вариант -  отказаться от обработчиков и сделать по-старинке - o.onmouseover=F;, и везде работает.

Автор: AKS 6.11.2006, 18:22
12345c, вот "дошли руки до интересной штуки". 
Цитата

отказаться от обработчиков и сделать по-старинке - o.onmouseover=F;, и везде работает. 

Да не надо, наверно, "по-старинке" - оно ведь и так будет работать там, где надо (Opera 7.23+, Gecko/20040206+...):
Код

<div id='d2'>></div>
<div id='d3'>(пусто)</div>
<div id='d1'>12345</div>
<script type='text/javascript'>
function F(o, e) {
  o = (e) ? o : (e = 'mouseover', document.getElementById('d1'));
  o[(o.addEventListener) ? 'addEventListener' : (e = 'on' + e, 'attachEvent')](e, F, !1);
}
F((window.opera) ? document : window, 'load');
var F = function() { document.getElementById('d2').innerHTML += '+'; }
</script>

Работает? У меня - да. И, как видно, не надо "проверять сначала на attachEvent, и только потом уже - на addEventListener"...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)