2013-02-13 174 views
1
$("input[type='color']").on("change blur", function() { 
    alert("changed"); 
}); 

這也適用於其他元素,但這是一個很好的例子。在某些瀏覽器上使用顏色輸入類型時,它會觸發'更改'而不是'模糊',有些觸發器會在'模糊'上觸發,但不會觸發'更改',還會觸發兩者。事件觸發多次

有沒有一種很好的方法來確保它只觸發一次?

我主要在這裏談論各種移動瀏覽器。

+0

我沒有測試或任何東西,但你有沒有試圖把在停止繁殖或stopImmediatePropagation? – MattyP 2013-02-13 03:45:25

+1

技術上'變化'應該是正確的事件來傾聽。 – 2013-02-13 03:46:49

+0

爲什麼這兩個事件發生都是問題? – 2013-02-13 04:26:50

回答

3

我已經寫了一個.one()的專門版本,將重新綁定後的事件處理程序第一個事件已經處理。它在一個包裝器中完成這項工作,以便事件處理程序代碼本身不必更改。

$.fn.one_rebind = function(events, listener) { 
    return this.one(events, function fn() { 
    var $self = $(this).unbind(events); 

    listener.apply(this, arguments); 

    setTimeout(function() { 
     $self.one(events, fn); 
    }, 0); 
    }); 
}; 

$('input[type=color]').one_rebind('change blur', function(evt) { 
    document.getElementById('debug').innerText += ' ' + evt.type; 
}); 

雖然測試,您的里程可能會有所不同:)

Demo

+0

完美。如果我信任,我會投票。這是一英里的最佳答案。 – user2026796222222222 2013-02-13 05:39:19

3

你可以嘗試.one()事件處理程序,而不是.on()http://api.jquery.com/one/

+0

這絕對是解決問題的方法。 – thomasfedb 2013-02-13 03:48:20

+0

您仍然需要在某個時間點重新附加事件處理程序,並且該過程並不重要;可以看到一個示例實現[here](http://stackoverflow.com/a/14846526/1338292)。 – 2013-02-13 04:47:45

0

與此啓動功能:

var now = new Date().getTime(); 
if(arguments.callee.lastcalled > now-250) return false; 
arguments.callee.lastcalled = now; 

這樣做是限制被稱爲比每250毫秒一次的函數(通常是足夠的沒有丟失實際重複的風險)

+1

一些解釋也會很好;-) – 2013-02-13 03:47:38

+0

@Jack基本上,上面的剪切可以防止函數在上次調用後的250ms內被調用。 – thomasfedb 2013-02-13 03:49:02

+0

'arguments.callee'已被棄用。 – ThinkingStiff 2013-02-13 03:49:06