Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> addEventListener в Opera 7.54, не работает? 
:(
    Опции темы
12345c
Дата 23.10.2006, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Решил воспользоваться подключаемыми обработчиками и написал такое выражение:
Код
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
PM WWW   Вверх
skyboy
Дата 23.10.2006, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



проверить не могу - такой старой Оперы под рукой нет. Скажу лишь, что сталкивался с подобной проблемой: Opera 8.54 заявляет, что метод addEventListener у неё есть, но обработчики не работают, в то время, как attachEvent срабатывает. Я покрутил-покрутил, и в конце-концов в конструкции, подобной твоей, стал проверять сначала на attachEvent, и только потом уже - на addEventListener
PM MAIL   Вверх
AKS
Дата 23.10.2006, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



12345c,  такая конструкция:
Код

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

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

Illegal operation on WrappedNative prototype object

PM MAIL   Вверх
Zeroglif
Дата 23.10.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



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

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

PM MAIL WWW   Вверх
AKS
Дата 24.10.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Zeroglif
Цитата

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

Может быть потому, что у Вас "лисичка" пропатчена и т.д., и т.п.? У меня-то Gecko-бразы нетронуты обновлениями ("девственно-оригинальны") - вот они и не понимают подобных фишек. 
Мне наверно надо было написать: "Не работает в Gecko моложе 2006 г. выпуска".
PM MAIL   Вверх
12345c
Дата 25.10.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



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


--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
AKS
Дата 6.11.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



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"...

Это сообщение отредактировал(а) AKS - 6.11.2006, 18:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.