如何替换内联JavaScript事件处理程序?

时间:2010-10-19 02:59:45

标签: javascript javascript-events

我想仅使用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 个答案:

答案 0 :(得分:1)

问题是直接分配给onmenuclick是不可靠和不标准的。您需要使用attachEvent()(IE)或addEventListener()(其他人)。

修改

如下所述,实际问题是在Javascript中,元素属性区分大小写,尽管HTML不是。因此,对Javascript中菜单点击事件的任何引用都必须将其称为"onMenuClick"

答案 1 :(得分:0)

可以动态生成id。所以有一次它是'zz4_MenuItem_CreateSite',下次是别的东西。检查方法:观察多次下载的html源代码,看看ID是否有所不同。

msdn article似乎指向了这个方向。

建议:将菜单项包装在具有您指定ID的div中。然后走div中的dom树,找到要修改的正确元素。

答案 2 :(得分:0)

我已将staticsan的答案标记为正确 - onmenuclick是非标准的,这就是问题发生的原因。然而,最初的决议建议并不完全正确。这已被纠正,但这是完整性的背景故事......


我在Visual Studio中对此进行了调试,可以看到onmenuclick被识别为 expando 而不是事件。这意味着attachEventaddEventListener在使用时不适用并失败。

VS debugger of this code

分辨率要简单得多。我将外壳更改为Visual Studio调试器中显示的外壳,因此它显示为onMenuClick而不是onmenuclick。 “虚假事件”现在正确解雇了。