JavaScript / jQuery: как получить доступ к контенту в iFrame?

Вопрос

Я хочу произвести некие действия с html, который находится внутри iFrame. Я пытался сделать это следующим образом:

$(function(){//document ready
    $('some selector', frames['nameOfMyIframe'].document).doStuff()
});

Но это не работает. Сначала мне выдавалось сообщение, что frames['nameOfMyIframe'] является ‘undefined’. Я так понял, это потому, что надо дождаться загрузки iframe. Однако, после того, как iFrame загружается, я всё равно не могу получить доступ к его переменным (мне выдаётся ошибка, что у меня нет прав доступа, а именно: ‘Permission denied to access property ownerDocument’ или ‘Unsafe JavaScript attempt to access frame with URL’ в зависимости от браузера).

Кто-нибудь знает, как можно получить доступ к контенту в iFrame?


Ответ №1

Наверное, Вы пытаетесь получить доступ к iFrame из другого домена. Это невозможно из-за нарушения концепции правила ограничения домена, которое должно является частью политики безопасности любого нормального современного браузера. Подумайте сами, если бы доступ к iFrame, содержащему сайт из другого домена, можно было получить так легко, то любой бы сайт в интернете мог бы добраться, например, к Вашей почте, или вашему аккаунту в социальных сетях.

Если адрес документа из iFrame находится на том же домене, что и адрес документа, из которого получают доступ, тогда сделать это можно таким-вот образом:

$("#myiframe").contents().find("#somediv").removeClass("hidden");

Следующий пример найдёт все заголовки h2 на странице в iFrame и перечеркнёт их. Ошибки не будет, потому что страница находится на этом же домене. Если бы документ был из другого домена, мы бы получили ошибку доступа.

$("#myiframe").contents().find("h2").css('text-decoration','line-through');

Пример

3 комментария

  • Mike:

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

  • Shintiles:

    В этой строке понятно, а как использовать $(document).ready(function(){ …. }) ? А точнее вместо document нужно написать id фрейма? Если да, то я так пробовал, но не помогло. Буду рад совету!

    • Администратор:

      Нет.. При работе с jQuery весь код почти всегда вставляется в $(document).ready(function(){ …. }). Следовательно, это Вам не надо трогать, просто поместите внутрь то, что Вам нужно (например, функции для работы с фреймом).

Добавить комментарий


(обязательно)