0

在下面的例子http://jsfiddle.net/anu4nits/449d5j8e/如何從onchange事件處理程序停止click事件的執行

<input type="text" id="in" /> <input type="button" value="click" id="button" /> $('#in').change(function() { console.log('change event'); dialog.dialog("open"); }); $('#button').on('click', function (e) { console.log('click event'); });

我附上兩個事件一個是文本onchange事件和其他的就是點擊按鈕事件。如果我在文本框中寫入某些內容並點擊按鈕,則應該分別執行change事件的處理程序和click事件的處理程序。但是,當我在變化事件的處理程序中調用模態對話框時,單擊事件的處理程序沒有得到執行,因爲模態對話框不允許任何後臺活動。但是這隻與Chrome和Mozilla有關。在IE處理程序中,兩個事件都得到執行。

我希望所有瀏覽器的一致行爲,最好我不想在IE中執行點擊處理程序。我也不想在全球範圍內設置一些標誌來進行狀態檢查。此外,我不能從按鈕中分離事件,因爲在我的應用程序按鈕ID和它的處理程序在運行時生成。 是否有任何其他方式可以停止執行change事件處理程序中的click事件。

回答

0

點擊和改變都是獨立的事件,他們有自己的堆棧。所以你不能阻止另一個的傳播,因爲它們的目標元素也不同。 你可以做的是在他們的共同父母上附加事件,以便你有一個共同的處理程序。在那裏你可以設置標誌並執行你想要的。

0

使用stopPropagation,但更簡單的方法是去同一個標誌

$('#in').change(function(e) { 
    console.log('change event'); 
    dialog.dialog("open"); 
    e.stopPropagation(); 
}); 
+0

點擊和更改都是單獨的事件你不能停止從另一個這樣的傳播。您的代碼將停止傳播只有在dom樹 – Ninja 2014-11-06 09:59:10

+0

嘗試該腳本中的change事件。它會阻止觸發點擊事件,因爲首先發生更改事件 – shaN 2014-11-06 10:12:30

+0

在哪個瀏覽器中執行此操作? – Ninja 2014-11-06 10:17:43

0

我需要在同一onchange定義的下一個函數的立即執行,例如:

<input onchange="Dont(this);Work()">link</input> 

在這裏,我需要的不要()有條件地停止所有進一步的功能,如工作()來防止。我只是拋出了一個例外,因爲其他的東西都不起作用。

function Dont(button){ 
    if($(button).data("somecondition")){ 
     throw "NeedToStopEveryFurtherCodeExecution!"; 
    } 
} 

event.stopImmediatePropagation();沒有幫助。我不知道爲什麼,但我認爲使用外部.js文件時存在問題。

我認爲這比使用onchange中可能傳遞的每個函數中的條件解決此問題更簡單。我希望這不是一個非常糟糕/不贊成的方式。