2010-10-19 11 views
1

我想僅使用JavaScript(無jQuery)來替換由我自己生成的由第三方控件生成的內聯onmenuclick事件處理函數。如何替換內嵌JavaScript事件處理程序?

自定義控件添加了下面的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

確實提醒('你好');之前調用「如果(啓動...」如果是這樣,你可能想要使用evt.stopPropagation(),evt.preventDefault(),window.event.cancelBubble = true,window.event.returnValue = false – jebberwocky 2010-10-19 03:05:11

回答

1

問題是直接分配給onmenuclick是不可靠和不規範的。您需要使用attachEvent()(IE)或addEventListener()(其他人)。

編輯

如下所述,實際的問題是,在Javascript中,元素屬性,是大小寫敏感的,儘管HTML,這是不。因此,對JavaScript中菜單點擊事件的引用必須將其稱爲"onMenuClick"

+0

如果我使用'attachEvent' /'addEventListener',有沒有一種方法可以刪除現有的'onmenuclick',所以它永遠不會觸發? – 2010-10-19 03:12:01

+0

是的''removeEventListener()/ detachEvent()' – staticsan 2010-10-19 03:13:37

+0

在這種情況下,我不認爲這是問題。onmenuclick應該替換舊的事件處理程序。alert()是否彈出?Cuz,如果沒有,可能是createSiteMenuItem仍然爲空或未定義。 – Azmisov 2010-10-19 03:17:44

0

該id可以動態生成。所以有一次,它是'zz4_MenuItem_CreateSite'下次它是別的東西。檢查方法:觀察多個下載的html源代碼,看看這些id是否有所不同。

這個msdn article似乎指向這個方向。

建議:將菜單項目包裝在一個帶有您分配的ID的div中。然後走在你的div內的dom樹找到正確的元素進行修改。

+0

我將需要實現這樣的事情,因爲ID可能會改變。然而,對於這個測試/示例/原型/不管它沒有改變。 – 2010-10-19 03:12:51

0

我已經標記了staticsan的答案是正確的 - onmenuclick是非標準的,這就是問題出現的原因。然而,原先提出的決議並不完全正確。這已經被糾正,但在這裏是爲了完整的背景故事......


我在Visual Studio調試這一點,可以看到,onmenuclick被確認爲的expando,而不是一個事件。這意味着attachEventaddEventListener不適用,並在使用時失敗。

VS debugger of this code

該決議是更爲簡單。我將外殼更改爲Visual Studio調試器中顯示的外殼,以便它讀取onMenuClick而不是onmenuclick。 「假人事件」現在正確地解僱了。