4

我正在尝试制作一个扩展来取消绑定网站本身添加的点击事件。

该网站使用 jQuery,这将使这变得非常简单:

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

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

还有其他方法吗?它不一定很漂亮。也许没有“content_scripts”?

4

2 回答 2

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));
}
于 2011-04-23T21:08:38.687 回答
-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);
    }
  };
})();
于 2011-04-20T22:12:57.427 回答