jQuery多个事件触发相同的功能

sha*_*ess 939 jquery events jquery-events

有没有一种方法有keyup,keypress,blur,和change事件调用同一个函数在一行或做我必须做的分别呢?

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

Tat*_*nen 1721

您可以使用.on()将函数绑定到多个事件:

$('#element').on('keyup keypress blur change', function(e) {
    // e.type is the type of event fired
});
Run Code Online (Sandbox Code Playgroud)

或者只是将函数作为参数传递给普通事件函数:

var myFunction = function() {
   ...
}

$('#element')
    .keyup(myFunction)
    .keypress(myFunction)
    .blur(myFunction)
    .change(myFunction)
Run Code Online (Sandbox Code Playgroud)

  • 问题是myFunction可能会被多次调用,你可能想要阻止它. (21认同)
  • @Tomlsion也许将className'busy'添加到被调用函数中的元素,然后`$('#element:not(.busy)').on('keyup keypress blur change',function(e){...} );`最后删除className'忙'. (7认同)
  • 对于空格分隔事件,您如何包含名称间距?`.on('keyup.foo keypress.foo blur.foo change.foo',...)`或`.on('keyup keypress blur change .foo',...)`? (2认同)
  • 如何在此函数中传递参数? (2认同)

les*_*syk 56

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

$(document).on('mouseover mouseout',".brand", function () {
  $(".star").toggleClass("hovered");
})
Run Code Online (Sandbox Code Playgroud)


Ala*_*blo 43

我正在寻找一种方法来获取事件类型,当jQuery一次监听多个事件时,谷歌把我放在这里.

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

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

jQuery doc中的更多信息.


Gio*_*rgi 22

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

$('#foo').bind('mouseenter mouseleave', function() {
  $(this).toggleClass('entered');
});
Run Code Online (Sandbox Code Playgroud)

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

  • 从jQuery 1.7开始,.on()方法是将事件处理程序附加到文档的首选方法. (8认同)

Dav*_*ard 17

如果您将相同的事件处理程序附加到多个事件,您经常遇到一次触发多个事件的问题(例如,用户在编辑后按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.
});
Run Code Online (Sandbox Code Playgroud)


Saj*_*raf 13

我就是这样做的.

$("input[name='title']").on({
    "change keyup": function(e) {
        var slug = $(this).val().split(" ").join("-").toLowerCase();
        $("input[name='slug']").val(slug);
    },
});
Run Code Online (Sandbox Code Playgroud)


小智 11

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

var foo = function() {...}
Run Code Online (Sandbox Code Playgroud)

之后你可以在对象上设置你想要的许多事件监听器,使用on('event')触发该函数,在其间留一个空格,如下所示:

$('#selector').on('keyup keypress blur change paste cut', foo);
Run Code Online (Sandbox Code Playgroud)

  • 通常你应该解释你的答案.简单地粘贴代码无助于OP了解他们的问题或解决方案. (3认同)

Squ*_*azz 6

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() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后单独处理事件

// Call individually due to IE not handling binds properly
$(window).on("scroll", myFunction);
$(window).on("resize", myFunction);
Run Code Online (Sandbox Code Playgroud)

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


小智 6

$("element").on("event1 event2 event..n", function() {
   //execution
});
Run Code Online (Sandbox Code Playgroud)

本教程是关于处理多个事件。


Com*_*ide 5

有没有一种方法有keyupkeypressblur,和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"
});
Run Code Online (Sandbox Code Playgroud)

这是现场示例:

$('#target').on('keyup keypress blur change', function(e) {
    // "e" is an event, you can detect the type of event using "e.type"
});
Run Code Online (Sandbox Code Playgroud)
$('#target').on('keyup keypress blur change', function(e) {
  console.log(`"${e.type.toUpperCase()}" event happened`)
});
Run Code Online (Sandbox Code Playgroud)