我已根据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是可访问和工作的,等等)。
有人可以帮忙吗?
答案 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>
中的代码会在页面脚本上下文/范围中运行。