我想仅使用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!'); }
原始处理程序仍然会触发!我确保在文档加载后脚本运行。
这是正确的方法吗?
答案 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 而不是事件。这意味着attachEvent
和addEventListener
在使用时不适用并失败。
分辨率要简单得多。我将外壳更改为Visual Studio调试器中显示的外壳,因此它显示为onMenuClick
而不是onmenuclick
。 “虚假事件”现在正确解雇了。