Java-скрипт, сложность получения списка всех вложенных фреймов на странице

Привет мне нужно получить список всех кадров для моего GreaseMonkey сценарий, но на самом деле я думаю, что это общий вопрос Javascript. Было бы здорово, если бы я мог добраться до каждого кадра, вложенного в страницу. До сих пор у меня была проблема с получением количества фреймов, вложенных в основные фреймы документов.

страница, с которой я имею дело, состоит из frameset что это многоуровневая и фреймы содержат другие фреймы. Мне удалось получить информация о фреймах верхнего уровня набора фреймов основного документа (в коде

3 ответов


проблема-это событие, которое вы называете этим. $(document).ready() запускается при загрузке текущего DOM. Таким образом, он запускается, когда загружаются 3 основных фрейма. Но в этот момент эти кадры не загрузили их iframes еще. Изменив событие на


Решение Рабочего Кода

используйте рекурсивную функцию и window load событие, например (работает в последних версиях Chrome, FireFox и Edge; не тестировал другие. Вероятно, работает и в IE5+).

используйте этот код на своем верхнем уровне frameset, frame0.НТМ:

<!DOCTYPE HTML Frameset DTD>
<html>
<head>
<script>
window.onload = function()
{
    var allFrames = [];
    function recursFrames(context)
    {
        for(var i = 0; i < context.frames.length; i++)
        {
            console.log(context.frames[i].name + " -- " + context.frames[i].location.href);
            allFrames.push(context.frames[i]);
            recursFrames(context.frames[i]);
        }
    }
    recursFrames(window);
    console.log("Frames count: " + allFrames.length);
}
</script>
</head>
<frameset cols="25%,*,25%">
  <frame id="frmain1" name="main1" src="frame0_1.htm">
  <frame id="frmain2" name="main2" src="frame0_2.htm">
  <frame id="frmain3" name="main3" src="frame0_3.htm">
</frameset>
</html>

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

HTML 5 напоминание

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


frameset не поддерживается в в HTML5.

пожалуйста, смотрите следующую демонстрацию:frameset Demo. Я изменил файлы htm. Идея состоит в том, чтобы прослушать событие frameset onload и получить доступ к его содержимому после запуска события onlnoad.

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