2016-10-29 72 views
1

我已经创建了一个基于https://robots.thoughtbot.com/how-to-make-a-chrome-extension一个Chrome扩展不工作(看年底完成的文件)jQuery的关()在Chrome扩展

我做了两个改变。我使用JQuery 3.1.1最小化,而不是上面页面中给出的较旧的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是访问和工作,等等)。

任何人都可以帮忙吗?

+0

您是否试图关闭您在内容脚本中添加的事件侦听器,或者已经存在于页面脚本中的事件侦听器(即属于网页的一部分)?这听起来像你试图关闭的事件在页面脚本中。 – Makyen

+0

我试图关闭页面脚本中已经存在的事件监听器(即,是网页的一部分)。 –

回答

2

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

你可以更改您的代码:

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>中的代码将在页面脚本上下文/作用域中运行。

+0

令人惊叹!这肯定似乎有效,我会很快将它标记为答案(尽管您可能想要编辑$(document)行中的引号)。虽然(它确实,但是为什么?)......你能澄清一下吗? –

+1

固定。我一直在做太多的降价编辑。它会被运行,因为它是页面中的'