Примечание: Это - обновленный ответ. Комментарии ниже относятся к старой версии, которая бездельничала с кодами клавиши.
Эти 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]*$/i.test(value)
/^[a-z\u00c0-\u024f]*$/i.test(value)
/^[0-9a-f]*$/i.test(value)
Примечание, что Вы все еще должны , делает серверную проверку!
Там является также версией jQuery этого. См. этот ответ или попробуйте его сами на JSFiddle.
имеет встроенное решение с [1 113] (см. спецификация ), но обратите внимание, что поддержка браузера варьируется:
step
, min
и max
атрибуты. e
и E
в поле. Также см. этот вопрос . Попытка это самостоятельно на w3schools.com .
Я бы, вероятно, сделал что-то вроде этого.
$("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
}
});
});
Изменить: После некоторого тестирования и исследования я не уверен, что действительно возможно инициировать исходное событие щелчка элемента
. Это возможно для любого элемента, кроме
.
Это может сработать:
$(document).ready(function() {
$("a").click(function(event) {
event.preventDefault();
doStuff(this);
setTimeout(function() {
hideMessage();
$(this).click();
}, 1000);
});
});
Примечание: полностью непроверено
Что-то вроде этого должно помочь. Добавьте новый класс (предположительно с более разумным именем, чем тот, который я выбрал) ко всем ссылкам, на которые вы хотите повлиять. Удалите этот класс, когда вы показываете свое всплывающее окно, поэтому, когда вы снова вызовете .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;
});