我有一个多选字段和一个jquery函数,用于检查select中的更改。该函数查找值“Other”,如果已选中,则显示一个额外的文本字段。
这在chrome和FF中都运行良好,但由于某种原因,IE会在indexOf函数上抛出错误“对象不支持此属性或方法”。
非常感谢任何帮助。
以下是代码:
编辑: 请记住,此代码实际上适用于chrome和FF。只有IE才会抛出错误...
<select name="test" multiple="multiple" id="test">
<option value="one">one</option>
<option value="two">two</option>
<option selected="selected" value="Other">Other</option>
</select>
<input name="Name_Other" type="text" id="Name_Other" class="OtherDisplay" />
$.toggleOther = function (dd, txtOther) {
if ($(dd).val() == null || $(dd).val().indexOf("Other") != 1)
$(txtOther).hide();
$(dd).change(function () {
var sel = $(this).val();
if (sel != null && sel.indexOf("Other") != -1) {
$(txtOther).show();
}
else {
$(txtOther).hide();
}
});
}
$.toggleOther("#test", ".OtherDisplay");
答案 0 :(得分:3)
事实是,IE不会处理Array.indexOf。这是问题的来源。
您可以创建处理程序:
if(!Array.indexOf){
Array.prototype.indexOf = function(obj){
for(var i=0; i<this.length; i++){
if(this[i]==obj){
return i;
}
}
return -1;
}
}
它应该可以解决你的问题。
答案 1 :(得分:1)
尝试使用IndexOf,我有类似的问题,其中indexOf在少数版本的IE中不起作用。 IndexOf适用于所有流行的浏览器以及IE
答案 2 :(得分:0)
$(this).val()
返回本机值(例如String),而不是jQuery对象。你正在执行的indexOf
显然在IE中不存在。由于这几乎肯定是一个字符串,请尝试使用.match()
代替:
if (sel != null && sel.match(/Other/)) {
...
}
答案 3 :(得分:0)
$.toggleOther = function (dd, txtOther) {
dd = $(dd);
txtOther = $(txtOther);
dd.change(function () {
var toggleBool = false;
var sel = $.each($(this).val(), function(i,e){
if (e.indexOf("Other")!=-1) toggleBool=true;
});
txtOther.toggle(toggleBool);
}).change();
};
$.toggleOther("#test", ".OtherDisplay");
代码比原始代码短一些,而且功能更强大
检查是否有任何选定的项目是“其他”,如果是,则显示“其他”文本框。你看,你的选择框是一个多选,所以.val()返回一个数组(即使只选择了一个项目,请参阅文档),所以我们只是遍历数组并检查它们中是否有任何一个是“其他”字段。
或者,如果您想检查仅是否选择了其他字段,则可以使用简单的数组长度检查替换$ .each,然后将相同的条件替换为。
最后,如果你想让代码非常灵活,并且需要多选而不是多选,那么只需检查返回的对象类型.val(),这样你的代码就可以适当地处理stings和数组(参见.val( )docs)。
答案 4 :(得分:-1)
而不是$(this).val()
,请尝试使用:
var sel = $(this).text();