jQuery,仅在用户自己更改输入时更改事件

时间:2016-02-24 09:26:03

标签: javascript jquery event-handling

我们可以检测用户是否更改了某些内容:

$('#item').change(function() { 
    alert('changed!');
});
遗憾的是,有时我需要巧妙地称之为$('#item').change(),但在这种情况下,它也被视为“已更改”。有没有办法区分用户活动与手动活动?

3 个答案:

答案 0 :(得分:33)

从jQuery事件处理程序返回的第一个参数是事件对象:

$('#item').change(function(e) { 
  console.log(e); // The event object
});

我通常区分用户触发事件和代码触发事件的方式是用户触发事件附加了originalEvent属性。我不知道这是否是最好的方法,但我这样做:

$('#item').change(function(e) { 
  if (e.originalEvent) {
    // user-triggered event
  }
  else {
    // code-triggered event
  }
});

实施例

在下面的示例中键入input元素,然后取消对元素的聚焦。您会收到"user-triggered"的提醒。单击按钮以调用代码触发的更改。您会收到"code-triggered"的提醒。



$('#item').change(function(e) { 
  if (e.originalEvent) {
    alert('user-triggered')
  }
  else {
    alert('code-triggered')
  }
});

$('button').on('click', function() {
  $('#item').change();
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input type=text id=item />
<button>Click here to trigger change</button>
&#13;
&#13;
&#13;

答案 1 :(得分:7)

originalEvent的另一种方法应该是使用事件参数:

$('#item').change(function(event, who) {
    if(who === "machine")
        alert('machine!');
    else
        alert('human!');
});

$("#item").trigger("change", ["machine"]);

答案 2 :(得分:2)

当用户触发事件时,回调的事件参数将包含originalEvent键,因此您可以执行以下操作:


    $('#item').change(function(e){
        if (e.originalEvent){
            alert('Changed by user');
        }
        // Place common code here
    });