Существует ли ограничение на 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, что упростит программные изменения и потенциально уменьшит объем памяти, а также позволит избежать этой проблемы с задержкой загрузки.