Приостановите Стандартное событие в jQuery

Примечание: Это - обновленный ответ. Комментарии ниже относятся к старой версии, которая бездельничала с кодами клавиши.

JavaScript

Эти setInputFilter функция ниже позволяет Вам использовать любой вид входного фильтра на тексте , включая различные числовые фильтры (см. ниже).

В отличие от большинства других решений, это правильно поддержки Copy+Paste, Drag+Drop, все сочетания клавиш, все операции контекстного меню, все non-typeable ключи (например, клавиши управления курсором и клавиши навигации), позиция курсора, все раскладки клавиатуры всех языков и платформ, и все браузеры начиная с IE 9.

Попытка это самостоятельно на JSFiddle.

// Restricts input for the given textbox to the given inputFilter.
function setInputFilter(textbox, inputFilter) {
  ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
    textbox.addEventListener(event, function() {
      if (inputFilter(this.value)) {
        this.oldValue = this.value;
        this.oldSelectionStart = this.selectionStart;
        this.oldSelectionEnd = this.selectionEnd;
      } else if (this.hasOwnProperty("oldValue")) {
        this.value = this.oldValue;
        this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
      }
    });
  });
}

// Restrict input to digits and '.' by using a regular expression filter.
setInputFilter(document.getElementById("myTextBox"), function(value) {
  return /^\d*\.?\d*$/.test(value);
});

Некоторые входные фильтры Вы могли бы хотеть использовать:

  • Целое число значения (положительный только):
    /^\d*$/.test(value)
  • Целое число значения (положительный и до особого предела):
    /^\d*$/.test(value) && (value === "" || parseInt(value) <= 500)
  • Целое число значения (и положительный и отрицательный):
    /^-?\d*$/.test(value)
  • Плавающая точка значения (позволяющий и . и , как десятичный разделитель):
    /^-?\d*[.,]?\d*$/.test(value)
  • Валюта значения (т.е. самое большее два десятичных разряда):
    /^-?\d*[.,]?\d{0,2}$/.test(value)
  • A-Z только (т.е. основные латинские буквы):
    /^[a-z]*$/i.test(value)
  • латинские буквы только (т.е. английский и большинство европейских языков, см. https://unicode-table.com для получения дополнительной информации о диапазонах символов Unicode):
    /^[a-z\u00c0-\u024f]*$/i.test(value)
  • Шестнадцатеричный значения:
    /^[0-9a-f]*$/i.test(value)

Примечание, что Вы все еще должны , делает серверную проверку!

jQuery

Там является также версией jQuery этого. См. этот ответ или попробуйте его сами на JSFiddle.

HTML 5 HTML 5

имеет встроенное решение с [1 113] (см. спецификация ), но обратите внимание, что поддержка браузера варьируется:

  • Большинство браузеров только проверит вход при представлении формы, и не при вводе.
  • наиболее мобильные браузеры не поддерживают step, min и max атрибуты.
  • Chrome (версия 71.0.3578.98) все еще позволяет пользователю вводить символы e и E в поле. Также см. этот вопрос .
  • Firefox (версия 64.0) и Край (версия 17.17134 EdgeHTML) все еще позволяет пользователю входить любой текст в поле.

Попытка это самостоятельно на w3schools.com .

9
задан Bjørn Furuknap 6 August 2009 в 12:11
поделиться

3 ответа

Я бы, вероятно, сделал что-то вроде этого.

$("a").click(function(event) {
   event.preventDefault();
   doStuff(this);
   var url = $(this).attr("href");

   setTimeout(function() {
      hideMessage();
      window.location = url;
   }, 1000);
});

Я не уверен, что url можно увидеть изнутри временной функции. В противном случае вам может потребоваться объявить его вне обработчика кликов.

Изменить: Если вам нужно инициировать событие из временной функции, вы можете использовать что-то похожее на то, что предлагает karim79, хотя я бы сделал несколько изменений.

$(document).ready(function() {
  var slept = false;
  $("a").click(function(event) {
    if(!slept) {
        event.preventDefault();
        doStuff(this);

        var $element = $(this);
        // allows us to access this object from inside the function

        setTimeout(function() {
          hideMessage();
          slept = true;
          $element.click(); //triggers the click event with slept = true
        }, 1000);
        // if we triggered the click event here, it would loop through
        // this function recursively until slept was false. we don't want that.
    } else {
        slept = false; //re-initialize
    }
  });
});

Изменить: После некоторого тестирования и исследования я не уверен, что действительно возможно инициировать исходное событие щелчка элемента . Это возможно для любого элемента, кроме .

6
ответ дан 4 December 2019 в 22:29
поделиться

Это может сработать:

$(document).ready(function() {
  $("a").click(function(event) {
    event.preventDefault();
    doStuff(this);

    setTimeout(function() {
      hideMessage();
      $(this).click();
    }, 1000);
  });
});

Примечание: полностью непроверено

-2
ответ дан 4 December 2019 в 22:29
поделиться

Что-то вроде этого должно помочь. Добавьте новый класс (предположительно с более разумным именем, чем тот, который я выбрал) ко всем ссылкам, на которые вы хотите повлиять. Удалите этот класс, когда вы показываете свое всплывающее окно, поэтому, когда вы снова вызовете .click (), ваш код больше не будет запускаться, и произойдет поведение по умолчанию.

$("a").addClass("fancy-schmancy-popup-thing-not-yet-shown").click(function() {
    if ($(this).hasClass("fancy-schmancy-popup-thing-not-yet-shown"))
        return true;

    doStuff();
    $(this).removeClass("fancy-schmancy-popup-thing-not-yet-shown");

    var link = this;
    setTimeout(function() {
      hideMessage();
      $(link).click().addClass("fancy-schmancy-popup-thing-not-yet-shown";
    }, 1000);

    return false;
});
2
ответ дан 4 December 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: