$("input[type='color']").on("change blur", function() {
alert("changed");
});
這也適用於其他元素,但這是一個很好的例子。在某些瀏覽器上使用顏色輸入類型時,它會觸發'更改'而不是'模糊',有些觸發器會在'模糊'上觸發,但不會觸發'更改',還會觸發兩者。事件觸發多次
有沒有一種很好的方法來確保它只觸發一次?
我主要在這裏談論各種移動瀏覽器。
$("input[type='color']").on("change blur", function() {
alert("changed");
});
這也適用於其他元素,但這是一個很好的例子。在某些瀏覽器上使用顏色輸入類型時,它會觸發'更改'而不是'模糊',有些觸發器會在'模糊'上觸發,但不會觸發'更改',還會觸發兩者。事件觸發多次
有沒有一種很好的方法來確保它只觸發一次?
我主要在這裏談論各種移動瀏覽器。
我已經寫了一個.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;
});
雖然測試,您的里程可能會有所不同:)
完美。如果我信任,我會投票。這是一英里的最佳答案。 – user2026796222222222 2013-02-13 05:39:19
你可以嘗試.one()
事件處理程序,而不是.on()
http://api.jquery.com/one/
這絕對是解決問題的方法。 – thomasfedb 2013-02-13 03:48:20
您仍然需要在某個時間點重新附加事件處理程序,並且該過程並不重要;可以看到一個示例實現[here](http://stackoverflow.com/a/14846526/1338292)。 – 2013-02-13 04:47:45
與此啓動功能:
var now = new Date().getTime();
if(arguments.callee.lastcalled > now-250) return false;
arguments.callee.lastcalled = now;
這樣做是限制被稱爲比每250毫秒一次的函數(通常是足夠的沒有丟失實際重複的風險)
一些解釋也會很好;-) – 2013-02-13 03:47:38
@Jack基本上,上面的剪切可以防止函數在上次調用後的250ms內被調用。 – thomasfedb 2013-02-13 03:49:02
'arguments.callee'已被棄用。 – ThinkingStiff 2013-02-13 03:49:06
我沒有測試或任何東西,但你有沒有試圖把在停止繁殖或stopImmediatePropagation? – MattyP 2013-02-13 03:45:25
技術上'變化'應該是正確的事件來傾聽。 – 2013-02-13 03:46:49
爲什麼這兩個事件發生都是問題? – 2013-02-13 04:26:50