select2加载后如何显示一个类

Posted

技术标签:

【中文标题】select2加载后如何显示一个类【英文标题】:How to show a class once select2 has loaded 【发布时间】:2019-07-09 13:07:15 【问题描述】:

我正在尝试在 select2 加载后将类可见性状态更改为可见。

我已经能够隐藏类,但我的代码的第二部分似乎还没有工作。

jQuery(document).ready(function ($) 
    $('.searchandfilter li').css( 'visibility': 'hidden' )
);

$.when(
    $("select[class*='select2']").select2(
        allowClear: true
    )).done(function () 
        $('.searchandfilter li').css( 'visibility': 'visible' )
    );

【问题讨论】:

你不能在任何事情上使用when/done,它必须是一个“Thenable object”——我相当怀疑select2实际上是一个。但是无论如何,这样一个元素的创建应该几乎立即发生,所以如果你只是初始化你的 select2,然后让其他元素直接在下一行可见是不是不够...? 感谢 Cristiano 的回复.....我遇到了 ios 选择菜单显示一瞬间的问题,,, 这就是为什么我试图等待 select2 加载后再显示它.......你会推荐一种不同的方式吗? 【参考方案1】:

您不应该初始化 select2 ($().select2()),除非您知道页面的 DOM 已准备好 - 即。它应该在您所拥有的 ready(function($)...) 块内。

您错误地使用了$.when() 块。这些用于您在此处未使用的承诺。 done 部分根本不会触发。你应该删除它。

无论如何,除非它正在执行一些花哨的回调,否则$().select2() 函数应该立即初始化 select2,允许您在初始化 select2 的行之后立即隐藏 .searchandfilter 元素。

如果这仍然不起作用,作为最后的手段,我会将您的隐藏逻辑放在 setTimeout() 块中,并检查 select2 是否已使用此初始化:Is there any way to check if an element has jquery select2 already applied to it?

确保您已阅读 jQuery 和 select2 文档以熟悉两者。

【讨论】:

谢谢 Mikepote,我查看了链接并根据答案提出了一个想法,但 Amine KOUIS 下面的答案似乎有效....不幸的是,这并没有解决我的问题IOS选择菜单显示一瞬间,,,我应该从一开始就包含它......【参考方案2】:

您可以使用 show()hide() 来处理列表 <li> 的可见性,就像下面的代码一样:

$(document).ready(function()
    $("#select2").change(function()
        $(this).find("option:selected").each(function()
            var optionValue = $(this).attr("value");
            if(optionValue)
                $(".searchandfilter li").show();
             else
                $(".searchandfilter li").hide();
            
        );
    ).change();
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="select2">
       <option>Choose Text</option>
       <option value="text1">Text 1</option>
       <option value="text2">Text 2</option>
        <option value="text3">Text 3</option>
</select>

 <ul class="searchandfilter">
       <li>Lorem Ipsum</li>
 </ul>

编辑:对于 IOS,选择菜单将显示一瞬间,因此您可以使用 css 添加隐藏类以防止列表 &lt;li&gt; 首先显示,所以这是另一种方法:

$(document).ready(function()
    $("#select2").change(function()
        $(this).find("option:selected").each(function()
            var optionValue = $(this).attr("value");
            if(optionValue)
                $(".searchandfilter li").removeClass("hidden");
             else
                $(".searchandfilter li").addClass("hidden");
            
        );
    ).change();
);
.hidden 
display: none;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="select2">
       <option>Choose Text</option>
       <option value="text1">Text 1</option>
       <option value="text2">Text 2</option>
        <option value="text3">Text 3</option>
</select>

 <ul class="searchandfilter">
       <li class="hidden">Lorem Ipsum</li>
 </ul>

【讨论】:

感谢 Amine KOUIS,这似乎奏效了!!是否仅在将 select2 加载到系统后才显示? .....我等待select2 laod的原因是解决IOS选择菜单显示一瞬间的问题,当我点击下拉菜单时,不幸的是,这并没有解决它.. .....你知道隐藏或禁止显示IOS选择菜单的方法吗? 谢谢@Amine KOUIS...我更新了代码,我仍然看到IOS菜单短暂[screencast.com/t/X1J4WSrfbox]

以上是关于select2加载后如何显示一个类的主要内容,如果未能解决你的问题,请参考以下文章

筛选 YII2 后 Select2 继续加载

Select2 下拉列表如何通过 AJAX 加载结果

如何在 laravel 5.2 中重新加载页面后保留 select2 值?

用户输入3个数据后如何显示select2

jQuery加载后Select2不工作

select2 和 jquery 验证无法正常工作