【问题标题】:Attach Select2 with onClick() of jQuery使用 jQuery 的 onClick() 附加 Select2
【发布时间】:2022-01-21 09:34:07
【问题描述】:

我正在尝试使用 jQuery 的 onClick() 附加 Select2。我的 HTML 代码是<td class="volunteer" id="47">Bob SMith and admin</td>。我的 jQuery 代码如下所示。

(function($) {
    $(document).ready(function () {
        $(".volunteer").on("click", function () {            
        $(this).html(`<select class="js-example-basic-multiple" name="states[]" multiple="multiple">
                <option value="AL">Alabama</option>
                <option value="WY">Wyoming</option>
            </select>`);
        });
        $('.js-example-basic-multiple').select2();
    });
})(jQuery)

但这不起作用。

【问题讨论】:

    标签: jquery onclick jquery-select2


    【解决方案1】:

    有两个问题阻止加载选择。

    1. select2 的初始化是在 click 事件之外的,因此它发生在 select 元素存在之前页面加载时。这必须在选择添加到 DOM 之后发生。

      $('.js-example-basic-multiple').select2();
      
    2. click 事件在类“志愿者”上注册,并且对单元格的任何点击都会执行此功能,即使在加载选择之后也是如此。当您尝试选择一个选项时,这会导致选择重新加载,从而导致该选项丢失。要解决此问题,您可以检查选择是否已加载。

      if(!$(this).has("select").length) {
      

    (function($) {
      $(document).ready(function() {
        var state = "";
        $(".volunteer").on("click", function(event) {
            // Check if select is already loaded
          if(!$(this).has("select").length) {
            // Populate select element
            $(this).html(`<select class="js-example-basic-multiple" name="states[]" multiple="multiple">
                <option value="AL">Alabama</option>
                <option value="WY">Wyoming</option>
                </select>`);      
                  
            // Initialise select2
            $(this).children("select").select2();
          }
        });
      });
    })(jQuery)
    .js-example-basic-multiple {
      width: 200px;  
    }
    
    thead{
        font-weight: bold;
    }
    
    table, th, td {
      border: 1px solid black;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
    
    <table>
      <thead>
        <tr>
          <td>Table Header 1</td>
          <td>Table Header 2</td>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td class="volunteer" id="47">Click Me</td>
          <td class=""></td>
        </tr>
        <tr>
          <td class="volunteer" id="48">Click Me</td>
          <td class=""></td>
        </tr>
      </tbody>
    </table>

    【讨论】:

    • 谢谢@Chris C。我正在使用这个 HTML &lt;td class="volunteer" id="47"&gt;Bob SMith and admin&lt;/td&gt;。我需要附上Select2。但是您将Select2 与另一个元素&lt;div id='selectContainer'&gt;&lt;/div&gt; 连接在一起。谢谢。
    • @abuabu 。我根据您提供的关于它在 td 元素中的信息对答案进行了一些更新
    • 如果有用,下面的 JS Fiddle 扩展了这个答案,将每一行的选定值存储到一个数组中,如果重新打开选择,则恢复该值jsfiddle.net/etof2u0L
    • 谢谢@Chris C。你的 JS Fiddle 正是我想要的。 let selectEle = cellEle.children("select").select2(); 为什么初始化 select2 以及如何初始化 select2 ?你能解释一下吗?
    • @abuabu 添加选择后的 HTML 结构类似于&lt;td&gt;&lt;select&gt;&lt;/select&gt;&lt;/td&gt;let selectEle = cellEle.children("select").select2(); 行获取单元格 td 的元素,该元素之前已识别并存储在变量 cellEle 中。然后它使用 jQuery 方法 .children("select") 来识别一个子元素 select,然后在这个 select 元素上初始化 select2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2019-03-19
    • 1970-01-01
    • 2021-12-22
    • 2012-07-12
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多