Зачем проверка родительской функции iframe возвращает true, если не задействованы iframe? - PullRequest
1 голос
/ 10 октября 2011

Это сценарий: у нас есть x.html страница, которую можно загрузить как «автономную» страницу или как фрейм другой страницы y.html (тот же домен),На обеих страницах есть функция с именем setDirtyFlag () , которая просто устанавливает для внутреннего флага значение true или false .Когда x загружается внутри iframe y , он также должен установить родительский флаг dirty с тем же значением.Это код для x и y страниц:

x.html :

<html>
  <head>
    <script>
      var setDirtyFlag=function(val) {
        isDirty = val;
        if (window.parent && window.parent.setDirtyFlag)
          window.parent.setDirtyFlag(val);
      }
      setDirtyFlag(true);
    </script>
  </head>
  <body>
    This is the iframe
  </body>
</html>

y.html :

<html>
  <head>
    <script>
      var setDirtyFlag = function(val) {
        alert('dirty flag set');
      }
    </script>
  </head>
  <body>
    <iframe src="x.html"></iframe>
  </body>
</html>

Вы можете создать два файла в папке и без проблем загрузить y.html , вы увидите предупреждение о том, что установлен флаг dirty,Но если вы загрузите x.html , очевидно, все в порядке, но сценарий входит в рекурсивный цикл, который завершится, когда браузер превысит свои возможности.Вы можете увидеть это, добавив предупреждение внутри if (window.parent && window.parent.setDirtyFlag):

        if (window.parent && window.parent.setDirtyFlag) {
          alert("again");
          window.parent.setDirtyFlag(val);
        }

Почему window.parent определяется, даже если страница не находится внутри iframe?И почему он содержит ссылку на функции в этом кадре?И самое главное, как заставить это работать?

1 Ответ

3 голосов
/ 10 октября 2011

Если у окна нет родителя, свойство parent является ссылкой на себя.

Вы можете просто проверить, если window.parent == window.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...