代码之家  ›  专栏  ›  技术社区  ›  Mark Schultheiss

jQuery select选项列表在IE6中更新不够快

  •  2
  • Mark Schultheiss  · 技术社区  · 14 年前

    我有一个基于ajax调用结果填充的SELECT列表,然后根据前面设置的变量选择其中一个选项。这在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或将select移到其他地方,有效地延迟它的执行一点?

    注意:如果我在setTimeout中将1000改为100,它在一部分时间有效,另一部分时间无效,因此我也不完全信任这个解决方案。

    注:客户端要求IE6必须得到支持,因为旧计算机和更新规则/挑战在一个非常严格的环境集。

    2 回复  |  直到 14 年前
        1
  •  1
  •   jAndy    14 年前

    我甚至不敢相信这会有用 .html() 而不是 .append() .appendTo() select element 它自己。
    所以你真的应该用 .

    setTimeout() 事情。

    我想你要找的是替换这条线:

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

    有了这个:

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

    …别忘了使用 ..

    .append() , .eq()

        2
  •  0
  •   bobince    14 年前
    $("select#categorySelect").val(currentPatientCategory).attr('selected',true);
    

    val(currentPatientCategory) currentPatientCategory . 这是好的,因为它是,你不必去寻找正确的 option 要设置的元素 selected 打开。

    .attr <select> 没有 财产。我想这就是错误想告诉你的。

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

    < , & " 如果文本是用户提交的,则会出现跨站点脚本安全问题。

    如果创建包含文本字符串的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);
    }
    

    然而,更简单的是传统的方法:

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