为什么不完全支持: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作为键,每个键都包含对象数组,这些对象数组包含诸如namespace
和selector
之类的属性。
然后,您可以迭代各种事件并执行类似的操作:
/**
* @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/