<input type="text">的值可以通过多种方式改变,包括:
按键 复制/粘贴 JavaScript修改 由浏览器或工具栏自动完成
我希望在JavaScript函数发生变化时调用它(使用当前输入值)。我希望它能马上被调用,而不是在输入失去焦点的时候。
我正在寻找最干净和最健壮的方法来跨所有浏览器(最好使用jQuery)。
<input type="text">的值可以通过多种方式改变,包括:
按键 复制/粘贴 JavaScript修改 由浏览器或工具栏自动完成
我希望在JavaScript函数发生变化时调用它(使用当前输入值)。我希望它能马上被调用,而不是在输入失去焦点的时候。
我正在寻找最干净和最健壮的方法来跨所有浏览器(最好使用jQuery)。
当前回答
你就不能用<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中实际上不起作用,我无法找到。
其他回答
你就不能用<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中实际上不起作用,我无法找到。
实际上,我们不需要设置循环来检测javaScript更改。 我们已经为要检测的元素设置了许多事件监听器。只要触发任何联合国有害事件就能完成这项工作。
$("input[name='test-element']").on("propertychange change click keyup input paste blur", function(){
console.log("yeh thats worked!");
});
$("input[name='test-element']").val("test").trigger("blur");
ofc只有在你对项目的javascript更改有完全控制的情况下才可用。
把这段代码添加到某个地方,就可以了。
var originalVal = $.fn.val;
$.fn.val = function(){
var result =originalVal.apply(this,arguments);
if(arguments.length>0)
$(this).change(); // OR with custom event $(this).trigger('value-changed');
return result;
};
发现这个解决方案在val()不触发change()在jQuery
好吧,最好的办法就是把你自己列出的三个基础都做一遍。一个简单的:onblur,:onkeyup等不会为你想要的工作,所以只是把它们结合起来。
KeyUp应该涵盖前两个,如果Javascript正在修改输入框,我当然希望它是你自己的Javascript,所以只需在修改它的函数中添加一个回调。
如果你不喜欢其他答案,这里有一个稍微不同的解决方案:
var field_selectors = ["#a", "#b"];
setInterval(function() {
$.each(field_selectors, function() {
var input = $(this);
var old = input.attr("data-old-value");
var current = input.val();
if (old !== current) {
if (typeof old != 'undefined') {
... your code ...
}
input.attr("data-old-value", current);
}
}
}, 500);
考虑到您不能依赖于单击和键up来捕获上下文菜单粘贴。