【问题标题】:Prevent select2 from opening when a tag is clicked单击标签时防止 select2 打开
【发布时间】:2022-04-23 02:59:20
【问题描述】:

这个问题演变成阻止下拉菜单在输入键按下时打开。如您所见,当您在标签输入具有焦点时按 Enter 键时,我的丑陋解决方案会使用 setTimeout 关闭下拉列表。如何防止它在进入时完全打开,而不是在打开后关闭它?

以下是一些可能有用的事件: https://select2.org/programmatic-control/events

var tagClick = false;
$(document).on('mousedown touchstart', '.tag', function(e) {
  var $self = $(this);
  tagClick = true;
});
$(document).on('click', '.tag', function(e) {
  var $self = $(this);
  var $input = $self.find('input');
  $input.select();
});
$(document).on('blur', '.tag input', function(e) {
  var $self = $(this);
  $self.attr('value', $self.val());
  setTimeout(function() {
    $(".tags").select2('close');
  }, 100);
  // Save to db here
});
$(document).on('keydown', '.tag input', function(e) {
	var nl = e.keyCode == 13; // is enter?
	var $self = $(this);
	if( nl )
	{
		$self.blur();
	}
});

$(".tags").select2({
    templateSelection: function(argSelection)
    {
      return $.parseHTML('<span class="tag">'+(argSelection.name || argSelection.text)+'<input type="text" value="" /></span>');
    },
  tags: true,
  width: '100%'
})
.on('select2:opening', function (e) {
  var $self = $(this);
  if( tagClick )
  {
    e.preventDefault();
    tagClick = false;
  }
})
.tag input {
  width: 50px;
  height: 10px;
  margin-left: 5px;
}
.tag input[value=""]:not(:focus) {
  width: 0;
  margin-left: 0;
  background: transparent;
  border: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.7/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.7/js/select2.min.js"></script>

<select class="tags" multiple="multiple">
  <option selected="selected">orange</option>
  <option>white</option>
  <option selected="selected">purple</option>
</select>

【问题讨论】:

    标签: javascript jquery jquery-select2


    【解决方案1】:

    在阅读了一些关于event listeners 的文档后,我编写了这段代码,该代码仅在您单击十字删除标签时才有效,请指定如果您希望在整个标签被点击时阻止下拉菜单,我会查看上面是代码,基本上,我们听到select2:unselecting 事件并通过阻止其正确的打开事件触发来阻止下拉菜单显示:

    $(".tags").on('select2:unselecting', function (e) { 
      $(".tags").on('select2:opening', function (ev) {
        ev.preventDefault();
        $(".tags").off('select2:opening');
      });
    });
    

    下面的工作sn-p:

    $(".tags").select2({
      tags: true,
      width: '100%'
    });
    
    $(".tags").on('select2:unselecting', function (e) { 
      $(".tags").on('select2:opening', function (ev) {
        ev.preventDefault();
        $(".tags").off('select2:opening');
      });
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.7/css/select2.min.css" rel="stylesheet" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.7/js/select2.min.js"></script>
    
    <select class="tags" multiple="multiple">
      <option selected="selected">orange</option>
      <option>white</option>
      <option selected="selected">purple</option>
    </select>

    【讨论】:

    • 谢谢!如果您单击标签,甚至是文本,我希望下拉列表根本不打开。这样做的原因是我想在标签文本中添加一个点击事件,该事件会单独为该标签打开其他选项,而无需为此打开下拉菜单。
    • 我更新了上面的代码。如果你能找到一个更干净的版本,我可以在 select2 中运行而不是在 mousedown 上运行,那会很酷。这似乎有点 hacky,而且似乎也不适用于旧浏览器。
    • 很抱歉更新了这个话题,但我想我正在取得进展。现在我需要弄清楚当输入被 Enter 键模糊时如何防止下拉菜单打开。它有点工作,但不是100%的时间。想法?谢谢!!
    • 是的,它有点棘手,即使我试图在点击标签 span 时阻止 Default(),它也不起作用......
    • 是的,因为 click 在 select2 事件之后。 on mousdown 是之前的,所以我可以使用它。
    猜你喜欢
    • 2018-06-07
    • 2015-10-04
    • 1970-01-01
    • 2020-05-31
    • 2015-08-17
    • 2011-02-19
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多