3

我遇到了一个非常奇怪的情况。我有以下设置:

父窗口有一个对象“bar”,其中包括一个 xml 文档和一些其他属性:

<html>
<head>
<script type="text/javascript">
var foo=null; //used in most report pages
var bar=function(document, boo){
    this.doc=document;
    this.boo=boo;
    this.baz="serge";
};
</script>
<head>  
<body>
    <iframe src="_child1.html"></iframe>
</body>
</html>

第一个子框架通过 ajax 加载一个简单的 xml 文件:

<html>
<head>
<script src="../lib/jquery.min.js"></script>
<script type="text/javascript">
$.ajax({
        url: "books.xml",
        type: "get",
        dataType: "xml",        
        success: function(data) {
            var boo = {
                name: "boo"
            };
            parent.foo = new parent.bar(data, boo);         
            alert(parent.foo.boo.name);
            alert(parent.foo.baz);
            alert(parent.foo.doc.firstChild.nodeName);
            window.location = "_child2.html";
        }
    });
</script>
</head>

<body>
    child1
</body>
</html>

XML 是:

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
    Vaidyanathan Nagarajan
</bookstore>

成功时,它会在父窗口中创建一个“bar”实例并将其存储在再次驻留在父窗口中的“foo”变量中。

然后它输出这些属性(成功)并重定向到第二个子框架。

第二个子框架尝试访问父框架中的“foo”对象并输出其属性:

<html>
<head>
<script src="../lib/jquery.min.js"></script>
<script type="text/javascript">
alert(parent.foo.boo.name);
alert(parent.foo.baz);
alert(parent.foo.doc.firstChild.nodeName);
</script>
</head>

<body>
    child2
</body>
</html>

现在有趣的事情发生了:在 FF 和 Chrome 中,我们看到 3 个属性触发了两次:一次在 _child1 中,第二次在 _child2 中。然而,在 IE9 中,我们只看到 5 个警报!

其原因是parent.foo.doc由于某种原因抛出“Permission denied”。

我相信原因是 IE 以某种方式“记住”xml 文档是在第一个子框架中创建的(可能是出于性能原因),而当第二个子框架尝试访问该对象时,IE 无法找到它(或将其存储在受限制的内存堆栈中)。

此外,当我在没有重定向的情况下尝试这种情况时——只是将这两个子框架放在父框架中——第二个子框架访问父框架的 xml 文档没有问题。

一种解决方法可能是在分配之前在“父母”中克隆那些 xml 文档,但是我们有很多这样的场景,首先我想问一下是否有人有更好的主意?

谢谢。

4

2 回答 2

2

一旦单独的页面被垃圾收集,Internet Explorer 绝对不会让您使用分配在单独页面中的 JavaScript 对象。您可以传递原始值,但我在帧之间传递“日期”实例时遇到了问题(很久以前,但仍然存在)。

您可以使用的一个技巧是在父页面中调用一个函数来从原始值创建您的对象:

// in parent:

function newBar(what, ever) {
  return new bar(what, ever);
}

// in the frame page:

parent.foo = parent.newBar("what", "ever");

认为这将使您免受问题的影响,因为该对象将使用父页面上的 Object 构造函数进行分配,而不是框架页面中的构造函数。在以前的生活中,我开发的应用程序是一个庞大而庞大的东西,涉及无数的 iframe(用于对话框、警告和各种东西)。我一直都遇到这个问题,保持清洁已经很痛苦了,以至于我发誓不再使用 iframe 来处理这类问题。

于 2011-07-17T15:32:43.370 回答
0

只是为了分享一个可以帮助他人的替代解决方案。

由于 IE9 中 iframe 对象的新处理(此处说明http://msdn.microsoft.com/en-us/library/gg622929%28v=VS.85 %29.aspx?ppud=4 )

对于我在 iframe (iframe A) 中的页面被刷新的情况,存储在页面中的现有值被释放。当从另一个 iframe (iframe B) 进行 javascript 调用以访问 iframe A 中的对象时,它出现“权限被拒绝”错误并且脚本停止执行。

最后我使用 javascript try catch 来捕获错误并让脚本继续运行而不是停止执行。

  try {
      var testObj = testObjArray['Object in iframe A'];
  } catch(err) {
      alert(err);
  }

希望这个替代解决方案可以帮助其他人。:)

于 2014-08-14T07:33:56.867 回答