错误:访问属性'文档'的权限被拒绝

时间:2011-11-03 12:55:12

标签: javascript

如何在Firefox中修复此消息?我正在使用一个有锚标签的Iframe?我想获得对此锚点的引用,但是当我尝试访问锚点时,我收到此错误:

var frameWindow = document.getElementById('myIframe').contentWindow;
var anchor = frameWindow.document.links[0]; //.getElementsByClassName('a');
anchor.onclick....

2 个答案:

答案 0 :(得分:21)

Relaxing the same-origin policy

在某些情况下,同源政策限制性太强,对使用多个子域的大型网站造成问题。以下是放松它的四种技巧:

document.domain property

如果两个窗口(或框架)包含将域设置为相同值的脚本,则这两个窗口将放宽同源策略,并且每个窗口可以与另一个窗口进行交互。例如,从orders.example.com和catalog.example.com加载的文档中的协作脚本可能会将其document.domain属性设置为“example.com”,从而使文档看起来具有相同的来源并使每个文档都能够读取另一个的属性。这可能并不总是有效,因为存储在内部表示中的端口可以标记为null。换句话说,example.com端口80将成为example.com端口null,因为我们更新了document.domain。端口null可能不会被视为80(取决于您的浏览器),因此可能会失败或取决于您的浏览器。

Cross-Origin Resource Sharing

放宽同源策略的第二种技术正在以跨源资源共享的名义进行标准化。该草案标准使用新的Origin请求标头和新的Access-Control-Allow-Origin响应标头扩展了HTTP。它允许服务器使用标头显式列出可能请求文件或使用通配符的起源,并允许任何站点请求文件。诸如Firefox 3.5和Safari 4之类的浏览器使用这个新标头来允许XMLHttpRequest的跨源HTTP请求,否则这些请求将被同源策略禁止。[7]

Cross-document messaging

另一项新技术,跨文档消息传递允许来自一个页面的脚本将文本消息传递到另一个页面上的脚本,而不管脚本来源如何。在Window对象上异步调用postMessage()方法会在该窗口中触发"onmessage"事件,从而触发任何用户定义的事件处理程序。一个页面中的脚本仍然无法直接访问另一个页面中的方法或变量,但它们可以通过此消息传递技术安全地进行通信。

JSONP

JSONP允许页面通过向页面添加<script>元素来接收来自不同域的JSON数据,该页面从不同的域加载JSON响应。

函数调用是&#34; P&#34; JSONP-the&#34; padding&#34;围绕纯JSON,或根据some&#34;前缀&#34;。按照惯例,浏览器在其对服务器的请求中提供回调函数的名称作为命名查询参数值,通常使用名称jsonp或callback作为命名查询参数字段名称,例如,

<script type="application/javascript"
        src="http://server2.example.com/Users/1234?jsonp=parseResponse">
</script>

在此示例中,收到的有效负载为:

parseResponse({"Name": "Foo", "Id": 1234, "Rank": 7});

答案 1 :(得分:10)

如果iframe指向其他域,则会出现此错误。这是您的浏览器阻止跨站点脚本编写的示例:http://en.wikipedia.org/wiki/Cross-site_scripting