Спасибо за подсказки, особенно 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;, и везде работает. |