完整性检查:使用键盘更改事件不是第一次触发

时间:2010-05-21 16:15:49

标签: jquery dom bug-tracking internet-explorer-6

我已经对此进行了大量的研究并发现了一堆报告的问题和解决方案,但普遍的共识似乎是IE6中的所有更改问题都在jQuery 1.4.2中得到修复。

我遇到的问题是jQuery 1.4.2中没有触发更改事件,但它在jQuery 1.3.2中成功触发。这是在IE6中。

我即将为此提交一个错误,但为了我的理智,我想首先在这里发布,看看是否有一些我丢失的愚蠢。我不明白为什么这样做......

<HTML>
<HEAD>
<TITLE>jQuery 1.4.2 Problem </TITLE>

<script src="jquery-1.4.2.min.js" type="text/javascript"></script>
<script>
    $(document).ready( function() {
        $("#firstBox").change(function() {
            alert("CHANGE");
        });

        // ONLOAD of document autofocus into the first element...
        $("form").find(":input:visible:first").focus()
    });
</script>
</HEAD>

<BODY>
<form>

<select id="firstBox">
<option value="" selected="selected">--</option>
<option value="1">One</option>
<option value="2">Two</option>
</select>

<br><br>

<input size="10" id="secondBox">

</form>
</BODY>
</HTML>

够简单吧?在页面上加载,给出第一个元素焦点。第一个元素的更改,警告。

如果您使用鼠标,它会按预期工作。页面加载,焦点在下拉列表中,您更改选项,即可获得警报。

问题在于您是否使用键盘。页面加载,焦点在下拉列表中,按下向下箭头。选项更改。关闭该字段,没有警报。奇怪的。为了使它更奇怪,如果你回到字段并再次更改它(全部使用键盘),更改事件将在此时标签之后触发。

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

我决定应用此修复程序并且有效:

$(function() {
    $("select").keyup(function () {
        $(this).triggerHandler("change")
    });
});

原因是我们的应用程序已经使用IE6一段时间了,并且用户用于选择立即触发更改(字段隐藏/显示)的框。这就完成了。

感谢您的建议

答案 1 :(得分:1)

在第二次更改输入值之前,我遇到了以下代码无效的问题。

$("#General_Value").change(function () {
    $(this).removeClass("parsedValue");
});

我不确定为什么,但我认为其他一些代码(.Net MVC2客户端验证脚本)正在干扰并阻止事件链。

我决定测试普通的旧javascript和它的工作原理

var value = document.getElementById("General_Value");
value.onchange = function () {
    $(this).removeClass("parsedValue");
};

我不喜欢混合jQuery代码和纯javascript,但这是我让它工作的唯一方式。

希望它可以帮助别人!

答案 2 :(得分:0)

答案 3 :(得分:0)

我的表单上有数百个字段,onchange没有第一次触发。 我根据MACCA1的回复做了以下训练:

$(".txt").keyup(function () {
    if (!document.getElementById($(this).attr('id')).onchange) {
        document.getElementById($(this).attr('id')).onchange = ch;
    }
});


function ch() {
    if (!isDirty) {
        isDirty = true;
        isButCli = false;
    }
}