如何使用jQuery从多个事件触发相同的函数?

How can I trigger the same function from multiple events with jQuery?

提问人:shaneburgess 提问时间:3/29/2010 最后编辑:isherwoodshaneburgess 更新时间:1/3/2023 访问量:781432

问:

有没有办法让 、 、 和事件在一行中调用相同的函数,或者我必须单独执行它们?keyupkeypressblurchange

我遇到的问题是我需要通过数据库查找来验证某些数据,并希望确保在任何情况下都不会错过验证,无论是键入还是粘贴到框中。

jQuery 事件 jquery-events

评论


答:

27赞 Giorgi 3/29/2010 #1

可以使用 bind 方法将函数附加到多个事件。只需传递事件名称和处理程序函数,如以下代码所示:

$('#foo').bind('mouseenter mouseleave', function() {
  $(this).toggleClass('entered');
});

另一种选择是使用 jquery api 的链接支持。

评论

12赞 Dzhuneyt 8/26/2013
从 jQuery 1.7 开始,.on() 方法是将事件处理程序附加到文档的首选方法。
2052赞 Tatu Ulmanen 3/29/2010 #2

可用于将函数绑定到多个事件:.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)

评论

4赞 Sukima 12/14/2015
对于空格分隔的事件,如何还包括名称间距? 或?.on('keyup.foo keypress.foo blur.foo change.foo', …).on('keyup keypress blur change .foo', …)
30赞 Esger 1/21/2016
这样做的问题是 myFunction 可能会被多次调用,您可能希望阻止这种情况。
2赞 HalfWebDev 5/26/2016
如何在此函数中传递参数?
1赞 tomision 11/10/2016
@Esger 无论如何要这样做吗?在移动中,我总是需要.监听器可能会被触发两次,我只想触发一次,如何在监听器函数中编码?on('click tap', e => {...})
9赞 Esger 12/5/2016
@Tomlsion 也许在被调用函数的元素中添加一个 className 'busy',然后最后删除 className 'busy'。$('#element:not(.busy)').on('keyup keypress blur change', function(e){…});
18赞 Dave Ward 3/29/2010 #3

如果将同一事件处理程序附加到多个事件,则经常会遇到多个事件同时触发的问题(例如,用户在编辑后按 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.
});
70赞 lesyk 11/14/2012 #4

从 jQuery 1.7 开始,该方法是将事件处理程序附加到文档的首选方法。对于早期版本,该方法用于将事件处理程序直接附加到元素。.on().bind()

$(document).on('mouseover mouseout',".brand", function () {
  $(".star").toggleClass("hovered");
})

评论

1赞 Ben Taliadoros 4/8/2014
这是为委托事件完成的,它会起作用,但这不是最简单的方法,也不是最有效的方法。
1赞 random_user_name 1/12/2017
事件委派很重要,可能需要(也可能不需要)取决于脚本的加载/运行时间,以及脚本加载/运行时元素是否存在于 DOM 中。
61赞 Alain 5/15/2013 #5

我一直在寻找一种方法,当jQuery同时侦听多个事件时,可以获取事件类型,而Google将我放在这里。

所以,对于那些感兴趣的人,我的回答是:event.type

$('#element').on('keyup keypress blur change', function(event) {
    alert(event.type); // keyup OR keypress OR blur OR change
});

有关详细信息,请参阅 jQuery 文档

评论

0赞 Eatsam ul haq 5/14/2022
如果我想在事件之间使用 and 而不是 or 怎么办。因此,如果两个事件都发生,则触发此函数?
15赞 Sajjad Ashraf 11/9/2014 #6

我就是这样做的。

$("input[name='title']").on({
    "change keyup": function(e) {
        var slug = $(this).val().split(" ").join("-").toLowerCase();
        $("input[name='slug']").val(slug);
    },
});
7赞 Squazz 4/7/2015 #7

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);

这不是最漂亮的解决方案,但它对我有用,我想我会把它放在那里来帮助其他可能偶然发现这个问题的人

13赞 Coder Of The Galaxy 4/9/2015 #8

您可以定义要重用的函数,如下所示:

var foo = function() {...}

稍后,您可以使用 on('event') 在对象上设置任意数量的事件侦听器来触发该函数,并在两者之间留一个空格,如下所示:

$('#selector').on('keyup keypress blur change paste cut', foo);

评论

3赞 leigero 4/9/2015
一般来说,你应该解释你的答案。简单地粘贴代码并不能帮助 OP 理解他们的问题或您的解决方案。
0赞 Dr.X 9/14/2018
如果我需要jQuery事件订阅者函数(event)中的第一个参数怎么办?如何使用它?
0赞 Coder Of The Galaxy 9/17/2018
没关系,你可以用 event 参数声明函数,然后从方法中访问它。这些事件将自行传递对象。我希望这会有所帮助。var foo = function(event) { console.log(event); } $('#selector').on('keyup 按键模糊 更改粘贴剪切', foo);
24赞 P.S. 9/27/2017 #9

有没有办法让 、 、 和事件在一行中调用相同的函数?keyupkeypressblurchange

可以使用 ,它接受以下结构: ,因此您可以将多个事件传递给此方法。在您的情况下,它应该如下所示:.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">

7赞 Guest 4/22/2018 #10
$("element").on("event1 event2 event..n", function() {
   //execution
});

本教程介绍如何处理多个事件。

4赞 CertainPerformance 5/21/2019 #11

使用内置的 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);
  });
});

评论

0赞 jave.web 8/20/2022
请注意,jQuery 的作用不亚于(最终它本身会下降到(这直接来自 jQuery 3.6.0 代码return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } );)
4赞 Lrnt 12/2/2022 #12

而不是:

$('#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甚至为事件而尝试!keyupkeypressblurchangepaste

0赞 Hakan 1/3/2023 #13

但为了防止多次触发:

var a;
var foo = function() {
    clearTimeout(a);
    a=setTimeout(function(){
        //your code
        console.log("Runned")
    },50);
}
$('textarea').on('blur change', foo);