在IE6中,jQuery选择选项列表的更新速度不够快

时间:2010-09-17 16:23:06

标签: jquery html internet-explorer-6

我有一个SELECT列表,我根据ajax调用的结果填充,然后根据以前设置的变量选择其中一个选项。这在IE8上运行得很好,但在IE6上却没有。

这是原始功能:

function LoadCategories(jdata)
{
    var options = '';
    for (var i = 0; i < jdata.length; i++)
    {
        options += '<option value="' + jdata[i].CategoryName + '">' + jdata[i].CategoryName + '</option>';
    };
    $("select#categorySelect").html(options);
    $("select#categorySelect").val(currentPatientCategory).attr('selected',true);
};

在IE6上,这样会产生错误:“无法设置所选属性。未指定错误。”

如果我将最后一个语句改为:

setTimeout('$("select#categorySelect option[value=" + currentPatientCategory + "]").attr("selected", true)', 1000);

这似乎有效。我还尝试使用适当的语法更改.html()以使用.append(),. appendTo()。我也尝试使用一个变量来选择没有成功的项目。同样,他们在IE8上工作,但不在IE6上工作。在所选值设置之前设置alert()也有效。似乎选项没有被快速放入列表中,以便下一个语句实际找到它们,除非我以某种方式延迟选择。

如果没有像setTimeout这样的“解决方法”或者在其他地方移动选择,任何方法都可以正常工作,有效地延迟执行一点?

注意:如果我在setTimeout中将1000更改为100,它会在部分时间内工作,而不是因此我不完全信任此解决方案。

使用jQuery 1.4.2

注意:由于较旧的计算机以及在非常严格的环境中更新法规/挑战,客户端基础要求支持IE6。

编辑:注意我终于到了最后。在通过ajax生成一些数据和在IE6中表现出来的用途之间存在竞争条件。我通过在我的代码中移动一些语句来解决这个问题,以解决针对这样生成的未解析数据对象的解决方案。非常感谢海报,因为它指出了我可行的方向来解决这个问题。

2 个答案:

答案 0 :(得分:1)

我甚至不相信这会使用.html()代替.append().appendTo()。你基本上做的是覆盖select element本身的html代码 所以你真的应该使用.append()

更奇怪的是setTimeout()的事情。

我想你要找的是替换这一行:

$("select#categorySelect").val(currentPatientCategory).attr('selected',true);

用这个:

$("select#categorySelect").find('option').eq(currentPatientCategory).attr('selected', 'selected');

..不要忘记使用.append() ..

参考:.append().eq()

答案 1 :(得分:0)

$("select#categorySelect").val(currentPatientCategory).attr('selected',true);

val(currentPatientCategory)将所选选项设置为其值与currentPatientCategory匹配的选项。这没关系,您不必搜索正确的option元素来设置selected

我不知道链接的.attr电话的用途是什么。 <select>没有selected属性。我想这就是错误试图告诉你的。

options += '<option value="' + jdata[i].CategoryName + '">' + jdata[i].CategoryName + '</option>';

这很危险。您可以在HTML标记中包含一些文本而无需HTML转义。如果该文本中有<&"字符,则标记将中断,如果文本是用户提交的,则会出现跨站点脚本安全问题。

如果您创建包含文字字符串的HTML,则必须 HTML - 将这些字符分别转义为&lt;&amp;&quot;。但是通常更容易使用属性设置方法来设置它们而不是用标记来捣乱:

$('#categorySelect').empty();
for (var i= 0; i<jdata.length; i++) {
    var option= $('<option/>', {text: jdata[i].CategoryName, val: jdata[i].CategoryName});
    $('#categorySelect').append(option);
}

然而更简单的是老式的DOM方式:

var options= $('#categorySelect')[0].options;
options.length= 0;
for (var i= 0; i<jdata.length; i++)
    options[i]= new Option(jdata[i].CategoryName);