Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   проблема с onClick в IE 10 (https://javascript.ru/forum/events/37029-problema-s-onclick-v-ie-10-a.html)

molnij 04.04.2013 22:45

проблема с onClick в IE 10
 
Добрый день
Есть работающая система. У пользователей с автообновлением пришел IE 10 и обнаружился странный баг.
Симптомы: при клике на элементах перестали выполнятся все действия.

Элементы (a, div) имеют обработчик onClick. С разными функциями внутри. Бряки поставленные внутри функций показывают, что до них поток даже не доходит.
Дополнительно усложняющие ситуацию симптомы:
У меня на двух разных машинах под IE 10 все продолжает работать. У ряда пользователей - нет.
На машине где не работает, если в devtools'ах IE в содержимом атрибута onclick исправить что-нибудь, оно начинает работать. Причем исправить можно что угодно: я пробовал добавить пробел между параметрами в вызове функции, точку с запятой в конце и прочие на мой взгляд не меняющие функционала вещи.


Сложилось впечатление, что этим я просто вызываю какую-то переинициализацию внутри браузера и он начинает подхватывать обработчики.

Подскажите что делать или хотя бы в какую сторону рыть? гугление ничего похожего не выдало. Проблемы с onClick в IE у народа встречаются, но в совершенно иных ситуациях

danik.js 04.04.2013 22:51

Вот вам и еще одна (правда под сомнением) причина не использовать атрибуты для навески обработчиков )

devote 05.04.2013 01:17

Цитата:

Сообщение от molnij
гугление ничего похожего не выдало.

странно что не выдало сообщение: НЕ ВЕШАЙ ОБРАБОТЧИКИ ЧЕРЕЗ АТРИБУТЫ!!!
Используйте нормальный способ кодирования, JS отдельно, HTML отдельно. Зачем совать все воедино, это же говнокод.

molnij 05.04.2013 09:31

Цитата:

Сообщение от devote (Сообщение 244331)
странно что не выдало сообщение: НЕ ВЕШАЙ ОБРАБОТЧИКИ ЧЕРЕЗ АТРИБУТЫ!!!
Используйте нормальный способ кодирования, JS отдельно, HTML отдельно. Зачем совать все воедино, это же говнокод.

Я в JS новичок и за бурей эмоций не очень понял, что именно вы рекомендуете?
Кстати гугл по "НЕ ВЕШАЙ ОБРАБОТЧИКИ ЧЕРЕЗ АТРИБУТЫ" не выдает ничего особо впечатляющего. Первая же ссылка ведет на http://javascript.ru/tutorial/events/intro, где написано, что варианты с document.getElementById('myElement').onclick = function() {} и атрибутом эквивалентны.
А учитывая, что в системе весь код генерируется, видимо автору было проще вешать обработчики по месту проживания элемента. И в чем-то я его могу понять.

ну и в целом хотелось бы понять, если код валидный, почему он не выполняется, а если нет - почему он выполняется

dmitriymar 05.04.2013 12:20

Цитата:

Сообщение от molnij
ну и в целом хотелось бы понять, если код валидный, почему он не выполняется, а если нет - почему он выполняется

НЕ ВЕШАЙ ОБРАБОТЧИКИ ЧЕРЕЗ АТРИБУТЫ!!!

cyber 05.04.2013 12:28

От ие будет хоть какаето польза , если не буду вешать обработчик через атрибут...

molnij 05.04.2013 13:44

Я искренне надеюсь, что не попал на местный флешмоб и еще раз прошу пояснить почему? Гугл по прежнему не в курсе этой фразы.

nikita.mmf 05.04.2013 13:49

DOM: свойства VS атрибуты

cyber 05.04.2013 13:55

molnij, как минимум когда читаешь такой код хочется по лицу дать.
Прочитайте эту статью http://learn.javascript.ru/introduction-browser-events
nikita.mmf, и причем тут свойства или в данном топике речь идет о событиях и почему лучше использовать свойство.

dmitriymar 05.04.2013 14:11

Цитата:

Сообщение от molnij
Я искренне надеюсь, что не попал на местный флешмоб и еще раз прошу пояснить почему? Гугл по прежнему не в курсе этой фразы.

А гугл не даёт ответа разве , что это была самая первая модель навески обработчиков , какой лет и лет ?
http://ru.wikipedia.org/wiki/JavaScript
http://ru.wikipedia.org/wiki/Document_Object_Model
И вполне логично не переносить устаревшее морально ?

molnij 05.04.2013 14:26

Цитата:

Сообщение от cyber (Сообщение 244391)
molnij, как минимум когда читаешь такой код хочется по лицу дать.
Прочитайте эту статью http://learn.javascript.ru/introduction-browser-events
nikita.mmf, и причем тут свойства или в данном топике речь идет о событиях и почему лучше использовать свойство.

Читал статью. Узнал оттуда:
Цитата:

Эти два примера кода работают одинаково:
Только HTML: <input type="button" onclick="alert('Клик!')" value="Кнопка"/>
HTML + JS: document.getElementById('button').onclick = function() {alert('Клик!'); }
Вопрос остался. Почему не работает и откуда так много заглавных букв в "НЕ ВЕШАЙ ОБРАБОТЧИКИ ЧЕРЕЗ АТРИБУТЫ!!!"

Единственное упоминание использования не-атрибута обнаружено в фразе
"Используйте свойство, а не атрибут. Так неверно: elem.setAttribute('onclick', func)."

cyber 05.04.2013 14:30

Цитата:

Сообщение от molnij
Единственное упоминание использования не-атрибута обнаружено в фразе
"Используйте свойство, а не атрибут. Так неверно: elem.setAttribute('onclick', func)."

ниже не зря было написано
Цитата:

Как вы думаете, почему?
Раскрыть ответ
Цитата:

Значением атрибута может быть только строка. Любое другое значение преобразуется в строку.

Функция в строчном виде обычно даёт свой код: "function() { alert(1) }".

Итак, атрибут присвоен. Теперь браузер создаст обработчик с телом из этой строки:
document.body.onclick = function() { 
  function() { alert(1) }
}


Этот код попросту некорректен с точки зрения JavaScript. Локальная функция объявлена без имени — отсюда и ошибка.
П.с в общем видно как внимательно вы читали...

molnij 05.04.2013 14:38

Цитата:

Сообщение от cyber (Сообщение 244396)
ниже не зря было написано
...
П.с в общем видно как внимательно вы читали...

Так я ведь не объявляю функцию для обработчика, т.е. не пишу
<div onclick="function(){alert('1');}>
Код генерируется в виде <div onclick="alert('1')">

cyber 05.04.2013 14:39

molnij, дайте ссылку на страницу где не работает.

molnij 05.04.2013 14:49

система внутреннего пользования, наружу выхода просто не имеет

cyber 05.04.2013 14:50

molnij,ок, тогда кусок кода который не работает.

molnij 05.04.2013 14:53

cyber, хорошо, чуть позже, когда доступ на машину будет, скопирую код прямо из IE

molnij 05.04.2013 19:30

Код элемента в окне отладки IE
<a class="btn btn-small btn btn-success" onclick="CreateKPIValues()" href="#">

В разделе "Динамические сценарии"

function CreateKPIValues() { var fields = { ProjectId: Asyst.Workspace.currentForm.Data.ProjectId }; Asyst.Workspace.openEntityDialog("KPIValues", "Новый KPI проекта. Значения", null, function () { Asyst.Workspace.currentForm.Reset(); }, fields); }

Если нажимать на <a> - ничего не будет происходить.

Встаю в окне отладки IE на обработчик onclick и добавляю пробел между скобками вызова функции:
<a class="btn btn-small btn btn-success" onclick="CreateKPIValues( )" href="#">
Все начинает работать.

Причем, повторюсь, всё нормально в IE9, chrome, ff, и части IE10. И лишь на паре компов происходит эта ерунда.

cyber 05.04.2013 21:10

molnij, хм, довольно странно,
<зануда>
после вызова функции нужно ставить точку с запятой
<зануда/>
Цитата:

Сообщение от molnij
Встаю в окне отладки IE на обработчик onclick и добавляю пробел между скобками вызова функции:

wtf?
Вам нужно найти ошибку, используйте консоль , тогда я смогу хоть что то сделать.
Цитата:

Сообщение от molnij
Если нажимать на <a> - ничего не будет происходить.

так как href = "#" по ссылке не перейдет, а если нечего не происходит значить где то в скрипте возникло исключение..

molnij 05.04.2013 21:34

Цитата:

Сообщение от cyber (Сообщение 244460)
molnij, хм, довольно странно,
<зануда>
после вызова функции нужно ставить точку с запятой
<зануда/>

Справедливо.

Цитата:

Сообщение от cyber (Сообщение 244460)
wtf?

Дык это самое важное. Я писал в первом сообщении - если я хоть как-то меняю содержимое onclick в developer tools IE на закладке HTML(т.е. не перегружая страницу, просто налету), то все начинает работать.
Было onclick="CreateKPIValues()" стало onclick="CreateKPIValues( )". Внутри скобок в вызове функции добавился пробел. Все заработало. Кстати, пробовал добавлять точку-с-запятой после функции - тоже начинало работать.

Цитата:

Сообщение от cyber (Сообщение 244460)
так как href = "#" по ссылке не перейдет, а если нечего не происходит значить где то в скрипте возникло исключение..

До скрипта дело просто не доходит. Брекпоинт поставленный на скрипт не активируется. Пока не исправишь что-нибудь, как уже написал выше, после этого и брекпоинт активируется и код нормально выполняется.

Правда у меня уже подозрения, что это какая-то косячная версия IE попалась, что задачу, впрочем, не облегчает..

danik.js 06.04.2013 06:09

А что находится в свойстве el.onclick во время тупняка?
И вобще, я всегда говорю что имена функций должны быть с маленькой буквы, а конструкторов - с большой. Вот в этом наверно и проблема!


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