首先,我知道这有been asked before。我再次要求希望更新版本的常见库如jQuery解决了这个问题。这可能是一厢情愿的想法,我知道......
话虽如此,有没有办法检测到<input>
的所有更改(按键,粘贴,自动更正)?我使用$("#myElement").bind('input propertychange', function (e) {...});
直到IE9出现并打破它(它不会在退格/剪切/删除时触发)。
我知道有三个选项,所有选项都有缺点:
setTimeout
忽略重复项。如果还没有“更好的方法”,您更喜欢上述哪种,为什么?
答案 0 :(得分:2)
作为不支持oninput
的浏览器的后备,您可以在该字段上同时使用onkeyup
和oninput
个事件,但会撤消事件处理程序以防止多次执行:< / p>
$('input').on('keyup input', debounce(function() {
// do something
console.log('input'):
}, 500));
var debounce = function(func, wait, immediate) {
var timeout;
return function () {
var context = this, args = arguments;
var later = function () {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
答案 1 :(得分:0)
您可以尝试keypress event。但是,我使用blur event。
对你来说有一点哲学:我发现文本框会以任何方式改变我的文本形状或形式,因为我打字反直觉和讨厌。
当然,对于类似的东西,比如说3场SSN,你想继续检查长度以将它们射到下一个场,但是对于其他所有场景它都是.blur()
。
答案 2 :(得分:0)
如果您只支持现代浏览器,是的,有一种方法可以只使用一个事件进行跨浏览:input
$(myelement).on('input',function(){
console.log(this.value);
});
如果您希望继续支持旧浏览器,则必须继续为它们使用变通方法,因为旧版本的浏览器不会被修复。
我更喜欢将keydown与输入配对,因为keydown会在触发输入事件的同时触发。
答案 3 :(得分:0)
试试这个:
<input type="text" onchange="$(this).trigger('change');">
如果有效,您可以有条件地使用.attr('onchange', '...')
用于有缺陷的浏览器,以避免使用黑客攻击标记。
<script>
<!--[if lte IE 9]>
$('input[type=text]').attr('onchange', '$(this).trigger(\'change\')');
<![endif]-->
</script>