jQuery Off()无法在Chrome扩展程序中使用

时间:2016-10-29 15:14:48

标签: jquery google-chrome-extension javascript-events

我已根据https://robots.thoughtbot.com/how-to-make-a-chrome-extension创建了Chrome扩展程序(查看已完成文件的结尾)

我做了两处修改。我使用了JQuery 3.1.1最小化而不是上面页面中给出的旧版本;我改变了content.js:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        if( request.message === "clicked_browser_action" ) {
            $(document).off("touchmove mousewheel mousemove scroll");
        }
    }
);

单击扩展名按钮并打开相应的测试页时,$(document).off()命令无效。它没有给出错误,它只是没有做任何事情。

我已经检查过了。如果我在我想要影响的页面上的控制台中键入$(document).off("touchmove mousewheel mousemove scroll");,它可以正常工作。如果在扩展名中运行,则不是。

我尝试检查扩展名中document是否正确,document.domain在扩展程序中的断点(以及页面控制台)中检查时给出了正确的结果。

我尝试检查jQuery._data( jQuery(document)[0]).events["touchmove"](以及“mousewheel”,“mousemove”,“scroll”)并且它在控制台中工作,但如果我断开扩展名,我会收到错误(Cannot read property 'touchmove' of undefined)。当我进一步检查时,jQuery._data( jQuery(document)[0])给出以下内容:

在控制台中:

Object
    events: Object
    handle: function (e)
    __proto__: Object

在断点处:

Object
    __proto__: Object

我已经尝试过其他一些东西(例如,jQuery是可访问和工作的,等等)。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

您的内容脚本与页面脚本(网页中已存在的脚本)的上下文/范围不同。为了在页面脚本上下文中执行代码,您必须创建一个<script>元素并将其插入到页面的DOM中。

您可以将代码更改为:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        if( request.message === "clicked_browser_action" ) {
            let newScript = document.createElement('script');
            newScript.innerHTML='$(document).off("touchmove mousewheel mousemove scroll");';
            document.head.appendChild(newScript);
        }
    }
);

添加的脚本会运行,因为它现在是DOM中的<script>元素。浏览器识别出添加了<script>元素并在插入它的脚本不再处理时对其进行评估(执行包含的代码)。对于添加到DOM的任何其他元素,它基本上都是一样的。因为它是页面的一部分,所以<script>中的代码会在页面脚本上下文/范围中运行。