Применить по клику ко всем элементам в iFrame

Как использовать DOM JavaScript для применения событий onclick к ссылкам внутри iframe?

Вот что я пытаюсь, но это не работает:

document.getElementById('myIframe').contentDocument.getElementsByTagName('a').onclick = function();

Никаких ошибок не возникает, и я полностью контролирую содержимое файла iframe.

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

// access body
var docBody = document.getElementsByTagName("body")[0];

// create and load iframe element
var embed_results = document.createElement('iframe');
embed_results.id = "myIframe";
embed_results.setAttribute("src", "http://www.mysite.com/syndication/php/embed.php");

// append to body
docBody.appendChild(embed_results);

// count the divs in iframe and alert   
alert(document.getElementById("myIframe").contentDocument.getElementsByTagName('div').length);

person johnnietheblack    schedule 15.04.2009    source источник
comment
Можете ли вы изменить содержимое страницы iframe?   -  person Daniel A. White    schedule 16.04.2009
comment
Не могли бы вы предоставить еще немного кода, чтобы мы могли искать ошибки? Я хотел бы увидеть контекст, в котором этот код запущен. Проверьте, запускается ли этот код после загрузки содержимого фрейма, а не раньше.   -  person Rafael    schedule 16.04.2009


Ответы (2)


iFrame может получать контент с другого веб-сайта в другом домене.

Возможность доступа к содержимому в других доменах представляет собой уязвимость безопасности для пользователя, поэтому сделать это с помощью Javascript невозможно.

По этой причине вы не можете привязывать события на своей странице к содержимому в iFrame.

person Jon Winstanley    schedule 15.04.2009
comment
Это возможно, если вы контролируете iframe на обоих доменах - связь с iframe - person Tony; 24.03.2010

getElementsByTagName возвращает NodeCollection, поэтому вам нужно выполнить итерацию по этой коллекции и добавить обработчик onclick для каждого узла в этой коллекции. Код ниже должен работать.

var links = document.getElementById('myIframe').contentDocument.getElementsByTagName('a');
for(var i=0;i<links.length;++i)links[i].onclick=function(){}

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

embed_results.onload=function(){
   // your code
}
person Rafael    schedule 15.04.2009
comment
Как уже ответил Джон, политика безопасности JavaScript не позволяет браузеру получать доступ или изменять содержимое страницы из другого домена. - person Rafael; 16.04.2009