错误:拒绝访问属性“处理程序”的权限
我有一个用于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的网站冲突
- jquery firefox stopPropagation()
- 将jQuery UI添加到Greasemonkey脚本失败,外部CSS文件
- window.location.replace(href)后面的后退按钮失败;
- 使用xhrFields时的状态代码= 0:{withCredentials:true}在使用Firefox的jQuery $ ajax调用中
- 如果带有键盘触发器的字段出现错误,如何停止AJAX调用
- 如何使用firebug进行调试并显示单选按钮的值
- 在Firefox中,jQuery动画不稳定且断断续续
- 有效JSON上的jQuery getJSON语法错误
- jquery ajax with async false挂起firefox