Как найти конкретный элемент внутри вложенных окон iframe

Мне нужно найти конкретный элемент, который находится внутри iframe, из родительского компонента, структура будет примерно такой: (Просто пример)
Edit: See comments below concerning the nature of this example

<iframe id ='if1'>
    <iframe id ='if2'>
        <iframe id ='if3'>
            <iframe id ='if4'>
                <input type='hidden' id ='elementToBeFound'>
            </iframe>
        </iframe>
    </iframe>
</iframe>

Теперь, как я могу сделать это с помощью javascript? (Также может быть jquery или другой помощник)
У меня есть ссылка на первый iframe ('if1'), я хотел искать все дочерние узлы, пока не найду elementToBeFound. Возможно ли это? Заранее спасибо.

Мой вопрос отличается от существующих, потому что я хочу получить доступ к нескольким фреймам внутри iframe, а не только к одному уровню.

Вы хотите найти его по идентификатору? почему бы тебе не использовать getElementById?

gmaziashvili 04.01.2019 11:52

Это не сработает, все, что находится между тегами iframe, никогда не будет отображаться в современных браузерах. Кроме того, ни один из этих окон iframe не имеет атрибута src или srcdoc, что еще больше ухудшает его работу.

zer00ne 04.01.2019 11:53

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

Eliâ Melfior 10.01.2019 11:32

Привет, @ EliâMelfior, рад, что ты решил проблему.

zer00ne 10.01.2019 11:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
1 145
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я считаю, что что-то вроде этого должно работать:

const elem = document.getElementById('if1').contentDocument
.getElementById('if2').contentDocument
.getElementById('if3').contentDocument
.getElementById('if4').contentDocument
.getElementById('elementToBeFound')

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

Вы можете получить элемент div с помощью вызова iframe.contentWindow.

Вот пример:

NOTE : You have to use "src" (external iframes) to make it work

   <!DOCTYPE html>
    <html>
    <head>
      <title>IF1</title>
    </head>

    <body>
      <iframe id='if1' src = "./iframe2.html">
        <!-- <iframe id='if2'>
          <iframe id='if3'>
            <iframe id='if4'> -->
              <!-- <div id='elementToFind'>Hello</div> -->
            <!-- </iframe>
          </iframe>
        </iframe> -->
      </iframe>

      <script>

        window.onload = function() {
          let if1 = document.getElementById('if1').contentWindow;
          let if2 = if1.document.getElementById('if2').contentWindow;
          let div = if2.document.getElementById('elementToFind');
          console.info(div)
        }

      </script>
    </body>

    </html>

Вы можете использовать эту функцию для запроса любого элемента на странице, независимо от того, вложен ли он внутри iframe:

function querySelectorAllInIframes(selector) {
  let elements = [];

  const recurse = (contentWindow = window) => {

    const iframes = contentWindow.document.body.querySelectorAll('iframe');
    iframes.forEach(iframe => recurse(iframe.contentWindow));
    
    elements = elements.concat(contentWindow.document.body.querySelectorAll(selector));
  }

  recurse();

  return elements;
};

querySelectorAllInIframes('#elementToBeFound');

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

Другие вопросы по теме