我有一个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中表现出来的用途之间存在竞争条件。我通过在我的代码中移动一些语句来解决这个问题,以解决针对这样生成的未解析数据对象的解决方案。非常感谢海报,因为它指出了我可行的方向来解决这个问题。答案 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()
..
答案 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 - 将这些字符分别转义为<
,&
和"
。但是通常更容易使用属性设置方法来设置它们而不是用标记来捣乱:
$('#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);