提问人:shaneburgess 提问时间:3/29/2010 最后编辑:isherwoodshaneburgess 更新时间:1/3/2023 访问量:781432
如何使用jQuery从多个事件触发相同的函数?
How can I trigger the same function from multiple events with jQuery?
问:
有没有办法让 、 、 和事件在一行中调用相同的函数,或者我必须单独执行它们?keyup
keypress
blur
change
我遇到的问题是我需要通过数据库查找来验证某些数据,并希望确保在任何情况下都不会错过验证,无论是键入还是粘贴到框中。
答:
可以使用 bind 方法将函数附加到多个事件。只需传递事件名称和处理程序函数,如以下代码所示:
$('#foo').bind('mouseenter mouseleave', function() {
$(this).toggleClass('entered');
});
另一种选择是使用 jquery api 的链接支持。
评论
可用于将函数绑定到多个事件:.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)
评论
.on('keyup.foo keypress.foo blur.foo change.foo', …)
.on('keyup keypress blur change .foo', …)
on('click tap', e => {...})
$('#element:not(.busy)').on('keyup keypress blur change', function(e){…});
如果将同一事件处理程序附加到多个事件,则经常会遇到多个事件同时触发的问题(例如,用户在编辑后按 Tab 键;按键、更改和模糊都可能触发)。
听起来你真正想要的是这样的:
$('#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.
});
从 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 文档。
评论
我就是这样做的。
$("input[name='title']").on({
"change keyup": function(e) {
var slug = $(this).val().split(" ").join("-").toLowerCase();
$("input[name='slug']").val(slug);
},
});
Tatu 的答案是我如何直观地做到这一点,但我在 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);
这不是最漂亮的解决方案,但它对我有用,我想我会把它放在那里来帮助其他可能偶然发现这个问题的人
您可以定义要重用的函数,如下所示:
var foo = function() {...}
稍后,您可以使用 on('event') 在对象上设置任意数量的事件侦听器来触发该函数,并在两者之间留一个空格,如下所示:
$('#selector').on('keyup keypress blur change paste cut', foo);
评论
有没有办法让 、 、 和事件在一行中调用相同的函数?
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">
$("element").on("event1 event2 event..n", function() {
//execution
});
本教程介绍如何处理多个事件。
使用内置的 DOM 方法很容易实现这一点,而无需像 jQuery 这样的大型库,如果需要,它只需要多一点代码 - 遍历事件名称数组,并为每个事件名称添加一个侦听器:
function validate(event) {
// ...
}
const element = document.querySelector('#element');
['keyup', 'keypress', 'blur', 'change'].forEach((eventName) => {
element.addEventListener(eventName, validate);
});
如果您想模拟添加 1 个以上的元素:
const elements = document.querySelectorAll('.commonSelector');
['keyup', 'keypress', 'blur', 'change'].forEach((eventName) => {
elements.forEach(element => {
element.addEventListener(eventName, validate);
});
});
评论
return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } );
)
而不是:
$('#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);
下一个:观看多个$scope属性
评论