Как проверить, загружен ли iframe или у него есть контент?
У меня есть iframe с id = "myIframe", и здесь мой код для загрузки содержимого:
$('#myIframe').attr("src", "my_url");
Проблема иногда занимает слишком много времени для загрузки, и иногда она загружается очень быстро. Поэтому я должен использовать функцию "setTimeout":
setTimeout(function(){
if (//something shows iframe is loaded or has content)
{
//my code
}
else
{
$('#myIframe').attr("src",""); //stop loading content
}
},5000);
Все, что я хочу знать, это узнать, загружен ли iFrame или имеет контент. Использование iframe.contents().find()
не будет работать. Я не могу использовать iframe.load(function(){})
.
Ответы
Ответ 1
Попробуйте это.
<script>
function checkIframeLoaded() {
// Get a handle to the iframe element
var iframe = document.getElementById('i_frame');
var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
// Check if loading is complete
if ( iframeDoc.readyState == 'complete' ) {
//iframe.contentWindow.alert("Hello");
iframe.contentWindow.onload = function(){
alert("I am loaded");
};
// The loading is complete, call the function we want executed once the iframe is loaded
afterLoading();
return;
}
// If we are here, it is not loaded. Set things up so we check the status again in 100 milliseconds
window.setTimeout(checkIframeLoaded, 100);
}
function afterLoading(){
alert("I am here");
}
</script>
<body onload="checkIframeLoaded();">
Ответ 2
любезно использовать:
$('#myIframe').on('load', function(){
//your code (will be called once iframe is done loading)
});
Обновлен мой ответ по мере изменения стандартов.
Ответ 3
Самый простой вариант:
<script type="text/javascript">
function frameload(){
alert("iframe loaded")
}
</script>
<iframe onload="frameload()" src=...>
Ответ 4
У меня была та же проблема, и я добавил, что мне нужно проверить, загружен ли iframe независимо от междоменной политики. Я разрабатывал расширение Chrome, которое внедряет определенный скрипт в веб-страницу и отображает некоторый контент с родительской страницы в iframe. Я попробовал следующий подход, и это сработало идеально для меня.
PS: в моем случае я могу контролировать контент в iframe, но не на родительском сайте. (Iframe размещен на моем собственном сервере)
Первый:
Создайте iframe с атрибутом data-
например, (в моем случае это была data-
сценарий)
<iframe id="myiframe" src="http://anyurl.com" data-isloaded="0"></iframe>
Теперь в коде iframe используйте:
var sourceURL = document.referrer;
window.parent.postMessage('1',sourceURL);
Теперь вернемся к внедренному сценарию согласно моему случаю:
setTimeout(function(){
var myIframe = document.getElementById('myiframe');
var isLoaded = myIframe.prop('data-isloaded');
if(isLoaded != '1')
{
console.log('iframe failed to load');
} else {
console.log('iframe loaded');
}
},3000);
а также,
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
if(event.origin !== 'https://someWebsite.com') //check origin of message for security reasons
{
console.log('URL issues');
return;
}
else {
var myMsg = event.data;
if(myMsg == '1'){
//8-12-18 changed from 'data-isload' to 'data-isloaded
$("#myiframe").prop('data-isloaded', '1');
}
}
}
Это может не совсем ответить на вопрос, но это действительно возможный случай этого вопроса, который я решил этим методом.
Ответ 5
Я не уверен, что вы можете определить, загружен он или нет, но вы можете запустить событие после его загрузки:
$(function(){
$('#myIframe').ready(function(){
//your code (will be called once iframe is done loading)
});
});
EDIT: Как отметил Джесси Халлетт, это всегда срабатывает, когда загружается iframe
, даже если он уже есть. По существу, если iframe
уже загружен, обратный вызов будет выполняться немедленно.
Ответ 6
Вы можете использовать событие iframe load
для ответа при загрузке iframe.
document.querySelector('iframe').onload = function(){
console.log('iframe loaded');
};
Это не скажет вам, загружен ли правильный контент: Чтобы проверить это, вы можете проверить contentDocument
.
document.querySelector('iframe').onload = function(){
var iframeBody = this.contentDocument.body;
console.log('iframe loaded, body is: ', body);
};
Проверка contentDocument
не будет работать, если iframe src
указывает на другой домен, из которого выполняется ваш код.
Ответ 7
в моем случае это была рамка с перекрестным происхождением и иногда не загружалась.
решение, которое сработало для меня:
если он успешно загружен, то, если вы попробуете этот код:
var iframe = document.getElementsByTagName('iframe')[0];
console.log(iframe.contentDocument);
он не позволит вам получить доступ к contentDocument
и выбросить ошибку перекрестного происхождения
однако, если кадр не загружен успешно, то contentDocument
вернет объект #document
Ответ 8
Когда загружается iFrame, она сначала содержит # документ, поэтому лучше проверить состояние загрузки, проверив, что там сейчас.
if ($('iframe').contents().find('body').children().length > 0) {
// is loaded
} else {
// is not loaded
}
Ответ 9
Отличный способ - использовать JQuery AJAX. Родительский фрейм будет выглядеть так:
<iframe src="iframe_load.php" style="width: 100%; height: 100%;"></iframe>
Файл iframe_load.php загружает библиотеку jQuery и JavaScript, который пытается загрузить целевой URL в AJAX GET:
var the_url_to_load = "http://www.your-website.com" ;
$.ajax({
type: "GET",
url: the_url_to_load,
data: "",
success: function(data){
// if can load inside iframe, load the URL
location.href = the_url_to_load ;
},
statusCode: {
500: function() {
alert( 'site has errors' ) ;
}
},
error:function (xhr, ajaxOptions, thrownError){
// if x-frame-options, site is down or web server is down
alert( 'URL did not load due to x-frame-options' ) ;
} });
ВАЖНО! Пункт назначения должен содержать заголовок "Access-Control-Allow-Origin". Пример в PHP:
HEADER( "Access-Control-Allow-Origin: *" ) ;