当前位置: 首页 > 面试题库 >

尝试访问以编程方式创建的文档对象时出现“访问被拒绝” JavaScript错误 (IE-only)

徐高懿
2023-03-14
问题内容

我有一个项目,需要使用JavaScript创建<iframe>元素并将其附加到DOM。之后,我需要在<iframe>中插入一些内容。这是一个将嵌入第三方网站的小部件。

我不想设置<iframe>的“ src”属性,因为我不想加载页面。相反,它用于隔离/沙盒我插入其中的内容,这样我就不会遇到CSS或JavaScript与父页面冲突的情况。我正在使用JSONP从服务器加载一些HTML内容并将其插入此<iframe>中。

我的工作正常,但有一个严重的例外-如果在父页面中设置了document.domain属性(可能在部署此小部件的某些环境中),Internet Explorer(可能是所有版本),在尝试访问已创建的此<iframe>的文档对象时,在6、7和8中确认)给我一个“访问被拒绝”错误。在我测试过的任何其他浏览器(所有主要的现代浏览器)中都没有发生。

这很有道理,因为我知道Internet Explorer要求您将将彼此通信的所有窗口/框架的document.domain设置为相同的值。但是,我不知道有什么方法可以在无法访问的文档上设置此值。

有谁知道执行此操作的方法-以某种方式设置此动态创建的

这是我的测试代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Document.domain Test</title>
    <script type="text/javascript">
      document.domain = 'onespot.com'; // set the page's document.domain
    </script>
  </head>
  <body>
    <p>This is a paragraph above the &lt;iframe&gt;.</p>
    <div id="placeholder"></div>
    <p>This is a paragraph below the &lt;iframe&gt;.</p>
    <script type="text/javascript">
      var iframe = document.createElement('iframe'), doc; // create <iframe> element
      document.getElementById('placeholder').appendChild(iframe); // append <iframe> element to the placeholder element
      setTimeout(function() { // set a timeout to give browsers a chance to recognize the <iframe>
        doc = iframe.contentWindow || iframe.contentDocument; // get a handle on the <iframe> document
        alert(doc);
        if (doc.document) { // HEREIN LIES THE PROBLEM
          doc = doc.document;
        }
        doc.body.innerHTML = '<h1>Hello!</h1>'; // add an element
      }, 10);
    </script>
  </body>
</html>

如您所见,如果您在IE中加载此页面,则在我调用alert()时,我确实在


问题答案:

如果在父页面中设置了document.domain属性,则Internet Explorer会提示我“访问被拒绝”

叹。是的,这是IE问题(错误?很难说,因为没有针对这种不愉快现象的记录标准)。创建无src的iframe时,它会document.domain从父文档的那里收到,location.host而不是从document.domain。那时,由于无法更改,您已经迷失了很多。

可怕的解决方法是将srcjavascript 设置为URL:

 iframe.src= "javascript:'<html><body><p>Hello<\/p><script>do things;<\/script>'";

但是由于某种原因,此类文档无法document.domain在IE中的脚本中设置自己的文档(很好的旧“未指定错误”),因此您不能使用它来重新获得父级(*)之间的桥梁。您可以使用它来编写整个文档的HTML,假设该部件在实例化后无需与其父文档进行对话。

但是,iframe JavaScript URL在Safari中不起作用,因此您仍然需要某种浏览器嗅探才能选择要使用的方法。

*:由于其他原因,您可以在IE中document.domain从第二个文档(由第一个文档编写)中设置。所以这有效:

if (isIE)
    iframe.src= "javascript:'<script>window.onload=function(){document.write(\\'<script>document.domain=\\\""+document.domain+"\\\";<\\\\/script>\\');document.close();};<\/script>'";

在这一点上,我的恐惧程度太高了,我已经出局了。我会像David所说的那样做外部HTML。



 类似资料:
  • 问题内容: 为了在具有许多参数的表单中发布AJAX表单,我使用一种解决方案:创建一个,通过POST将表单发布到其中,然后访问的内容。具体来说,我正在访问这样的内容: 我对其进行了测试,并且效果良好。 在某些页面上,我开始出现“访问被拒绝”错误。据我所知,如果iframe是从同一域提供的,则不应发生这种情况。 我很确定它以前可以正常工作。有人知道吗? 如果我不够清楚:我要发布到 同一域 。因此,这不

  • 问题内容: 我在IE11和Ajax中遇到了一个特殊的错误。对于我使用下面的代码发出的几乎所有请求,一切都很好,但是当我尝试与copy + paste方法结合使用时,它会返回“访问被拒绝”错误。所以总结一下 对于我编写的所有功能,此代码在大多数浏览器中均可正常运行 在IE 11 + Windows 8.1中,它在大多数情况下均可运行,但运行特定的复制和粘贴功能时除外 有趣的是,当使用IE 11时,尽

  • 问题内容: 我有2个项目(相互连接和通信)在2个tomcat实例上运行。在我本地,我有2只雄猫在奔跑。在所有不同的浏览器上,一切都很好,但IE却表示访问被拒绝加载Java文件。因此,我包括了一个图书馆,该图书馆可以解决 本地 问题。 但是当我再次将代码部署到DEV环境上2个不同的tomcat实例(在Dev服务器上)时,我看到相同的错误,访问被拒绝。 而且我与项目1相关的所有文件(例如js / cs

  • 我对php和mySQL是完全陌生的,并且正在尝试连接到远程数据库。这是我的代码:- $result=mysql_query(“Select*FROM Constants”); while($ROW=mysql_fetch_array($result)){echo$ROW['name']; echo“ ”;} mysql_close($con); 对这个问题有什么想法吗?马特·蒂亚

  • 问题内容: 场景:A.com上的页面A具有一个包含B.com上的页面B的IFrame。网页B使用jQuery的1.10.1和它 不会 需要页次A.沟通 不管这个事实如何,jQuery在IE9和IE10中都会生成“ SCRIPT5:访问被拒绝”。错误,并且似乎根本不执行任何jQuery。我不需要跨域通信,AJAX请求等,但是我确实需要jQuery来加载和执行B页中没有错误。 有没有办法防止此错误在I

  • 问题内容: 在某种程度上,当我尝试通过命令行访问MySQL时,已经设法解决了该错误: 我尝试使用此HowTo重置密码,但没有任何运气。 我已经卸载了mysql completley并重新安装了,但是仍然需要输入密码。我不知道为什么会这样! 有人可以帮我获得默认安装的MySQL吗? 环境 Fedora Core 10,完全根访问权限,安装了Apache和PHP 感谢您的任何帮助!! 编辑 对于所有想