JQuery несколько событий для запуска одной и той же функции
Есть ли способ иметь keyup
, keypress
, blur
, а также change
события вызывают одну и ту же функцию в одной строке или мне нужно делать их отдельно?
У меня проблема в том, что мне нужно проверить некоторые данные с помощью поиска в БД, и я хотел бы убедиться, что проверка не пропущена ни в одном случае, независимо от того, напечатана она или вставлена в поле.
13 ответов
Ты можешь использовать .on()
привязать функцию к нескольким событиям:
$('#element').on('keyup keypress blur change', function(e) {
// e.type is the type of event fired
});
Или просто передайте функцию в качестве параметра обычным функциям события:
var myFunction = function() {
...
}
$('#element')
.keyup(myFunction)
.keypress(myFunction)
.blur(myFunction)
.change(myFunction)
Начиная с jQuery 1.7, .on()
Метод является предпочтительным методом для присоединения обработчиков событий к документу. Для более ранних версий .bind()
Метод используется для прикрепления обработчика событий непосредственно к элементам.
$(document).on('mouseover mouseout',".brand", function () {
$(".star").toggleClass("hovered");
})
Я искал способ получить тип события, когда jQuery прослушивает несколько событий одновременно, и Google разместил меня здесь.
Итак, для тех, кто заинтересован, event.type
мой ответ:
$('#element').on('keyup keypress blur change', function(event) {
alert(event.type); // keyup OR keypress OR blur OR change
});
Больше информации в документе JQuery.
Вы можете использовать метод связывания, чтобы прикрепить функцию к нескольким событиям. Просто передайте имена событий и функцию-обработчик, как в этом коде:
$('#foo').bind('mouseenter mouseleave', function() {
$(this).toggleClass('entered');
});
Другой вариант - использовать поддержку jQuery API для создания цепочек.
"Есть ли способ иметь keyup
, keypress
, blur
, а также change
события вызывают одну и ту же функцию в одной строке?
Это возможно с помощью .on()
, который принимает следующую структуру: .on( events [, selector ] [, data ], handler )
, так что вы можете передать несколько событий этому методу. В вашем случае это должно выглядеть так:
$('#target').on('keyup keypress blur change', function(e) {
// "e" is an event, you can detect the type of event using "e.type"
});
И вот живой пример:
$('#target').on('keyup keypress blur change', function(e) {
console.log(`"${e.type.toUpperCase()}" event happened`)
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="target">
Если вы присоединяете один и тот же обработчик событий к нескольким событиям, вы часто сталкиваетесь с тем, что одновременно запускается более одного из них (например, пользователь нажимает вкладку после редактирования; могут сработать нажатия клавиш, изменения и размытие).
Похоже, что вы на самом деле хотите что-то вроде этого:
$('#ValidatedInput').keydown(function(evt) {
// If enter is pressed
if (evt.keyCode === 13) {
evt.preventDefault();
// If changes have been made to the input's value,
// blur() will result in a change event being fired.
this.blur();
}
});
$('#ValidatedInput').change(function(evt) {
var valueToValidate = this.value;
// Your validation callback/logic here.
});
Вот как я это делаю.
$("input[name='title']").on({
"change keyup": function(e) {
var slug = $(this).val().split(" ").join("-").toLowerCase();
$("input[name='slug']").val(slug);
},
});
Вы можете определить функцию, которую хотите использовать повторно, как показано ниже:
var foo = function() {...}
И позже вы можете установить сколько угодно прослушивателей событий на вашем объекте для запуска этой функции, используя on('event'), оставляя пробел между ними, как показано ниже:
$('#selector').on('keyup keypress blur change paste cut', foo);
$("element").on("event1 event2 event..n", function() {
//execution
});
Этот урок посвящен обработке нескольких событий.
Тату отвечает, как я бы сделал это интуитивно, но у меня возникли некоторые проблемы в Internet Explorer с этим способом вложения / связывания событий, даже если это делается с помощью .on()
метод.
Я не смог точно определить, с какими версиями jQuery это проблема. Но иногда я вижу проблему в следующих версиях:
- 2.0.2
- 1.10.1
- 1.6.4
- Мобильный 1.3.0b1
- Мобильный 1.4.2
- Мобильный 1.2.0
Мой обходной путь должен был сначала определить функцию,
function myFunction() {
...
}
а затем обрабатывать события индивидуально
// Call individually due to IE not handling binds properly
$(window).on("scroll", myFunction);
$(window).on("resize", myFunction);
Это не самое красивое решение, но оно работает для меня, и я подумал, что выложу его, чтобы помочь другим, которые могут наткнуться на эту проблему.
Это легко реализовать с помощью встроенных методов DOM без большой библиотеки, такой как jQuery, если вы хотите, просто требуется немного больше кода - переберите массив имен событий и добавьте слушатель для каждого:
function validate() {
// ...
}
const element = document.querySelector('#element');
['keyup', 'keypress', 'blur', 'change'].forEach((eventName) => {
element.addEventListener(eventName, validate);
});
Вместо:
$('#element').on('keyup keypress blur change', function(e) {
// e.type is the type of event fired
});
Вы можете использовать:
$('#element').on('input', function(e) {
// e.type is the type of event fired
});
input
срабатывает дляkeyup
keypress
blur
change
события даже дляpaste
!
Но чтобы предотвратить многократное срабатывание:
var a;
var foo = function() {
clearTimeout(a);
a=setTimeout(function(){
//your code
console.log("Runned")
},50);
}
$('textarea').on('blur change', foo);