<input type="text">的值可以通过多种方式改变,包括:
按键 复制/粘贴 JavaScript修改 由浏览器或工具栏自动完成
我希望在JavaScript函数发生变化时调用它(使用当前输入值)。我希望它能马上被调用,而不是在输入失去焦点的时候。
我正在寻找最干净和最健壮的方法来跨所有浏览器(最好使用jQuery)。
<input type="text">的值可以通过多种方式改变,包括:
按键 复制/粘贴 JavaScript修改 由浏览器或工具栏自动完成
我希望在JavaScript函数发生变化时调用它(使用当前输入值)。我希望它能马上被调用,而不是在输入失去焦点的时候。
我正在寻找最干净和最健壮的方法来跨所有浏览器(最好使用jQuery)。
当前回答
下面是一个工作示例,我使用它来实现一个填充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>");
}
});
});
其他回答
我已经创建了一个样本。希望它对你有用。
var typingTimer;
var doneTypingInterval = 10;
var finaldoneTypingInterval = 500;
var oldData = $("p.content").html();
$('#tyingBox').keydown(function () {
clearTimeout(typingTimer);
if ($('#tyingBox').val) {
typingTimer = setTimeout(function () {
$("p.content").html('Typing...');
}, doneTypingInterval);
}
});
$('#tyingBox').keyup(function () {
clearTimeout(typingTimer);
typingTimer = setTimeout(function () {
$("p.content").html(oldData);
}, finaldoneTypingInterval);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<textarea id="tyingBox" tabindex="1" placeholder="Enter Message"></textarea>
<p class="content">Text will be replace here and after Stop typing it will get back</p>
http://jsfiddle.net/utbh575s/
虽然这个问题是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');
您可以将'input'事件绑定到<input type="text">。这将在每次输入更改(如复制、粘贴、按键等)时触发。
$("#input-id").on("input", function(){
// Your action
})
这段jQuery代码使用.bind()来捕获对任何元素的即时更改,并且应该在所有浏览器上工作:
$('.myElements').each(function() {
var elem = $(this);
// Save current value of element
elem.data('oldVal', elem.val());
// Look for changes in the value
elem.bind("propertychange change click keyup input paste", function(event){
// If value has changed...
if (elem.data('oldVal') != elem.val()) {
// Updated stored value
elem.data('oldVal', elem.val());
// Do action
....
}
});
});
但是,请注意.bind()在jQuery 3.0版本中已弃用。任何使用jQuery 1.7或更新版本的人都应该使用.on()。
不幸的是,我认为setInterval胜出了:
<input type=text id=input_id />
<script>
setInterval(function() { ObserveInputValue($('#input_id').val()); }, 100);
</script>
这是最简洁的解决方案,只有一行代码。它也是最健壮的,因为您不必担心输入可以获得值的所有不同事件/方式。
在这种情况下,使用'setInterval'的缺点似乎并不适用:
100ms的延迟?对于许多应用程序来说,100ms已经足够快了。 增加了浏览器的负载?一般来说,在页面上添加大量的重量级setinterval是不好的。但在这种特殊情况下,无法检测到添加的页面负载。 它不能扩展到很多输入?大多数页面的输入不超过几个,您可以在同一个setInterval中嗅探所有输入。