IE9 "отказано в разрешении" для документа XML, который был создан фреймом, который больше не существует - PullRequest
3 голосов
/ 17 июля 2011

Я попал в действительно странную ситуацию.У меня есть следующие настройки:

В родительском окне есть объект "панель", который включает в себя 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>

Первый дочерний кадр загружает простой XML-файл с помощью AJAX:

<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 мы видим, как три свойства срабатывают два раза: один раз в _child1 и второй в _child2.Однако в IE9 мы видим только 5 предупреждений!

И причина этого в том, что parent.foo.doc по какой-то причине выдает «Отказано в доступе».

Я считаю, что причина в том, что IE как-то «помнит», что документ XML был создан впервый дочерний кадр (возможно, по соображениям производительности) и когда второй дочерний кадр пытается получить доступ к этому объекту, IE не может его найти (или сохраняет в ограниченном стеке памяти).

Более того, когда япопробовал этот сценарий без перенаправления - просто поместив эти два дочерних фрейма в родительский фрейм - у второго дочернего фрейма не было проблем с доступом к XML-документу родителей.

Одним из обходных путей может быть клонированиеэти XML-документы внутри «родителей» до назначения, но у нас есть много подобных сценариев, и сначала я хотел бы спросить, есть ли у кого-нибудь идея получше?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 июля 2011

Internet Explorer абсолютно не позволит вам использовать объект JavaScript, размещенный на отдельной странице, после того, как эта отдельная страница будет собрана сборщиком мусора.Вы можете передавать примитивные значения, но у меня были проблемы (давным-давно, но все же) с экземплярами «Date», передаваемыми между кадрами.

Уловка, которую вы можете использовать, - это вызвать функцию в родительском элементестраница для создания вашего объекта из примитивных значений:

// in parent:

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

// in the frame page:

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

Я думаю , который защитит вас от проблем, потому что объект будет размещен с конструктором объекта на родительской странице, ине тот, что на странице кадра.В прошлой жизни приложение, над которым я работал, было огромным пространством, включающим миллиард фреймов (для диалогов, предупреждений, всевозможных вещей).У меня была эта проблема все время, и держать вещи в чистоте было достаточно больно, и я поклялся использовать фреймы для такого рода вещей.

0 голосов
/ 14 августа 2014

Просто для того, чтобы поделиться альтернативным решением, которое могло бы помочь другим.

Я получил проблему с отказом в доступе в IE 9 для нашего веб-приложения из-за новой обработки объекта iframe в IE9 (указано здесь http://msdn.microsoft.com/en-us/library/gg622929%28v=VS.85%29.aspx?ppud=4)

В моем случае, когда страница в пределах iframe (iframe A) была обновлена, существующее значение, сохраненное на странице, было освобождено. Когда был сделан вызов javascript из другого iframe (iframe B) для доступа к объекту в iframe A, он получал сообщение об ошибке «Отказано в доступе» и сценарий останавливал выполнение.

Наконец, я использую javascript try catch, чтобы зафиксировать ошибку и позволить сценарию работать дальше вместо остановки выполнения.

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

Надеюсь, что это альтернативное решение может помочь другим.:)

...