Получение ссылки на родительский IFRAME - PullRequest
6 голосов
/ 29 августа 2010

Скажем, у меня есть ссылка на объект документа, который содержится внутри IFRAME. Как получить ссылку на контейнер IFRAME? .parentNode и .ownerDocument оба возвращают ноль.

Обратите внимание, что контекстная информация недоступна (например, такие решения, как 'window.xxx' не будут работать) - все, что доступно, - это ссылка на объект документа.

Спасибо

Ответы [ 2 ]

12 голосов
/ 29 августа 2010

Документ не связан напрямую с родительским документом.Вам нужна ссылка на window, чтобы получить parent.

Свойство DOM Level 2 Views document.defaultView даст вам window в большинстве современныхвеб-браузеры, но в IE вы должны вместо этого использовать нестандартные document.parentWindow.(Некоторые старые или более неясные браузеры не поддерживают ни одно из этих свойств, в этом случае вы застряли.)

Это даст вам window родительского документа.Если вы хотите получить <iframe>, в котором хранится ваш документ, вам нужно будет выполнить итерацию по всем элементам iframe на странице и проверить, является ли содержащийся вами документ самим.

Опять же, метод для получения изЭлемент iframe, возвращаемый потомку, безвозмездно отличается в IE (iframe.contentWindow дает вам window) от стандарта DOM и всех остальных (iframe.contentDocument дает вам document).

Итак, что-тонапример:

function getFrameForDocument(document) {
    var w= document.defaultView || document.parentWindow;
    var frames= w.parent.document.getElementsByTagName('iframe');
    for (var i= frames.length; i-->0;) {
        var frame= frames[i];
        try {
            var d= frame.contentDocument || frame.contentWindow.document;
            if (d===document)
                return frame;
        } catch(e) {}
    }
}

(try... - это предотвращение сбоя цикла при сбое доступа к документу из-за другого iframe, находящегося в другом домене, что вызывает ошибку политики того же источника.)

1 голос
/ 19 декабря 2011

Я использую это:

function get_container_iframe()
         {var rtn_iframe=null;
          var iframes=window.parent.document.getElementsByTagName('iframe');
          for (var i=0; i<iframes.length; ++i)
              {try
                   {var d=iframes[i].contentDocument || iframes[i].contentWindow.document || iframes[i].document; //ie | firefox etc | ie5
                    if (d===window.document)
                       {rtn_iframe=iframes[i];
                        break;
                       }
                   }
               catch(e) {}
              }
          return rtn_iframe;
         }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...