错误:拒绝访问属性“处理程序”的权限

我有一个用于Firefox的greasemonkey脚本,昨天它运行得很好。 我今天尝试使用它(没有代码被修改),我注意到它停止工作。 经过进一步检查,脚本现在抛出以下错误:

Error: Permission denied to access property 'handler' 

在以下代码块中抛出此错误:

 $('body').click(function() { // code here }); 

这个错误神奇地开始发生在今天脚本工作正常昨天。 我不明白为什么在尝试做一些基本的事情时会发生这种错误,例如在jQuery中添加事件处理程序。

我的脚本使用的jQuery已经在脚本执行的页面中使用,因此我使用此代码使GM可以访问它:

 var $ = unsafeWindow.jQuery; 

如果需要,可供参考,以下是我在脚本中使用的以下Greasemonkey函数:

 // @grant GM_getResourceText // @grant GM_addStyle // @grant GM_xmlhttpRequest // @grant GM_getResourceURL 

我试过研究这个错误,我找不到任何答案。 所有看似可能有用的问题都涉及iframe,并且在我的代码或运行的网站中找不到单个iframe。 我也尝试删除并重新安装脚本,但没有解决问题。

Greasemonkey 2.0刚被推送到所有设置为自动更新的Firefox浏览器。 (GM 2于2014年6月17日发布,但可能需要几周时间才能完成审核流程。)

Greasemonkey 2.0从根本上改变了unsafeWindow处理 :

向后不兼容的更改:

  • 为了稳定性,可靠性和安全性,特权沙箱已更新,以匹配Add-on SDK对unsafeWindow的新更改。 要将值写入unsafeWindow,您需要使用新方法 cloneInto()exportFunction()和/或createObjectIn()
  • @grant none模式现在是默认模式,未明确提供时将不再隐含授权。 有关更多详细信息,请参阅Greasemonkey 2.0中的后沙箱API更改 。

通常,要点访问页面函数或变量,您可以切换到新方法,但在您的情况下,您使用的是var $ = unsafeWindow.jQuery; – 这总是一个不好的做法。

jQuery是一个特殊情况 ,来回克隆它会破坏事物。
@require jQuery代替,EG:

 // ==UserScript== // @name _YOUR_SCRIPT_NAME // @include http://YOUR_SERVER.COM/YOUR_PATH/* // @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js // @grant GM_getResourceText // @grant GM_addStyle // @grant GM_xmlhttpRequest // @grant GM_getResourceURL // ==/UserScript== ... 

你使用的是不安全的unsafeWindow – 顾名思义,它不是必须“安全”使用 – 问题可能依赖于那里; Firefox中有关跨隔离专区的对象的更改:

https://blog.mozilla.org/addons/2014/04/10/changes-to-unsafewindow-for-the-add-on-sdk/

博客文章提到了Add-on SDK,但更改是在平台上,所以它也会影响Greasemonkey。

因此,您基本上尝试从一个隔离专区(jQuery,来自“unsafeWindow”)获取一个对象,并在您的greasemonkey沙箱中使用。 你现在的方式可能不再适用了。 您可以尝试使用本文中提到的API,但我担心像jQuery这样的整个库可能会有一些问题需要克隆。 实际上,最好的方法可能是在Greasemonkey隔离专区中加载jQuery,而不是重用页面的一个。

该错误可能是“神奇地”开始的,因为您已经更新了您的Firefox版本 – 或者它获得了自动更新。

本页介绍如何在Greasemonkey脚本中加载jQuery: http : //wiki.greasespot.net/Third-Party_Libraries

相关部分是:

 // @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js ... this.$ = this.jQuery = jQuery.noConflict(true); 

根据文档, jQuery.noConflict()将确保脚本的jQuery版本不会干扰页面。

另请参阅: Greasemonkey 1.0中的jQuery与使用jQuery的网站冲突