JQuery Mobile «Ошибка загрузки страницы» на 404 и 500 - PullRequest
4 голосов
/ 25 февраля 2012

Я бы хотел, чтобы jQuery mobile осуществлял переход к страницам, если они помечены 500 или 404. Есть ли способ сообщить jqm, что к этим страницам можно переходить?Я видел другие решения, которые перенаправляют на страницу 404, используя $( document ).bind( "pageloadfailed"), но я не хочу этого делать.Я просто хочу отобразить страницу 404 \ 500, созданную моим приложением PHP.Благодаря.

Ответы [ 2 ]

2 голосов
/ 12 сентября 2013

jQuery Mobile знает, что коды состояния HTTP 404 и 500 являются кодами ошибок, и поэтому автоматически выполнит поведение ошибки по умолчанию, если вы специально не скажете ему сделать иначе. jQuery Mobile docs сообщает о событии pageloadfailed:

По умолчанию после отправки этого события платформа отобразит сообщение об ошибке страницы и вызовет reject() для отложенного объекта, содержащегося в объекте данных события. Обратные вызовы могут помешать выполнению этого поведения по умолчанию, вызывая preventDefault() для события.

Итак ... стандартное поведение - перехватить ваш запрос и показать свое собственное «сообщение об ошибке страницы». только способ получить что-то помимо поведения по умолчанию - переопределить настройку по умолчанию. Вы do должны написать обработчик события pageloadfailed, но вам не нужно перенаправлять на другую страницу 404, вы можете просто использовать HTML-код, возвращенный из вашего приложения. Вы можете остановить поведение по умолчанию с метко названным методом preventDefault(). Это говорит jQuery, что вы сами обработаете ошибку - и здесь вы можете просто передать HTML-код, который вернуло ваше приложение для отображения. Опять же из документов:

Обратные вызовы, которые вызывают preventDefault() для события, ДОЛЖНЫ вызывать resolve() или reject() для этого объекта, так что changePage() запрашивает возобновление обработки.

Вот код, который вызывает resolve(), чтобы вы могли передать HTML для отображения:

$( document ).bind( "pageloadfailed", function( event, data ) {

    // Let the framework know we're going to handle things.
    event.preventDefault();

    // at some point, either in this callback, or through
    // some other async means, call resolve, passing in
    // the following args, plus a jQuery collection object
    // containing the DOM element for the page.

    // Extract the HTML response from the Ajax request
    var page = data.xhr.responseText;

    data.deferred.resolve( data.absUrl, data.options, page );

});
0 голосов
/ 06 февраля 2014

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

Например:

$( document ).on( "pageloadfailed", function( event, data ) {

    event.preventDefault();

    var page = $( data.xhr.responseText );

    // make sure that the content is displayed
    $.mobile.pageContainer.append( page );

    data.deferred.resolve( data.absUrl, data.options, page );
});
...