Существует ли ограничение на IFRAME, содержащее другой IFRAME с тем же URL-адресом?

Чтобы немного поиграть с иерархией кадров, я написал небольшую 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);
}

Ответы

Ответ 1

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

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

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

var add = (function(){

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

})();

Ответ 2

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

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