错误:访问属性'的权限被拒绝;处理程序'
Error: Permission denied to access property 'handler'
我有一个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 的网站冲突
- "访问被拒绝”;当试图在IE11中打开为程序生成的PDF生成的URL时
- Web 驱动程序管理器更新错误:EACCES,权限被拒绝
- 引导程序模板拒绝在手机上响应
- $q:默认拒绝处理程序
- 拒绝执行内联事件处理程序,因为它违反了CSP.(沙盒)
- 返回Bluebird中被拒绝的承诺和onPossiblyUnhandledRejection处理程序
- 启动节点快速应用程序时拒绝
- Chrome 的网上商店服务器拒绝扩展程序,并显示“错误:清单必须定义版本
- 预编译资产失败.推送被拒绝,无法编译 Ruby 应用程序
- Chrome 扩展程序“拒绝加载脚本,因为它违反了以下内容安全策略指令”
- 为什么我的Mac应用程序中的WebView html拒绝加载JQuery或任何外部脚本
- 我所有的引导程序项目都在Internet Explorer上拒绝了它们的Javascript(所有版本)
- 当我上传新的zip文件时,Phonegap build拒绝更新我的应用程序
- Heroku部署-推送被拒绝,未检测到Cedar支持的应用程序
- node.js Q promise不会通过拒绝处理程序传播异常
- Ext应用程序不能在iframe内运行-权限被拒绝
- 苹果会拒绝下载额外JavaScript的Cordova应用程序吗?
- 错误:访问属性'的权限被拒绝;处理程序'
- Firefox OS特权应用程序:拒绝访问属性'document'创建的新窗口对象
- 简单的Angular 2应用程序给出了“可能未处理的拒绝”.错误