2011-10-21 110 views
1

我有一個HTML按鈕,需要檢查幾個條件,如果他們通過允許默認操作發生。如何在事件處理程序中觸發元素的默認事件?

以下在Fi​​refox中工作,但在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聽衆是沒有得到調用。

有條件允許默認事件是最好的解決方案,我想出來的,但也有幾個選項可能:

  1. 有一些其他的方式來引起掛毯4監聽器從JavaScript內部被解僱?
  2. 有什麼辦法來識別我的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說,做到這一點。

+0

有沒有辦法看到一些演示頁面? – Ivan

+0

添加了JSFiddle鏈接。 –

回答

0

Form組件上有listener參數;從Tapestry 4 doc

當提交表單時要調用的缺省偵聽器。僅當另一個偵聽器(成功,取消或刷新)未被調用時才調用 。

這個參數設置爲我的監聽方法,像這樣:

<binding name="listener" value="listener:doSend" /> 

導致Tapestry的表單提交

tapestry.form.submit('myFormId'); 

觸發聽者。

1

如果滿足所有條件,我從按鈕 刪除點擊收聽,然後再次單擊該按鈕:

不要。

你還是檢查單擊處理程序的條件,並呼籲stopEvent有像這樣:

Ext.get('send').on('click', handleClick); 

function handleClick(e) { 
    if (condition) { 
     e.stopEvent(); 
    } 
} 
+0

對不起,我的例子不完整。其中一個條件是對「確定」類型的消息框的響應,所以如果他們單擊確定,我只能允許默認操作。爲了讓他們有時間點擊按鈕,我必須停止該事件。 –

+0

對。對不起,我沒有徹底讀過這個問題。我猜在這種情況下,正確的方法是手動觸發Tapestry偵聽器。但是,我對這個框架並不熟悉,所以我不能在這裏幫忙。 – user123444555621

+0

您的回答適合我最初提供的信息量,所以我很感激幫助。 –

0

Internet Explorer不支持點擊。您應該使用fireEvent方法,例如

Ext.getDom('send').fireEvent('onclick'); 

這應該適用於IE。對於其他瀏覽器,我猜想點擊是可以的。無論如何,如果我應該做類似的任務,我會嘗試寫一個適配器掛毯和使用tapestry JavaScript庫。

+0

我試過這個,但是返回值總是假的,意味着事件由於某種原因被取消。我更新了更多信息的問題。 –

相關問題