2016-04-28 18 views
0

我很抱歉,如果這個問題已經回答,但我沒有發現儘管已經搜查積極#2相關的任何東西。當.off()然後調用.on()時,是否有可能從Jquery推遲事件?

我目前遇到在我的腳本的一個很奇怪的行爲,行爲似乎並不自然的我,但可能有其原因(我沒有找到這雖然):

其實,我作品就像這樣:通過改變表單輸入(選擇和廣播),然後調用一個程序來計算特定數據(重量,價格等)。那段時間,最終產品不應該添加到購物車,這就是爲什麼當我們改變表單輸入,這個提交按鈕是"disabled"(他的一些額外的處理由於回調)及其on('click')聽衆與off()禁用。

當計算完成後,程序會告訴按鈕現在再次點擊加入回調函數後面。

的實際行爲是當按鈕被禁用(後off()),按鈕上點擊不會觸發任何東西,但如果計算已經結束,on()聽衆重新添加該按鈕,回調掛鉤該按鈕被調用而沒有任何動作。感覺超怪我,因爲它可能需要的on()監聽器是回觸發回調之後再點擊一下,但很可能是內復活節蛋或功能我不知道的。

function callback() { 
    // >> 
    // ... 
    // << 
} 

function start() { 
    $(".button").off("click"); 
} 

function finish() { 
    $(".button").on("click", callback); 
} 

function process() { 
    start(); 

    // >> 
    // some inner ajax calls 
    // << 

    finish(); 
} 

$(".button").on("click", callback); 

你對發生了什麼有什麼想法嗎?

非常感謝您的關注,歡迎索取詳細信息,如果你需要一些。

編輯:至於問,這裏是我已經設置了介紹我的情況下,小提琴,但不幸的是我設法複製上面的情況下,即使背景下幾乎是一樣的:https://jsfiddle.net/Cr3aHal0/nfon051x/21/

+0

我們如何執行你的代碼? – Rayon

+0

你可以設置一個小提琴演示嗎? (旁註:你並不需要開始和結束;你可以讓處理程序處於活動狀態,如果它來自處於禁用狀態的按鈕,則返回false。) – Utkanos

+0

@Utkanos,其實'禁用'按鈕將不會調用點擊處理程序.. – Rayon

回答

1

http://javascript.info/tutorial/events-and-timing-depth

總結:

大多數瀏覽器對UI和JavaScript使用單線程,這被同步調用阻塞。 (您的offon之間的代碼是同步呼叫)

因此,JavaScript執行會阻止呈現。事件異步處理,但DOM事件除外。

當異步事件發生時,它進入事件隊列。

該瀏覽器已內環,稱爲事件循環,檢查隊列和處理事件,執行的功能等

例如,如果瀏覽器忙於處理您的onclick,並在後臺另一個事件發生(像另一次點擊),它附加到隊列中。當onclick處理程序完成時,將檢查隊列並執行腳本。 (在你的情況,你轉身後的事件處理回)


如何在您的方案解決這個問題?

而不是關閉/打開事件處理程序,嘗試禁用該按鈕。禁用的按鈕不會獲​​得點擊事件。

或者,使用的setTimeout啓用處理程序中,點擊隊列已被清除後,將出現,例如:

setTimeout(function() { $(".button").on("click", callback); }, 10); 
+0

嘿@ freedomn-m感謝您解釋良好的答案!我確實想到了有關事件隊列或類似jQuery鏈接的東西,但我沒有那樣挖掘更多。我沒有在問題中指定所有的東西,但在那裏顯示的過程是一個畫布應用程序,其目標是根據由輸入所確定的數據片段(重新)繪製精靈(因爲精靈加載而導致的非同步過程)表格。我確實使用了「禁用」技巧,並且效果很好。我也會嘗試setTimeout技巧。非常感謝大家,特別是你:) – Cr3aHal0

相關問題