有没有办法让keyup
,keypress
,blur
和change
个事件在一行中调用相同的函数,还是必须单独执行?
我遇到的问题是我需要使用数据库查找验证一些数据,并且希望确保在任何情况下都不会错过验证,无论是键入还是粘贴到框中。
答案 0 :(得分:1626)
您可以使用.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)
答案 1 :(得分:55)
从jQuery 1.7开始,.on()
方法是将事件处理程序附加到文档的首选方法。对于早期版本,.bind()
方法用于将事件处理程序直接附加到元素。
$(document).on('mouseover mouseout',".brand", function () {
$(".star").toggleClass("hovered");
})
答案 2 :(得分:43)
我正在寻找一种方法来获取事件类型,当jQuery一次监听多个事件时,谷歌把我放在这里。
所以,对于那些感兴趣的人,event.type
是我的答案:
$('#element').on('keyup keypress blur change', function(event) {
alert(event.type); // keyup OR keypress OR blur OR change
});
jQuery doc中的更多信息。
答案 3 :(得分:21)
您可以使用bind method将功能附加到多个事件。只需传递事件名称和处理函数,如下代码所示:
$('#foo').bind('mouseenter mouseleave', function() {
$(this).toggleClass('entered');
});
另一个选择是使用jquery api的链接支持。
答案 4 :(得分:16)
如果您将相同的事件处理程序附加到多个事件,您经常遇到一次触发多个事件的问题(例如,用户在编辑后按Tab键; keydown,change和blur可能全部触发)。
这听起来像你真正想要的是这样的:
$('#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.
});
答案 5 :(得分:12)
我就是这样做的。
$("input[name='title']").on({
"change keyup": function(e) {
var slug = $(this).val().split(" ").join("-").toLowerCase();
$("input[name='slug']").val(slug);
},
});
答案 6 :(得分:11)
您可以定义要重复使用的功能,如下所示:
var foo = function() {...}
稍后您可以在对象上设置多个事件侦听器,使用on(' event')触发该功能,在其间留一个空格,如下所示:
$('#selector').on('keyup keypress blur change paste cut', foo);
答案 7 :(得分:6)
Tatu的答案是我如何直观地做到这一点,但我在Internet Explorer中遇到了一些嵌套/绑定事件的方法,即使它是通过.on()
方法完成的。
我无法确切地确定哪个版本的jQuery存在问题。但我有时会在以下版本中看到问题:
我的解决方法是首先定义函数,
function myFunction() {
...
}
然后单独处理事件
// Call individually due to IE not handling binds properly
$(window).on("scroll", myFunction);
$(window).on("resize", myFunction);
这不是最漂亮的解决方案,但它适用于我,我想我会把它放在那里帮助其他可能偶然发现这个问题的人
答案 8 :(得分:4)
$("element").on("event1 event2 event..n", function() {
//execution
});
This tutorial是关于处理多个事件的。
答案 9 :(得分:3)
"有没有办法让keyup
,keypress
,blur
和change
个事件在一行中调用相同的功能?& #34;
可以使用.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">
&#13;
答案 10 :(得分:1)
使用内置的DOM方法实现此操作很简单,而无需像jQuery这样的大库,如果需要的话,它只需要花费更多的代码-遍历事件名称数组,并为每个事件名称添加一个侦听器: / p>
function validate() {
// ...
}
const element = document.querySelector('#element');
['keyup', 'keypress', 'blur', 'change'].forEach((eventName) => {
element.addEventListener(eventName, validate);
});