jquery indexOf与IE的问题

时间:2011-01-15 16:40:22

标签: jquery

我有一个多选字段和一个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");

5 个答案:

答案 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();