Javascript IE7与我的jQuery[单击并更改函数]有关的问题

Javascript IE7与我的jQuery[单击并更改函数]有关的问题,javascript,jquery,json,Javascript,Jquery,Json,我有以下代码片段。基本上,我要做的是在第一个click函数中循环缓存的JSON数据,并显示该id存在的任何值。在第二个change函数中,每当其中一个元素更改值,即yes到no,我就会捕获,反之亦然 这些元素都是通过我从Web服务接收的JSON数据动态生成的。据我所知,这就是我必须使用.live功能的原因 当然,在Firefox中,一切都按预期进行。然而,在IE7中,它不是。在IE7中,如果我选择了一个单选按钮,该按钮显示来自单击功能的警报,那么它也会添加到已更改功能的数组中。但是,如果单选按钮

我有以下代码片段。基本上,我要做的是在第一个click函数中循环缓存的JSON数据,并显示该id存在的任何值。在第二个change函数中,每当其中一个元素更改值,即yes到no,我就会捕获,反之亦然

这些元素都是通过我从Web服务接收的JSON数据动态生成的。据我所知,这就是我必须使用.live功能的原因

当然,在Firefox中,一切都按预期进行。然而,在IE7中,它不是。在IE7中,如果我选择了一个单选按钮,该按钮显示来自单击功能的警报,那么它也会添加到已更改功能的数组中。但是,如果单选按钮没有通过单击功能执行任何操作,则不会为更改添加阵列

当我看这段代码时,我想我可能能够将这两个函数组合在一起,但是现在我只希望它在IE7中工作

$(document).ready(function () {
    //This function is run whenever a 'radio button' is selected.
    //It then goes into the CPItemMetaInfoList in the cached JSON data
    //($.myglobals) and checks to see if there are currently any 
    //scripts to display.

$("input:radio").live("click", function () {
    var index = parseInt(this.name.split(':')[0]);
    for (i = 0; i <= $.myglobals.result.length - 1; i++) {
        if ($.myglobals.result[i].CPItemMetaInfoList.length > 0) {
           for (j = 0; j <= $.myglobals.result[i].CPItemMetaInfoList.length - 1; j++) {
                if (index == $.myglobals.result[i].QuestionId) {
                    alert($.myglobals.result[i].CPItemMetaInfoList[j].KeyStringValue);
                    return;
                }
            }
        }
    }
});
});

$(document).ready(function () {
    var blnCheck = false;
    //Checks to see if values have changed.
    //If a value has been changed then the isDirty array gets populated.
    //This array is used when the questionSubmit button is clickeds
    $('input').live('change', function () {
        blnCheck = false;

        for (i = 0; i <= isDirty.length - 1; i++) {
            if (isDirty[i] == $(this).attr("name")) {
                blnCheck = true;
                break
            }
        }


    if (blnCheck == false) {
        isDirty[arrayCount] = $(this).attr("name");
        arrayCount += 1;
        alert($(this).attr("name"));
    }
});

$('textarea').live('change', function () {
    blnCheck = false;
    for (i = 0; i <= isDirty.length - 1; i++) {
        if (isDirty[i] == $(this).attr("id")) {
            blnCheck = true;
            break
        }
    }

    if (blnCheck == false) {
        isDirty[arrayCount] = $(this).attr("id");
        arrayCount += 1;
        //alert($(this).attr("name"));
    }
});
});
更新: 我必须将这段代码移到click函数中:

   blnCheck = false;
   for (i = 0; i <= isDirty.length - 1; i++) {
        if (isDirty[i] == $(this).attr("name")) {
            blnCheck = true;
            break
        }
    }


    if (blnCheck == false) {
        isDirty[arrayCount] = $(this).attr("name");
        arrayCount += 1;
        alert($(this).attr("name"));
    }
像这样:

但是

我不得不保持更改功能不变。通过测试,我发现.click功能对IE7中的单选按钮和复选框元素有效,但是.change功能对IE7和FF中的文本框和文本区域以及单选按钮和复选框元素的原始功能有效


这个真的很乱。感谢@Patricia的关注。这里的建议确实让我找到了这个解决方案。我不想回答这个问题,因为我不知道是否有更干净的解决方案。我想这是因为IE在支票和收音机上失去焦点时触发了更改。因此,如果警报弹出,焦点将丢失,因此更改事件将触发

编辑:

尝试将$'input'选择器更改为$'input:not:radio'

因此,单击将触发您的收音机,并更改所有其他收音机

编辑2:

把发生变化的东西放到一个单独的函数中怎么样。使用索引作为参数。然后,您可以通过更改和单击调用该函数。在完成单击操作后,将调用放到该函数。

您正在一个document.ready函数中声明blnCheck变量。你也不需要其中的两个,它可以在一个里面

这意味着您在其中声明的变量将不会是实际调用更改函数时使用的变量,相反,您将得到某种隐式全局变量。不知道这是否是其中的一部分,但可能值得一看。您应该在JS文件的顶部声明这一点。

事实:单选按钮和复选框上的更改事件仅在焦点丢失时(即模糊事件即将发生时)才会触发。为了实现预期的行为,您确实希望挂接click事件

你基本上想要改变

$('input').live('change', function() {
    // Code.
});


不过,我也会考虑使用选择器的复选框,如果表单中有复选框,您希望将它们作为单选按钮同等对待

您使用的是哪个版本的jQuery?好,实际上,我只是再次测试,并注意到它似乎是先做更改,然后只点击那些在点击事件中有结果的。那么我该如何纠正这一点呢?对于我来说,有没有其他更好的方式来安排我的代码呢。在单击部分的代码之后,将更改部分中的所有内容都移动到可以产生预期结果吗?不过,我仍然需要将收音机的“点火”更改为“点火”。@Patricia-你的第一个建议是正确的。但这真的很奇怪。由于IE7的单选按钮和复选框需要移动到单击功能,但我不得不将该功能保留在文本框的更改功能中。所以我不得不做一些复制。谢谢你的帮助。我会更新我的问题。如果有人有更好的解决方案,那我就可以听了。@Jeff:既然你把这个答案标记为接受,我可以假设你的问题已经解决了吗?别忘了赏金,它不是在接受答案时自动授予的。这需要分开做。是的,这是一个很好的解决方案。悬赏是有时间限制的。。。再过46分钟我就不行了@杰夫:很好,不客气。啊,好吧,我不知道那个限制。谢谢提醒!
$('input').live('change', function() {
    // Code.
});
$('input:radio').live('click', functionName);
$('input:not(:radio)').live('change', functionName);

function functionName() {
    // Code.
}