Хотите вызвать функцию, если iframe не загружается или загружается?

У меня есть iframe на моей странице. Если iframe не загружается, нужно, чтобы alert отображалось сообщение "pdf не найден", а если iframe загружается, должно alert "pdf открыт".

Кто-нибудь знает, как этого добиться?


person Kunal Vashist    schedule 02.03.2012    source источник
comment
Вы загружаете файл PDF в iframe?   -  person Šime Vidas    schedule 02.03.2012
comment
@ŠimeVidas да. я хочу так, если pdf не может быть загружен с сервера, должно появиться окно сообщения   -  person Kunal Vashist    schedule 02.03.2012
comment
Находится ли PDF в том же домене, что и веб-страница?   -  person Šime Vidas    schedule 02.03.2012
comment
Как вы совершаете звонки Ajax? Какую библиотеку вы используете?   -  person Šime Vidas    schedule 03.03.2012
comment
Нет, я не использовал вызовы ajax для этой части? Mootools я использую   -  person Kunal Vashist    schedule 03.03.2012
comment
Идея состоит в том, чтобы сначала сделать запрос Ajax, чтобы выяснить, действительно ли ответ является документом PDF. С Ajax у вас есть доступ к информации об ответе, поэтому вы можете выяснить, является ли это ответом 200 OK, содержащим PDF-документ (в этом случае вам нужно вручную загрузить PDF-файл в iframe), или ответ 404 Not Found, и Т. Д.   -  person Šime Vidas    schedule 03.03.2012
comment
@ŠimeVidas для фрейма onreadystate можно использовать, но он сообщает только о том, создан ли фрейм или нет.. Он не сообщает о загруженном pdf-документе.. этап создания фрейма интерактивный, загружается, создается   -  person Kunal Vashist    schedule 04.03.2012
comment
Вот почему я предложил сначала сделать Ajax-запрос. Запросы Ajax предоставляют информацию об ответе, которую не предоставляют iframe.   -  person Šime Vidas    schedule 04.03.2012


Ответы (2)


Итак, идея состоит в том, чтобы использовать Ajax-запрос для «проверки» URL. Ajax-запросы позволяют связать обработчики "успеха" и "ошибки" - в отличие от элементов <iframe>, которые предоставляют только обработчик "загрузки".

Конечно, Ajax-запросы ограничены той же политикой происхождения (если веб-сервер не включает CORS), но вы указали, что PDF-файл находится в том же домене, поэтому проблем быть не должно.

Кроме того, вы заявили, что используете библиотеку Mootools — я использую jQuery, поэтому я могу предоставить вам только решение jQuery, но поскольку мы делаем простой Ajax-запрос с обработчиками «успеха» и «ошибки», вы должны быть возможность легко воссоздать решение Mootools на основе моего решения jQuery.

Итак, учитывая iframe и URL:

var iframe = $( '#iframe' )[0]; // reference to IFRAME element
var url = 'files/document1.pdf';

Ajax-запрос:

$.get( url, function () {
    iframe.onload = function () { alert( 'PDF opened!' ); };
    iframe.src = url;
}).error( function () { alert( 'PDF not found' ); });

Демонстрация успеха: http://jsfiddle.net/CZWdL/1/show/
Демонстрация ошибок: http://jsfiddle.net/CZWdL/2/show/< /а>

Таким образом, если Ajax-запрос вызывает событие «ошибка», мы просто немедленно сообщаем сообщение «Не найдено». Однако, если Ajax-запрос вызывает событие «успех», мы назначаем обработчик «загрузки» для нашего элемента IFRAME (этот обработчик «загрузки» в конечном итоге предупредит сообщение «Загружено») и устанавливаем URL-адрес в его свойство src вручную.

person Šime Vidas    schedule 06.03.2012

Вы можете просто добавить этот код в свой iframe, когда он загружен:

<script type="text/javascript">
<!-- 
        window.top.window.callback();
//-->
</script>

И на вашей главной странице:

<script type="text/javascript">
<!--
        function callback() {
                alert("File loaded!");
        }
//-->
</script>

Если ваша функция обратного вызова не вызывается через 30 секунд, вы можете сказать, что ваш PDF-файл не загружен.


Изменить: ваш первый файл (с iframe):

<html>
    <head>
        <script type="text/javascript">
        <!--
            function callback() {
                alert("This file doesn't exist");
            }
        //-->
        </script>
    </head>
    <body>
        <iframe src="load_pdf.php?f=test.pdf" style="width:900px;height:500px;"></iframe>
    </body>
</html>

Второй (файл php):

<?php
$file = $_GET['f'];

if(is_file($file)) {
    header('Content-type: application/pdf');
    readfile($file);
}
else {
    // This file doesn't exist
    echo '
        <script type="text/javascript">
        <!-- 
                window.top.window.callback();
        //-->
        </script>
    ';
}
?>

Не забудьте защитить $_GET['f']

person akiavara    schedule 02.03.2012
comment
Не могли бы вы загрузить пример в скрипке - person Kunal Vashist; 02.03.2012
comment
Я не думаю, что это решение будет работать для этого конкретного сценария, поскольку страница внутри iframe не является HTML, это документ PDF. - person Fenton; 02.03.2012