文本框变化事件在Chrome中未触发

3
我有一个文本框。
<input name="tx1" size="10" type="text" id="tx1" class="sample dynamic format" maxlength="10" />

文本框的更改事件和键盘抬起事件绑定到两个不同的函数。

$('.sample.dynamic').change(myJsFunction);


$('.format').keyup(function (e) {
        formatfn(this, e);

    });

这是我的formatfn函数:
function formatfn(sValue, e) {

//Do some formatting

$(sValue).val(newVal);

return newVal;

}

这两个事件在IE和Firefox中都能正常工作,但是在Chrome中,只有keyup函数可以工作,change事件无法触发。

如果我在formatfn中注释掉下面这行代码,那么change事件也会在Chrome中开始触发。

//$(sValue).val(newVal);

但是,我不能在这行上进行评论,因为我需要在每次按键时应用格式。

我已经查看了两个相似的问题 这里这里,但找不到答案。

更新:Formatfn正在执行各种格式化操作,但是为了给您一个关于newval变量的想法,我在此添加了一些相关代码:

var newVal = $(sValue).val();

if (newVal != "")
        newVal = parseInt(RemoveCommas(newVal), 10).toString();

    var sRegExp = new RegExp('(-?[0-9]+)([0-9]{3})');

    while (sRegExp.test(newVal)) {
        newVal = newVal.replace(sRegExp, '$1,$2');

你是否正在寻找每次按键时都触发的更改事件?只有在字段失去焦点时,更改才会触发。 - user229044
不,我喜欢在每次按键时调用“formatfn”,并在“onchange”事件上调用“myJsFunction”。 - user1533453
你没有发布所有的代码,因为你引用了newVal,而这个变量在任何浏览器中都没有定义,会导致出现ReferenceError。 - Esailija
@user1533453 顺便问一下,你有没有查看过 Google Chrome 开发者控制台来查找 JavaScript 错误? - Esailija
啊,我明白你的意思。我之前也遇到过同样的情况。 - RestingRobot
显示剩余8条评论
3个回答

4

您可以通过使用blur来自己编写更改函数:

$('.sample.dynamic').data('last','').on('blur', function() {
    var last = $(this).data('last');
    if (this.value!=''&&this.value!=last) myJsFunction();
    $(this).data('last', this.value);
});

谢谢你提供的解决方法,但我仍在寻找为什么我的代码可以在IE和Firefox中运行,但在Chrome中却不能的原因。 - user1533453
我真的不知道? Webkit在处理更改事件方面存在一些差异,复选框就是一个很好的例子,但我记不起来曾经遇到过文本框的问题! - adeneo

2
同意这与Chromium开发网站上报告的现有错误相关,当值被程序化地更改时,onchange事件不会触发。这些已经在r36和r37(金丝雀)中确认为回归/错误。建议在关于Google Chrome菜单项中检查您的版本。
keyup:https://code.google.com/p/chromium/issues/detail?id=92492 change:https://code.google.com/p/chromium/issues/detail?id=378871 一个简单的解决方法可能是将您的处理程序执行在失焦时而不是更改时,这避免了先前答案中提到的失败的onchange事件。另一个例子是在失焦时显式触发更改事件。
$('.sample.dynamic').on("blur", function(e){ 
     $(this).change();
});

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接