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

Это также относится к другим элементам, но это хороший пример. При использовании типа цветного ввода в некоторых браузерах он запускается на «change», но не на «blur», а на некоторых он вызывает «размытие», но не на «change», а некоторые - на обоих.Триггеры событий несколько раз

Есть ли хороший способ, чтобы он срабатывал только один раз?

В основном я говорю о различных мобильных браузерах.

+0

Я не проверял это или что-нибудь, но вы пробовали положить в стоп распространения или stopImmediatePropagation в? – MattyP

+1

Технически 'change' должно быть правильным событием для прослушивания. –

+0

Почему это проблема, если происходят оба события? –

ответ

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

3

Вы можете попробовать обработчик .one() события вместо .on()http://api.jquery.com/one/

+0

Это определенно путь к этому. – thomasfedb

+0

Вам по-прежнему нужно повторно привязать обработчики событий в какой-то момент, и этот процесс является нетривиальным; пример реализации можно увидеть здесь (http://stackoverflow.com/a/14846526/1338292). –

0

Начните функцию с этим:

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

Что это делает предел функции от вызова более чем один раз каждые 250 миллисекунд (что обычно достаточно, не рискуя отсутствием фактических дубликатов)

+1

Некоторое объяснение было бы неплохо ;-) –

+0

@Jack В принципе, отрезанное выше препятствует тому, чтобы функция вызывалась меньше, чем 250 мс после последнего вызова. – thomasfedb

+0

'arguments.callee' устарел. – ThinkingStiff

Смежные вопросы