错误:访问属性'的权限被拒绝;处理程序'

Error: Permission denied to access property 'handler'

本文关键字:拒绝 程序 权限 处理 错误 访问 属性      更新时间:2023-09-26

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

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浏览器中。(通用汽车2于2014年6月17日发布,但可能需要几周时间才能完成审查过程。(

Greasemonkey 2.0彻底改变了unsafeWindow处理:

向后不兼容更改:

  • 为了稳定性、可靠性和安全性,已更新特权沙盒,以匹配附加组件SDK对unsafeWindow的新更改为了将值写入unsafeWindow,您需要使用新方法cloneInto()exportFunction()和/或createObjectIn()
  • @grant none模式现在是默认模式,如果没有明确提供,则将不再隐含授权。有关更多详细信息,请参阅Greasemonkey 2.0中的Sandbox 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"(中获取一个对象,并在您的防油腻沙盒中使用。你现在的做法可能已经行不通了。您可以尝试使用文章中提到的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版本不会干扰页面。

另请参阅:Greasemonkey1.0中的jQuery与使用jQuery 的网站冲突