为什么不完全支持:not()方法中的:has().off()选择器?

$(document).off()取消绑定文档中的所有事件。

$(document).off('.MyNamspace')取消绑定使用名称空间'MyNamspace'创建的所有事件,例如$(document).on('click.MyNamespace','a',function(){})



$(document).off(':not(.MyNamspace)')返回正则表达式错误

以后可以实现吗?

问题更详细:

假设我有一个HTML基本框架,例如导航栏和一些事件将其与定义的限定符绑定在一起。在此框架中,一个容器包含变量内容和动态加载的JavaScript,还绑定了事件在动态加载的容器中的元素。

如果内容发生更改,我还希望删除关联的JavaScript部分和所有事件,除了我自己(以及其他类似bootstraps事件)为框架创建的事件。

动态加载的JavaScript严格加载到以下对象中:

foo = new whatEverYouWant();


当容器的内容将被其他内容替换时,我将foo设置为undefined或null,所有定义的变量和方法都消失了。

但是,如果用户分配了一个事件,例如:

$(document).on('mousemove', function(e) {
  console.lg(e,'bla bla bla');
});


删除内容后将保留该事件。

最佳答案

没有神奇的方法来过滤名称空间。

但是,您可以使用$._data(element,'events')访问分配给元素的所有jQuery事件。

返回的对象使用eventName作为键,每个键都包含对象数组,这些对象数组包含诸如namespaceselector之类的属性。

然后,您可以迭代各种事件并执行类似的操作:



/**
 * @param {DomNode} element - Element to remove namespaced events from.
 * @param {array} keepNamespaces - Array of namespaces not to remove.
 */
function removeOtherNameSpaces(element, keepNamespaces) {
  var events = $._data(element, 'events'),
      $el = $(element);

  $.each(events , function(eventName, arr) {
    $.each(arr, function(_, obj) {
      if (!obj) return;

      if (obj.namespace && $.inArray(obj.namespace, keepNamespaces) === -1) {
        console.log('Removed:: Event:',eventName,', namespace: ', obj.namespace)
        $el.off('.' + obj.namespace);
      }
    });
  });
}

// DEMO
$(document).on('click.click-1', 'p', function() {
  console.log('Namespace: click-1 triggered')
}).on('click.click-2', 'p', function() {
  console.log('Namespace: click-2 triggered')
}).on('mouseenter.mouse-1', 'p', function() {
  console.log('Namespace: mouse-1 triggered')
})

$('button').click(function() {
  var keepNamespaces = ['click-1'];
  removeOtherNameSpaces(document, keepNamespaces)
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>
  Hover & Click me - before click button
</p>
<button>
  Remove namespace events
</button>





这也可以扩展为仅从特定的委托目标选择器中删除事件。

关于javascript - jQuery:not()选择器在.off()方法中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45237328/

10-09 16:04
查看更多