<input type="text">的值可以通过多种方式改变,包括:

按键 复制/粘贴 JavaScript修改 由浏览器或工具栏自动完成

我希望在JavaScript函数发生变化时调用它(使用当前输入值)。我希望它能马上被调用,而不是在输入失去焦点的时候。

我正在寻找最干净和最健壮的方法来跨所有浏览器(最好使用jQuery)。


当前回答

jQuery >= 1.7的实时解决方案已经启动

$("#input-id").on("change keyup paste", function(){
    dosomething();
})

如果你还想检测“点击”事件,只需:

$("#input-id").on("change keyup paste click", function(){
    dosomething();
})

如果你使用jQuery <= 1.6,使用bind或live代替on。

其他回答

不幸的是,没有事件或事件集符合您的标准。按键和复制/粘贴都可以用keyup事件处理。通过JS进行更改比较棘手。如果你可以控制设置文本框的代码,你最好的选择是修改它,直接调用你的函数,或者在文本框上触发一个用户事件:

// Compare the textbox's current and last value.  Report a change to the console.
function watchTextbox() {
  var txtInput = $('#txtInput');
  var lastValue = txtInput.data('lastValue');
  var currentValue = txtInput.val();
  if (lastValue != currentValue) {
    console.log('Value changed from ' + lastValue + ' to ' + currentValue);
    txtInput.data('lastValue', currentValue);
  }
}

// Record the initial value of the textbox.
$('#txtInput').data('lastValue', $('#txtInput').val());

// Bind to the keypress and user-defined set event.
$('#txtInput').bind('keypress set', null, watchTextbox);

// Example of JS code triggering the user event
$('#btnSetText').click(function (ev) {
  $('#txtInput').val('abc def').trigger('set');
});

如果你不能控制这段代码,你可以使用setInterval()来“监视”文本框的变化:

// Check the textbox every 100 milliseconds.  This seems to be pretty responsive.
setInterval(watchTextbox, 100);

这种主动监控不会“立即”捕捉到更新,但它似乎足够快,没有可察觉的滞后。正如DrLouie在评论中指出的,如果你需要观察大量的输入,这个解决方案可能无法很好地扩展。您总是可以将第二个参数调整为setInterval()以更频繁或更少地检查。

虽然这个问题是10年前发布的,但我认为它仍然需要改进。这就是我的解。

$(document).on('propertychange change click keyup input paste', 'selector', function (e) {
    // Do something here
});

这个解决方案的唯一问题是,它不会触发从javascript的值改变,如$('selector')。瓦尔(“价值”)。当你从javascript中改变值时,你可以触发任何事件到你的选择器。

$(selector).val('some value');
// fire event
$(selector).trigger('change');

或者排成一行

$(selector).val('some value').trigger('change');

好吧,最好的办法就是把你自己列出的三个基础都做一遍。一个简单的:onblur,:onkeyup等不会为你想要的工作,所以只是把它们结合起来。

KeyUp应该涵盖前两个,如果Javascript正在修改输入框,我当然希望它是你自己的Javascript,所以只需在修改它的函数中添加一个回调。

您可以简单地识别表单中的所有更改者,如下所示

           //when form change, show aleart
            $("#FormId").change(function () {
                aleart('Done some change on form');
            }); 

不幸的是,我认为setInterval胜出了:

<input type=text id=input_id />
<script>
setInterval(function() { ObserveInputValue($('#input_id').val()); }, 100);
</script>

这是最简洁的解决方案,只有一行代码。它也是最健壮的,因为您不必担心输入可以获得值的所有不同事件/方式。

在这种情况下,使用'setInterval'的缺点似乎并不适用:

100ms的延迟?对于许多应用程序来说,100ms已经足够快了。 增加了浏览器的负载?一般来说,在页面上添加大量的重量级setinterval是不好的。但在这种特殊情况下,无法检测到添加的页面负载。 它不能扩展到很多输入?大多数页面的输入不超过几个,您可以在同一个setInterval中嗅探所有输入。