当JQuery-Select2下拉菜单打开时,单击事件被阻止.需要点击两次才能触发点击事件



我在一个页面中有一个下拉菜单和一个提交按钮。这个下拉菜单是使用JQuery-select2版本3.5.3实现的

当JQuery-Select2下拉菜单打开时,单击事件被阻止。所以提交按钮需要被点击两次来触发click事件。

<select id="supId" style="width:300px">
  <option value=""></option>
  <option value="1">Supplier 1</option>
  <option value="2">Supplier 2</option>
  <option value="3">Supplier 3</option>
</select>
<br><br><br><br><br><br><br><br><br>
<input type="button" value="Submit" id="submitBtn" onclick="$('#dispDiv').html('Clicked');">
<br><br>
<div id="dispDiv"></div>
Javascript

$("#supId").select2({
        placeholder: "Select Supplier",
        allowClear: true
    });

查看这里的运行示例

下拉菜单保持焦点处于打开状态,并在下拉菜单外的第一次点击时释放焦点。然后点击事件工作在第二次点击像往常一样。

这与Stackoverflow中鼠标悬停事件被阻塞的问题有关

如何解决这个问题

在花了几个小时搜索后,从网站上得到了一个想法从选择框到另一个需要两次点击

select2.js的drop-mask的自毁中添加如下的"点击转发器"几乎解决了问题

$(document.elementFromPoint(e.clientX,e.clientY)).trigger("click");
$(document.elementFromPoint(e.clientX,e.clientY)).trigger("focus");

详细编辑如下。

首先找到创建下拉蒙版区域(行号:1557在我的js)。这将像下面一样,并在self.close();之后添加上面提到的两行。

// create the dropdown mask if doesn't already exist
mask = $("#select2-drop-mask");
if (mask.length === 0) {
    mask = $(document.createElement("div"));
    mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
    mask.hide();
    mask.appendTo(this.body);
    mask.on("mousedown touchstart click", function (e) {
        // Prevent IE from generating a click event on the body
        reinsertElement(mask);
        var dropdown = $("#select2-drop"), self;
        if (dropdown.length > 0) {
            self=dropdown.data("select2");
            if (self.opts.selectOnBlur) {
                self.selectHighlighted({noFocus: true});
            }
            self.close();
            // The following two lines are newly added
            // Adding this to forward through the mask
            $(document.elementFromPoint(e.clientX,e.clientY)).trigger("click");
            $(document.elementFromPoint(e.clientX,e.clientY)).trigger("focus");
            e.preventDefault();
            e.stopPropagation();
        }
    });
}

这就解决了我的问题。

这在页面上的下拉菜单和其他元素之间工作得很好,但是单击另一个下拉菜单就不工作了。

最新更新