【问题标题】:jQuery - *:not() not excluding elementsjQuery - *:not() 不排除元素
【发布时间】:2016-12-09 17:44:10
【问题描述】:

我的目标是在除<kbd><textarea> 标签之外的所有地方禁用右键单击。我正在使用*:not(kbd,textarea) 排除禁用右键单击-.on('contextmenu', function(e){ e.preventDefault(); });。假设我可以右键单击<kbd><textarea> 标签,但我不能。这很奇怪。

$(document).ready(function(){
  $('*:not(kbd,textarea)').on('contextmenu', function(e){
      e.preventDefault();
  });
});
div {
  width: 170px;
  height: 170px;
  background-color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<kbd>right click me</kbd>
<textarea>right click me</textarea>
can't right click me
</div>

【问题讨论】:

  • contextmenu 事件是否会冒出我的任何机会,以便外部&lt;div&gt;(或&lt;body&gt;)阻止它。编辑:是的,看起来就是这样。
  • $('*:not(kbd,textarea)')替换为$('*:not(kbd):not(textarea))
  • @IvanKaraman:为什么有必要这样做?
  • @FelixKling, contextmenu&lt;div&gt; 外部单击时显示。 @IvanKaraman,我之前尝试过,但不起作用。
  • @Felix Kling:如果你和我一样,并且你绝对鄙视在 jQuery 中使用非标准选择器,那么即使它确实不是,也可以被视为必要的。 (至于 Ivan,我认为他要么没有意识到 :not(kbd,textarea) 在 jQuery 中工作,要么像许多人一样,他过于担心性能并因此更喜欢标准选择器。)

标签: jquery jquery-selectors


【解决方案1】:

要明确:*:not(kbd,textarea) 工作得很好。问题与浏览器中事件的处理方式有关。

大多数事件都会冒泡,contextmenu does as well。由于&lt;kbd&gt;&lt;textarea&gt; 元素在&lt;div&gt; 内,绑定到&lt;div&gt; 的事件处理程序将始终取消contextmenu 事件。

根据您的具体用例,您可以简单地检查事件是否源自元素本身,并仅在这种情况下阻止它:

$(document).ready(function(){
  $('*:not(kbd,textarea)').on('contextmenu', function(e){
      if (this === e.target) {
        e.preventDefault();
      }
  });
});
div {
  width: 170px;
  height: 170px;
  background-color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<kbd>right click me</kbd>
<textarea>right click me</textarea>
can't right click me
</div>

但是,不要将处理程序绑定到每个元素,而是使用事件委托。将处理程序绑定到文档的根并检查事件的来源:

$(document).ready(function(){
  $('body').on('contextmenu', function(e){
      if (!$(e.target).is('kbd,textarea')) {
        e.preventDefault();
      }
  });
});
div {
  width: 170px;
  height: 170px;
  background-color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<kbd>right click me</kbd>
<textarea>right click me</textarea>
can't right click me
</div>

【讨论】:

  • 错字。应该使用e 而不是event。谢谢!
  • 呃,我现在知道出了什么问题,因为我很好奇为什么 div &gt; *:not(kbd,textarea) 也不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2013-07-18
  • 2020-05-22
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多