jquery - Select2 取消选择时出错

标签 jquery jquery-select2

我使用带有 multiple select 元素的 select2 来创建一个更简单的用户界面,以便将许多项目添加到选择中。一切正常 - 我可以创建选择器、添加项目和删除项目,但是,当查看我的 Javascript 控制台日志时,我在取消选择项目时收到两个不同的错误。

  1. Uncaught TypeError: Cannot read property 'id' of undefined

  2. Uncaught TypeError: Cannot read property 'query' of null

根据我的发现,这些错误是由以下几行造成的:

$('#eleId').on("select2:unselect", function(){
    $('#eleId').select2();
});

我删除了一些代码来尝试查明错误,但通常此代码块会更新在 select2({...}) 调用中设置的元素的一些属性。在打开和关闭选项选择面板后第一次删除元素时会出现第一个错误,因此如果用户单击选择器,添加一个项目,然后删除该项目,则会引发第一个错误。当打开和关闭选择面板后未立即删除元素时,会发生第二个错误,因此,如果用户要添加三个项目,删除第一个将产生第一个错误,删除第二个和第三个将产生第二个错误每个项目都被删除。

如果我删除函数内的 select2() 调用,错误就会消失,但错误似乎是由 unselect 本身触发的,因为我添加了一个将语句添加到函数末尾,并将在错误打印之前打印。

工作副本:

<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
        <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet" />
        <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script>
    </head>
    <body>
        <select multiple id='eleId'>
            <option>1</option>
            <option>2</option>
            <option>3</option>
        </select>
    </body>
    <script>
        $(document).ready(function() {
            $('#eleId').select2();
        });
        $('#eleId').on("select2:unselect", function(){
            $('#eleId').select2();
        });
    </script>
</html>

最佳答案

经过进一步研究,我发现此错误是由于 select2 在 unselect 事件后没有及时加载 select 元素导致的,因此无法立即找到列出的属性。为了解决这个问题,我需要将 .select2() 调用包装在 setTimeout() 中,如下所示:

$('#eleId').on("select2:unselect", function(){
    setTimeout(function(){
        $('#eleId').select2();
    });
});

这为 select2 在尝试访问此属性之前提供了足够的时间来加载元素。虽然这解决了错误,但在删除选择时,选择面板会产生闪烁效果。为了解决这个问题,我修改了这段时间内处理 opening 事件的方式:

$('#eleId').on("select2:unselect", function(){
    $(this).on('select2:opening', function(e) {
        e.preventDefault();
    });
    setTimeout(function(){
        $('#eleId').select2();
    });
    $(this).on('select2:unselect', function() {
        var sel = $(this);
        setTimeout(function() {
            sel.off('select2:opening');
        });
    });
});

关于jquery - Select2 取消选择时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45713963/

相关文章:

javascript - 根据标签的文本更改 css 类

jquery - 一键触发 2 个事件

jquery - HTML5 : currentTime property

javascript - Aria 属性不会添加到结果中

jquery - select2和远程数据: pre-set value and text avoiding server round-trip

jquery - 输入字段在追加时更改大小

jquery/ajax shoutbox 不刷新内容但提交

jquery - 使用 jQuery.load 时确保在执行 javascript 之前应用 CSS

angularjs - Angular UI/select2 multiple 如何预选值/选项?

javascript - 获取 select2 中的当前元素