#javascript #iframe
#javascript #iframe
Вопрос:
Когда у вас есть цикл по всем фреймам на странице, подобной этой:
HTML:
<ul>
<li id="a"><iframe src="..." /></li>
<li id="b"><iframe src="..." /></li>
<li id="c"><iframe src="..." /></li>
</ul>
JS:
for (var i = 0; i < window.frames.length; i ) {
if (window.frames[i].getName() == selector) {
frame_item = ????
break;
}
}
Как я могу получить элемент DOM для <iframe> ? Или, следуя примеру, как я могу получить идентификатор для элемента <li> внутри цикла?
Ответ №1:
ОБНОВЛЕННЫЙ ответ.
window.frames ссылается непосредственно на контекст IFRAME (объект window iframe). AFAIK вы не можете получить объект IFRAME таким образом. Вы можете получить доступ к переменным IFRAME через window.frames[0].myVar .
Чтобы получить все узлы / объекты IFRAME, используйте:
var iframes = document.getElementsByTagName('iframe'); //all iframes on page
for(var i=0; i<iframes.length; i ){
alert(iframes[i].parentNode.id); // LI.id
alert(iframes[i].contentWindow.myVar); //iframe's context
}
В качестве альтернативы вы можете назначить идентификатор элементу UL и
var ul = document.getElementById('ul_id');
var iframes = ul.getElementsByTagName('iframe'); //all iframes in UL
...
Комментарии:
1. window.frames[i].Родительский узел не определен (Chrome)
2. Извините, я виноват. он ссылается непосредственно на контекст iframe. Смотрите обновленный ответ.
3. Та же проблема, что и с ответом Алекса Томаса: я должен вызвать функцию javascript для дочернего iframe. Я не могу доверять дочерней структуре DOM или контейнеру.
4. Вам не обязательно доверять структуре DOM. document.getElementsByTagName является DOM-эквивалентом window.frames. Вы получите объект DOM (IFRAME) для работы или cotnentWindow для вызова его функций. Другой случай — получить идентификатор LIs, если вы не знаете структуру, но вы все равно можете перебирать родительские элементы, чтобы найти конкретный элемент.
Ответ №2:
Для получения элементов из iframe с помощью jquery:
$("iframe_id_or_class").contents().find(*element*)
Обновить
$("ul li").each(function(){
$("iframe", this).contents().find(*element*);
});
Комментарии:
1. jQuery тоже? Хороший звонок моему другу 😉
2. Хорошо, это идеально, но вопрос не в этом 🙂 Мне нужно получить доступ к контексту фрейма из цикла.
3. Это нормально, если вы знаете структуру DOM во внутреннем iframe, но у меня есть доступ только к функциям (стандартный API внутри любого iframe)
Ответ №3:
Я бы НАСТОЯТЕЛЬНО рекомендовал использовать библиотеку jQuery Javascript для написания Javascript в целом, поскольку это упрощает все, но ОСОБЕННО для селекторов, поскольку вы можете использовать селекторы CSS. Итак, в этом случае вы бы использовали
var id = [];
$("ul li").each(function(){
id.push($(this).attr("id"));
});
Редактировать
Это то, что вам нужно?
$("iframe").each(
function(){
if($(this).attr("name")==desired_name)
alert($(this).parent());
}
);
Комментарии:
1. Я использую Jquery, но я упростил проблему здесь до простого кода javascript 🙂 Проблема здесь не в селекторах, а в том, чтобы получить идентификатор внутри этого цикла.
2. этот цикл помещает идентификатор каждого
li
из них вid
массив