我有一個HTML按鈕,需要檢查幾個條件,如果他們通過允許默認操作發生。如何在事件處理程序中觸發元素的默認事件?
以下在Firefox中工作,但在IE中失敗。我在按鈕上設置了一個點擊處理器:
Ext.get('send').on('click', handleSend, this, {
preventDefault: true
});
如果其中一個條件未滿足,彈出幾個消息框之一。如果所有條件都滿足,我從按鈕刪除點擊收聽,然後再次單擊該按鈕:
Ext.get('send').un('click', handleSend, this);
Ext.getDom('send').click();
據我所知,在IE(以及可能的其他瀏覽器)失敗,因爲點擊()」不是個一個DOM元素的標準函數。
如果默認操作是一個簡單的表單提交,我可以在檢查通過後執行該操作,但我們將Tapestry 4與一個偵聽器一起使用,該操作不會在正常表單提交時執行。
我試着
tapestry.form.submit('composeForm', 'doSend');
提交表單,但doSend
聽衆是沒有得到調用。
有條件允許默認事件是最好的解決方案,我想出來的,但也有幾個選項可能:
- 有一些其他的方式來引起掛毯4監聽器從JavaScript內部被解僱?
- 有什麼辦法來識別我的Tapestry頁面中的正常表單提交,從而觸發監聽器?
JSFiddle加入
在這種jsfiddle,默認動作是提交表單;當複選框未被選中時,這被阻止。選中時會刪除處理程序,但對click()的調用在IE中不起作用。
有沒有一種方法來模擬IE中的點擊?
更新
在問題的另一個障礙是,我要顯示一個「你確定」對話框,所以爲了給他們時間來回答,事件必須停止。如果他們單擊確定,則需要執行默認操作。 JSFiddle似乎沒有像MessageBox這樣的ExtJS小部件,所以我不知道如何演示這種行爲。
在@伊萬的建議,我想
Ext.getDom('send').fireEvent('onclick');
但它返回false,表示該事件正在某處取消。然後,我嘗試
var evt = document.createEvent("Event");
evt.initEvent('click', false, false);
var cancelled = Ext.getDom('send').fireEvent('onclick', evt);
但IE9說document.createEvent不存在的,即使這是怎麼MSDN說,做到這一點。
有沒有辦法看到一些演示頁面? – Ivan
添加了JSFiddle鏈接。 –