Как заменить встроенный обработчик событий JavaScript? - PullRequest
1 голос
/ 19 октября 2010

Я бы хотел использовать только JavaScript (без jQuery) для замены встроенного обработчика события onmenuclick, сгенерированного сторонним элементом управления, своим собственным.

Пользовательский элемент управления добавил следующий HTML-код на страницу:

<ie:menuitem
  menugroupid="200"
  description="Create a site for a team or project."
  text="New Site"
  onmenuclick="if (LaunchCreateHandler('Site')) { STSNavigate('\u002fsites\u002fsd\u002f_layouts/newsbweb.aspx') }"
  iconsrc="/_layouts/images/newweb32.png" type="option" id="zz4_MenuItem_CreateSite"></ie:menuitem>

Я пытаюсь заменить обработчик onmenuclick на:

var createSiteMenuItem = document.getElementById('zz4_MenuItem_CreateSite');
if (createSiteMenuItem)
    createSiteMenuItem.onmenuclick = function () { alert('Hello!'); }

Оригинальный обработчик все еще срабатывает!Я проверяю, выполняется ли скрипт после загрузки документа.

Это правильный подход?

Ответы [ 3 ]

1 голос
/ 19 октября 2010

Проблема в том, что прямое присвоение onmenuclick ненадежно и нестандартно.Вам нужно использовать attachEvent() (IE) или addEventListener() (все остальные).

Edit :

Как объяснялось ниже, реальная проблема заключалась в том, что в Javascriptатрибуты элемента чувствительны к регистру, несмотря на HTML, а это не так.Так что любая ссылка на событие щелчка меню в Javascript должна ссылаться на него как "onMenuClick".

0 голосов
/ 19 октября 2010

Я пометил staticsan правильный ответ - onmenuclick не является стандартным, и поэтому проблема возникает. Однако предложенное оригинальное решение было не совсем правильным. С тех пор это было исправлено, но вот история для полноты ...


Я отладил это в Visual Studio и увидел, что onmenuclick распознается как expando вместо события. Это означает, что attachEvent и addEventListener не применяются и дают сбой при использовании.

VS debugger of this code

Разрешение было намного проще. Я изменил регистр на тот, который показан в отладчике Visual Studio, чтобы он читал onMenuClick вместо onmenuclick. «Поддельное событие» теперь срабатывает корректно.

0 голосов
/ 19 октября 2010

Идентификатор может генерироваться динамически. Так что один раз это zz4_MenuItem_CreateSite, а в следующий раз это что-то другое. Способ проверки: просмотрите html-источник при нескольких загрузках, посмотрите, отличаются ли идентификаторы.

Эта статья MSDN , кажется, указывает в этом направлении.

Предложение: оберните элементы меню в div с идентификатором, который вы назначаете. Затем пройдите дерево dom в вашем div, чтобы найти нужный элемент для изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...