[jquery] Предотвратите функцию при стрельбе дважды, когда привязаны к вводу на фокус и нажмите



Answers

Небольшой гистерезис может быть вариантом. В основном записывайте последний раз, когда вы отвечали на любое событие, и игнорируете последующие события в течение защитного времени.

Вы можете использовать data jQuery для этого (пример в конце ответа), но я предпочитаю это: универсальный деблок:

Живой пример с использованием click и focus | Живой источник

$("#field").on("click focus", debounce(100, function(e) {
  // Event occurred, but not with 100ms of the previous one
}));

Функция debouncer :

// debounce - debounces a function call
//
// Usage: var f = debounce([guardTime, ] func);
//
// Where `guardTime` is the interval during which to suppress
// repeated calls, and `func` in the function to call.
// You use the returned function instead of `func` to get
// debouncing;
//
// Example: Debouncing a jQuery `click` event so if it happens
// more than once within a second (1,000ms), subsequent ones
// are ignored:
//
//    $("selector").on("click", debounce(1000, function(e) {
//      // Click occurred, but not within 1000ms of previous
//    });
//
// Both `this` and arguments are passed through.
function debounce(guardTime, func) {
  var last = 0;

  if (typeof guardTime === "function") {
    func = guardTime;
    guardTime = 100;
  }
  if (!guardTime) {
    throw "No function given to debounce";
  }
  if (!func) {
    throw "No func given to debounce";
  }

  return function() {
    var now = +new Date();
    if (!last || (now - last) > guardTime) {
      last = now;
      return func.apply(this, arguments);
    }
  };
}

(Название «debouncer» является общим термином для чего-то, что использует гистерезис для ввода ограничений скорости. IIRC, он исходит от «переключателя дебюта», который является (очень) простой схемой, используемой, чтобы избежать запуска действия сотни раз как механическое переключение электрических переключателей от открытого к закрытию и наоборот, поскольку, когда контакты приближаются, может быть много замкнутых / открытых / закрытых / открытых / закрытых / открытых болтовни до того, как коммутатор достигнет устойчивого состояния. Эта болтовня называется « подпрыгивая », следовательно, «дебютант».)

Подход с использованием data jQuery:

$('input').on('focus click', function(){
    var $this = $(this);
    var now = +new Date();
    var lastClicked = $this.data("lastClicked");
    if (lastClicked && (now - lastClicked) < 100) {
        // Don't do anything
        return;
    }
    $this.data("lastClicked", now);

    // Do the work
});
Question

Я пытаюсь запустить событие как для click и для focus , но я только хочу, чтобы он срабатывал один раз. Когда я нажимаю внутри ввода, он срабатывает дважды (щелчок и фокусировка). Как я могу это предотвратить?

$('input').on('focus click', function(){
    console.log('fired');
});





Links