Как определить, доступен ли iframe, не вызывая ошибку? - PullRequest
9 голосов
/ 19 января 2012

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

Единственное, я хотел бы подавить эти ошибки.К сожалению, попытка / отлов не перехватывает это исключение, и попытка получить доступ к любому из этих свойств, чтобы проверить их, снова вызывает ту же ошибку, что наносит ущерб цели.

Есть ли надежный способ для меня просто проверитьсодержимое iframe доступно без каких-либо сообщений об ошибках?

Спасибо

Редактировать:

Ради контекста и без того, чтобы люди отвечали неуместными комментариями;Я пишу небольшой скрипт, который автоматически изменяет размер iframe на родительской странице в зависимости от высоты документа iframes.Когда пользователь щелкает ссылку внутри iframe, которая указывает за пределы домена, я, очевидно, не смогу определить высоту страницы, но я бы предпочел не вызывать никаких ошибок в консоли и вместо этого обрабатывать исключение изящно.

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

Ответы [ 7 ]

5 голосов
/ 26 января 2012

Если вы можете добавить небольшой JavaScript-код ко всем страницам вашего домена, которые вы хотели бы загрузить в iframe, вы можете использовать window.postMessage, который освобожден от той же политики происхождения. Вероятно, самым простым способом было бы, чтобы дочернее окно отправляло сообщение родителю при загрузке и использовало его вместо onload. Например, вы можете добавить это на каждую страницу:

if (window.parent) document.addEventListener( 'load', function() {
    window.parent.postMessage( "child loaded", "/" );
}, false );

Это отправит сообщение в родительское окно всякий раз, когда страница загружается во фрейме с тем же источником. Затем вы должны слушать это так:

var iframe = document.getElementById( 'your-iframe' );
var origin = window.location.protocol + '://' + window.location.host;
if (window.location.port != 80) origin += ':' + window.location.port;

window.addEventListener( 'message', function (event) {
    if (event.source != iframe.contentWindow
            || event.origin != origin || event.data != "child loaded")
        return;

    // do here what you used to do on the iframe's load event
}, false );

Обратите внимание, что в примерах используется API-интерфейс событий W3C / Netscape, и поэтому он не будет работать в Internet Explorer до версии 9.

2 голосов
/ 28 января 2012

Попробуйте это:

var $frame = $("#frameId"); // swap with the id of the iframe
try {
    var canAccess = $frame.contents();
    if(!!canAccess) {
       // same domain yay you have access
       // do your thing here
    }
}
catch( e ) {
    // bummer can't do much with it
    return false;
}

РЕДАКТИРОВАТЬ: добавить попытку и поймать, ошибка не вернет false.

0 голосов
/ 28 января 2012

Как насчет того, чтобы вообще не отображать IFRAME (в пределах родительской страницы), если его href не указывает на тот же протокол и хост, что и родительская страница? Возможно, я неправильно понимаю вещи, связанные с тем, владеете ли вы обоими сайтами или только одним из них (и каким именно). Но если у вас есть сайт родительской страницы, вы сможете сделать это, будь то на сервере (даже до включения IFRAME) или в какой-то момент на клиенте (page-load / doc-load).

0 голосов
/ 27 января 2012

Не могли бы вы сказать мне, как вы устанавливаете src в iframe?
Если вы используете javascript для его динамического изменения, с вашей проблемой легко справиться.

var isXdm = false;
function setSrc(id,src){
   //detect whether src is cross domain then set the variable isXdm
   ...
}

даже в этом случаея не думаю, что это хороший способ решить эту проблему.
надеюсь, что кто-нибудь сможет найти лучшее решение.

0 голосов
/ 24 января 2012

Хорошо, это излишне, не так много, но взломать и, возможно, невозможно в вашей ситуации, но в любом случае:

Вы можете добавить включение javascript во все страницы вашего сайта, которые пытаются получить доступ к открывателю (родительский фрейм) и установите флаг (переменная типа bool stillOnMySite) в значение true.

Тогда

  1. В зависимости от времени: скрипт на страницах вашего сайта устанавливает флаг каждую секундув true, скрипт в родительском iframe каждую секунду устанавливает флаг в false.Опрос iframe в setTimeOut (xxx, 1).Если флаг снова не соответствует действительности, то пользователь покинул ваш сайт, и вам не следует опрашивать iframe, если флаг установлен, если пользователь все еще находится на вашем сайте, вы можете опросить iframe.

  2. Клик на основе: используя jquery для ненавязчивого javascript, скрипт на страницах вашего сайта отслеживает кликвенты по всем ссылкам на странице.Если ссылка выходит за пределы вашего домена, это устанавливает флаг в родительском iframe в значение false.

Конечно, эта теория рушится, если вы не можете добавить скрипт на своем веб-сайте.страниц.

В качестве альтернативы я просто подумал: если ваш iframe всегда запускается на вашем веб-сайте, нет необходимости изменять страницы вашего веб-сайта, просто введите решение n ° 2 из родительского iframe на страницу iframed.

0 голосов
/ 23 января 2012

Не можете ли вы получить доступ к атрибуту src от родителя?

Насколько я понимаю, элемент iframe принадлежит странице 'parent', тогда как объект window, содержащийся сiframe принадлежит странице 'child'.

Это работает для меня:

<html>
<head>
</head>
<body>
<iframe id="ifr" name="ifr" src="http://www.example.com"></iframe>
<input type="button" onclick="showSrc()" value="showSrc" />
<input type="button" onclick="showHref()" value="showHref" />
<script>
    var ifr = document.getElementById('ifr');
    function showSrc() {
        // no warning
        alert(ifr.src);
    }
    function showHref() {
        // warning
        alert(window.frames['ifr'].contentWindow.location.href);
    }

</script>
</body>
</html>
0 голосов
/ 19 января 2012

Вы можете получить текущий URL iframe, используя window.frames['frame_name'].contentWindow.location.href.

Если пользователь отошел от вашего домена, то сделать это невозможно. К сожалению ...

Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...