Есть ли ограничение на IFRAME, содержащее другой IFRAME с таким же URL? - PullRequest
16 голосов
/ 09 мая 2011

Чтобы немного поэкспериментировать с иерархией фреймов, я написал небольшую html-страницу, которая позволяет вкладывать произвольное количество фреймов (код доступен в конце вопроса).

Однако это не работаетв IE9 и Firefox 4 внутренние рамки создаются, но не отображаются (head и body пусты):

frames screenshot

, а в Chrome он работает длядва уровня, а затем, если я нажму кнопку Add на внутреннем фрейме, ничего не произойдет (в консоли также не будет сообщения об ошибке).

Если я скопирую файл N раз, и каждый файл будет использовать разныефайл работает для любой глубины (но не при наличии цикла).

Я пытался найти такое ограничение, но я, должно быть, не использовал правильные ключевые слова.У кого-нибудь есть ссылки на это?

Вот файл addRemoveFrames.html :

<!DOCTYPE html>
<html>
<head>
    <title>Add and Remove Frames</title>
    <script type="text/javascript">
        function add() {
            var f = document.createElement('iframe');
            f.src = 'addRemoveFrames.html';
            document.getElementById('frameContainer').appendChild(f);
        }
        function remove() {
            var c = document.getElementById('frameContainer');
            var f = c.lastChild;
            if (f)
                c.removeChild(f);
        }
    </script>
</head>
    <body>
        <input type="button" onclick="add()" value="Add"/>
        <input type="button" onclick="remove()" value="Remove"/>
        <hr />
        <div id="frameContainer"></div>

    </body>
</html>

Я изменил @ davin ответ слегка, поэтому URL каждого фрейма отражает его полный путь в иерархии.

var counter = 0;
function add() {
    var f = document.createElement('iframe');
    var sep = location.search ? (location.search + '.') : "?";
    f.src = 'addRemoveFrames.html' + sep + ++counter;
    document.getElementById('frameContainer').appendChild(f);
}

Ответы [ 2 ]

12 голосов
/ 09 мая 2011

Похоже, что разумный механизм безопасности браузера предотвращает бесконечный цикл вложенных фреймов (даже если в вашем случае он не будет бесконечным).

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

Итак, вместо вашей текущей функции add(), что-то вроде этого (я сделал все, чтобы1006 * не ограничивает глобальное пространство имен):

var add = (function(){

  var id = 0;
  return function(){
     var f = document.createElement('iframe');
     f.src = 'addRemoveFrames.html?useless=' + id++;
     document.getElementById('frameContainer').appendChild(f);
  };

})();
7 голосов
/ 09 мая 2011

Вот официальная ссылка: Реализация HTML-фреймов - W3C Рабочий проект 31-марта-97 .Заголовок «Бесконечная рекурсия» и гласит, что если src равен родительскому URL, он должен рассматриваться как пустой.

Я бы порекомендовал метод davin или используйте чистый DOMсоздайте вложенные элементы вместо IFRAME s, что упростит программные изменения и потенциально уменьшит объем памяти, а также позволит избежать этой проблемы с задержкой загрузки.

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