2011-04-03 121 views
4

我试图做一个扩展,解除网站本身添加的点击事件。使用Chrome扩展程序解除点击事件?

网站使用jQuery的,这将使这个出奇的简单:

jQuery('a[rel]').unbind('click'); 

的问题是,我的分机(使用“content_scripts”)无法访问该网站的jQuery对象,因此不具备事件函数来解除绑定。我可以在我的扩展中包含一个jQuery,但这没有帮助,因为jQuery将数据存储在jQuery对象中(而不是在DOM元素中)。我的jQuery不会存储这些事件。

还有别的办法吗?它不一定非常漂亮。也许没有“content_scripts”?

+0

您的分机可以注入一个脚本到它,你需要什么网页? – Pointy 2011-04-03 16:34:57

+0

尖尖的,我可以,但比我需要一个外部脚本保存在互联网上的某个地方。我希望它只是'.crx' ... – Rudie 2011-04-21 19:06:31

回答

4
var unbind_event_listeners = function (node) { 
    var parent = node.parentNode; 
    if (parent) { 
     parent.replaceChild(node.cloneNode(true), node); 
    } else { 
     var ex = new Error("Cannot remove event listeners from detached or document nodes"); 
     ex.code = DOMException[ex.name = "HIERARCHY_REQUEST_ERR"]; 
     throw ex; 
    } 
}; 

只要调用unbind_event_listeners(a_node)即可解除节点上的所有侦听器的绑定。除了document本身之外,这将在文档中的每个节点上工作。至于window,你运气不好。 unbind_event_listeners(document.documentElement)应删除附加到文档中节点的大多数事件侦听器。

a[rel]的情况下,你会想这样做:

var nodes = document.querySelectorAll("a[rel]"), i = nodes.length; 
while (i--) { 
    unbind_event_listeners(nodes.item(i)); 
} 
+0

该函数有点矫枉过正,但'el.parentNode.replaceChild(el.cloneNode(true),el);'巧妙地完成了这个技巧!这个答案正在收藏中! =)谢谢! – Rudie 2011-04-24 12:50:40

-1

如果它不需要是漂亮,你没事处事稍微砍状,这应该强行解除绑定绑定到该元素每次点击收听:

var el = document.querySelector('a[rel]'); 
el.onclick = function() {}; 
el.addEventListener = function() {}; 

或每一个元素:

Array.prototype.slice.call(document.querySelectorAll('a[rel]')).forEach(function(el) { 
    el.onclick = function() {}; 
    el.addEventListener = function() {}; 
}); 

编辑:也许你可以做一些事情,甚至丑陋的和有内容脚本在“document_start”运行,并做到:

Element.prototype.addEventListener = (function() { 
    var real = Element.prototype.addEventListener; 
    return function(ev) { 
    if (ev === 'click' && this.tagName === 'A' && this.hasAttribute('rel')) { 
     console.log('try again, jquery!'); 
    } else { 
     return real.apply(this, arguments); 
    } 
    }; 
})(); 
+1

实际上这是行不通的。我认为解绑定监听器的唯一方法是使用'HTMLElement.removeEventListener',为此您需要初始事件/函数/回调/处理程序(存储在不可访问的'window.jQuery'中)。 – Rudie 2011-04-21 19:05:47

+0

这只是防止绑定新的事件侦听器。我没有看到它解绑定事件监听器的地方。 – 2011-04-23 21:30:23