有没有办法检查一个元素是否已经应用了jQuery Select2?

52

我想将 select2 应用于页面上所有具有相同类名的 jQuery 元素,但是如果在已经调用 select2() 的元素上再次调用 select2(),则会出现错误。下面是我的代码:

 $('.MyDropdowns').each(function (i, obj) {
    $(obj).select2({ width: "455px" });
});

所以我想要类似这样的东西:

 $('.MyDripdowns').each(function (i, obj) {
    if (!$(obj).HasSelect2Initiatized)
    {
        $(obj).select2({ width: "455px" });
    }
});

有类似的东西吗?


看起来它隐藏了调用它的元素,所以你可以尝试使用 if($(obj).is(":visible")) - MDEV
这似乎并不是很可靠,因为如果元素由于其他原因被隐藏了呢? - leora
为什么要调用两次 select2() 函数? - zed
@leora 嗯,放弃那个想法吧 - 以前从未使用过那个插件,遗憾的是他们的插件不像其他插件一样使用“实例”选项。下面sMr的答案看起来是正确的选择。 - MDEV
4个回答

103

您可以检查元素是否具有select2属性。

$('.MyDripdowns').each(function (i, obj) {
    if (!$(obj).data('select2'))
    {
        $(obj).select2({ width: "455px" });
    }
});

编辑

正如@Fr0zenFyr在v4.0的评论中所说,您可以使用:

if (!$(obj).hasClass("select2-hidden-accessible"))


这仍然在后续回发之后乘以我的选择:/ - ErTR
什么是 postbacks 的意思? - semirturgay
服务器端进程,特别是使用UpdatePanel的部分进程。 - ErTR
14
至少在v4.0版本中,if (!$(obj).hasClass(select2-hidden-accessible)) 测试应该有效。我认为使用 data 属性不再起作用。 - Fr0zenFyr
1
@Fr0zenFyr的修改对我有用。只需记住hasClass接受类名字符串即可。 - Marklar
4
现在它已经出现在官方文档中了,参考链接为https://select2.org/programmatic-control/methods#checking-if-the-plugin-is-initialized - cronfy

3

1
上面的答案几乎是正确的。但是当我们在同一页上动态添加元素并将select 2应用于新创建的元素时,会出现问题。此时选择器不仅必须使用类,还必须使用输入类型进行指定。请参考下面的代码。
$('inputp[type="text"].MyDripdowns').each(curr_idx, curr_elem){
    //Check if select 2 is already applied or not
    if($(curr_elem).hasClass('.select2-offscreen')){
      //Select 2 is already applied to this element
    }
    else{
       //Apply Select 2 to this element 
    }
}

0
...
curSelect.on( 'change', function() {
    curLength = curSelect.select2( 'data' ).length;
    if ( curLength ... ) {
        ...
    }
} );

你的回答可以通过添加更多关于代码的功能和如何帮助问题提出者的信息来改进。 - Tyler2P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接