jQuery多个事件触发相同的function
有没有办法让keyup
, keypress
, blur
和change
事件在一行中调用相同的函数,还是需要单独执行?
我遇到的问题是我需要使用db查找来validation一些数据,并且希望确保validation不会错过input或粘贴到框中的天气。
您可以使用.on()
将函数绑定到多个事件:
$('#element').on('keyup keypress blur change', function(e) { // e.type is the type of event fired });
或者只是将该函数作为parameter passing给常规事件函数:
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"); })
我正在寻找一种方式来获得事件types,当jQuery同时收听几个事件,谷歌把我放在这里。
所以,对于那些感兴趣的, event.type
是我的答案:
$('#element').on('keyup keypress blur change', function(event) { alert(event.type); // keyup OR keypress OR blur OR change });
更多信息在jQuery文档 。
您可以使用绑定方法将function附加到多个事件。 只需传递事件名称和处理函数,如下所示:
$('#foo').bind('mouseenter mouseleave', function() { $(this).toggleClass('entered'); });
另一个select是使用jquery api的链接支持。
如果将同一个事件处理程序附加到多个事件中,您经常遇到多个事件同时触发的问题(例如,用户在编辑之后按下Tab键,可能会激发按下button,更改和模糊)。
这听起来像你真正想要的是这样的:
$('#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. });
你可以定义你想要重用的函数,如下所示:
var foo = function() {...}
稍后,您可以设置您希望在对象上使用的多个事件侦听器,以使用on('event')在两者之间留出空间来触发该函数,如下所示:
$('#selector').on('keyup keypress blur change paste cut', foo);
这是我如何做到这一点。
$("input[name='title']").on({ "change keyup": function(e){ var slug = $(this).val().split(" ").join("-").toLowerCase(); $("input[name='slug']").val(slug); }, });
Tatu的回答是,我会直观的做到这一点,但是在IE浏览器中遇到了一些嵌套/绑定事件的问题,尽pipe它是通过.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);
这不是最漂亮的解决scheme,但它对我有用,我想我会放在那里帮助其他人可能会遇到这个问题
“有没有办法让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">