2014-10-22 68 views
4

我们有一种情况下,您更喜欢只有当您离开输入字段时触发的事件。这是因为该事件导致“回发”,如ajax请求,后者又更新输入字段。更改事件将启动无限循环。jQuery变化和然后模糊事件

另一方面,每次用户离开字段时都会触发模糊事件,而不管该字段是否已更改。

我所寻找的是怎样的一个“转换和再模糊”事件,触发如果领域的改变,但只有当留(模糊)的。

我认为jQuery并没有开箱即用。有没有简单的方法来扩展它呢?

更新 - 我只是努力重现在一个简单的jsfiddle无限循环的问题 - 无济于事。

有淘汰赛涉及以及jQuery autoNumeric和自定义autoNumeric敲除绑定。这些值使用ko.mapping进行更新。但即使包括所有这些我的jsfiddle似乎完美工作与简单的jQuery change事件:http://jsfiddle.net/a1tbxnpp/

所以我想我会调查问题与我的应用程序,麻烦引入另一个jQuery事件。

+0

我完全不理解你的问题......如果你想确定这些字段没有被关注,只检查它是否被集中,那么只会调用一次更改事件... http://api.jquery.com/焦点选择器/但变化事件主要发生在场模糊的情况下。 – Loenix 2014-10-22 11:37:19

+0

@Loenix - 你是完全正确的。我更新了我的问题。我不能“撤销”它,因为它已经有了答案。我也不能立即关闭它。 – chiccodoro 2014-10-22 12:18:53

+0

请检查此出[http://stackoverflow.com/questions/16710227/intercept-value-changes-within-blur-event](http://stackoverflow.com/questions/16710227/intercept-value-changes-within -blur-event) – 2016-12-13 12:01:37

回答

2

为什么不使用焦点和模糊。在焦点上将输入字段的值保存在变量中。模糊比较输入与变量的值,如果不同,请执行ajax调用。

+0

来自我的相当晚的upvote :-) – chiccodoro 2015-11-24 16:22:13

1

嗯...回答我的问题,我刚才已经尝试了以下,似乎摆在首位的工作:

$(":input").each(function() { 
    var $el = $(this), 
     oldValue = $el.val(); 

    $el.focus(function() { 
     oldValue = $el.val(); 
    }); 

    $el.blur(function() { 
     var newValue = $el.val(); 
     if (oldValue != newValue) { 
      $el.trigger('changeblur'); 
     } 
    }); 
}); 

我想有没有简单的答案比...

+0

这是有效的,但对于在飞行中创建的元素,我们必须做类似这样的操作:var inputOldValue; $('body')。on('focus','input,textarea,select',function(){inputOldValue = $(this).val();}); $('body')。on('blur','input,textarea,select',function(){if(inputOldValue!= $(this).val()){$(this).trigger('changeBlur' );}});'我在这里使用input,textarea,select'来代替':input'',因为前者比后者快。 – artificis 2016-01-21 12:44:21