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

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

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

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


当前回答

您可以将'input'事件绑定到<input type="text">。这将在每次输入更改(如复制、粘贴、按键等)时触发。

$("#input-id").on("input", function(){
    // Your action
})

其他回答

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。

您可以将'input'事件绑定到<input type="text">。这将在每次输入更改(如复制、粘贴、按键等)时触发。

$("#input-id").on("input", function(){
    // Your action
})

绑定到输入事件似乎在大多数正常的浏览器中都能正常工作。IE9也支持它,但是实现有bug(删除字符时不会触发事件)。

在jQuery 1.7+版本中,on方法可以像这样绑定到事件:

$(".inputElement").on("input", null, null, callbackFunction);

你就不能用<span contenteditable="true" spellcheck="false">元素来代替<input type="text">吗?

<span>(以contenteditable="true" spellcheck="false"作为属性)与<input>区别很大,主要是因为:

它的样式不是<input>。 它没有value属性,但文本被呈现为innerText,并成为其内部主体的一部分。 它是multiline,而<input>不是,尽管你设置了属性multiline="true"。

要完成外观,当然,你可以用CSS样式,而将值写成innerText,你可以为它获得一个事件:

这是小提琴。

不幸的是,有一些东西在IE和Edge中实际上不起作用,我无法找到。

下面是一个工作示例,我使用它来实现一个填充jqueryui选择器(列表)的自动补全变体,但我不希望它的功能完全像jqueryui自动补全那样做一个下拉菜单。

$("#tagFilter").on("change keyup paste", function() {
     var filterText = $("#tagFilter").val();
    $("#tags").empty();
    $.getJSON("http://localhost/cgi-bin/tags.php?term=" + filterText,
        function(data) {
            var i;
            for (i = 0; i < data.length; i++) {
                var tag = data[i].value;
                $("#tags").append("<li class=\"tag\">" + tag + "</li>");
            }
        }); 
});