防止 IE 中出现“SCRIPT5:访问被拒绝”错误

Posted

技术标签:

【中文标题】防止 IE 中出现“SCRIPT5:访问被拒绝”错误【英文标题】:Preventing "SCRIPT5: Access is denied" error in IE 【发布时间】:2013-06-26 13:37:46 【问题描述】:

场景:A.com 上的页面 A 具有包含 B.com 上的页面 B 的 IFrame。页面 B 使用 jQuery 1.10.1,并且 不需要 需要与页面 A 通信。

不管这个事实,在 IE9 和 IE10 中,jQuery 都会生成“SCRIPT5: Access is denied”。错误并且似乎根本拒绝执行任何jQuery。我不需要跨域通信、AJAX 请求等,但我确实需要 jQuery 来加载和执行页面 B 中没有错误。

有没有办法防止这个错误在 IE9 和 IE10 中出现(并禁止代码执行)? (仅供参考,其他浏览器同样会产生“拒绝访问”错误,但不会妨碍代码执行)


更新:

jsFiddle:http://jsfiddle.net/86q5k/4/

主机页面的内容是(来自 jsFiddle):

<iframe src="http://endorkins.com/test-iframe.html"></iframe>

iFramed 页面的内容是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script>

    <script type="text/javascript">
        $(document).ready(function() 
            console.log('Hello!  Congratulations.  Your browser is neat, and doesn\'t sniff glue! (http://bit.ly/12QTvTT)');
        );
    </script>
</head>
    <body>
    </body>
</html>

Chrome 中的结果(注意控制台中的消息):

在 IE 9.0.8112 中的结果(注意控制台中的消息省略):

【问题讨论】:

你能显示一些代码吗?或者至少是一个 jsfiddle? 我会开始工作的。谢谢! :) JQuery security error in Opera and Internet Explorer的可能重复 【参考方案1】:

我找到了解决方法。这似乎是 jQuery 1.10.1 中的一个错误(“功能”?)。使用jQuery 1.10.0,错误不再出现:

http://jsfiddle.net/86q5k/5/

<iframe src="http://endorkins.com/test-iframe-1.10.0.html"></iframe>

奇怪。很奇怪。如果有人知道在 1.10.1 中发生这种情况的原因以及如何解决它,我(和全球的 jQuery 奴才)肯定会非常有兴趣知道! :)


更新:看起来这是一个合法的 jQuery 1.10.1 错误:http://bugs.jquery.com/ticket/13980


更新:根据@emanuele-greco 的说法,这已在 1.10.2 及更高版本中修复。所以,升级你的 jQuery 版本可能会解决这个问题。

【讨论】:

感谢@EmanueleGreco 的反馈!如果 6 月份只有 1.10.2 可用... :)【参考方案2】:

好的,我发现了同样的问题,并用有史以来最奇怪和最可怕的解决方案解决了它。

我正在尝试使用图像来弹出文件上传对话框,然后在更改事件上执行自动表单提交。我已经辞职了,在 IE 中,用户将不得不单击图像来发布帖子。我将图像放在表单上(就像我在网站上的几个地方一样。这会产生访问被拒绝错误,震惊地我再次单击它,是的得到了错误。在第三次单击时它起作用了。所以我又试了一次结果相同,前两次点击错误,第三次成功。简单的 Javascript 代码像自制肥皂一样丑陋,但现在可以工作是

var files= document.getElementById("newfiles");
files.onchange = addFiles;

function addFiles() 
    try 
        $("#fileupload").submit();
     catch (e) 
        try 
            $("#fileupload").submit();
         catch (e) 
            try 
                $("#fileupload").submit();
             catch (e) 
                alert(e);
            
        
    
;

【讨论】:

哇,这太疯狂了,但它确实有效。在咖啡脚本中查看我的解决方案: submitForm: (retryCount = 0) -&gt; try @formToSubmit[0].submit() catch e if retryCount == 3 console.log("Form submit failed.") 返回控制台。 log("表单提交失败。重试次数:#retryCount + 1。正在重试...") @submitForm(retryCount + 1) 【参考方案3】:

还要确保您没有从 CDN(例如 Google 托管库)加载 jQuery 资产。由于域不同,这违反了 Microsoft 用来防止 Internet Explorer 中的跨站脚本攻击的某些安全协议。

【讨论】:

脚本的域无关紧要。

以上是关于防止 IE 中出现“SCRIPT5:访问被拒绝”错误的主要内容,如果未能解决你的问题,请参考以下文章

同一域的 IE9 中的 Script5 访问被拒绝

SCRIPT5:访问被拒绝。在 IE 上使用 parse.js

SCRIPT5:在 IE9 中对 xmlhttprequest 的访问被拒绝

IE9:设置 document.domain 时访问被拒绝

IFrame 的 JQuery 插件问题

如何防止 IE 中的页面闪烁而 Firefox 中没有出现?