Преобразование AJAX в вызов, отличный от AJAX, при ошибке

#javascript #jquery #ajax

#javascript #jquery #ajax

Вопрос:

Допустим, если сервер возвращает страницу 500 при вызове Ajax вместо обычного успешного содержимого, я хочу загрузить эту страницу с ошибкой, загруженную так, как если бы это был вызов, отличный от ajax.

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

Самое близкое, что я получил, это:

 $( "body" ).ajaxError(function(e, jqxhr, settings, exception) {
    $('html').html(jqxhr.responseText);
});
  

Который почти работает, за исключением того, что Javascript страницы не загружен.

Комментарии:

1. Было бы приемлемым использование iframe ?

2. @no.good Конечно, я на самом деле не работал с iframes, поскольку они, похоже, не одобряются, но поскольку это только для отладки, мне все равно. Можете ли вы заполнить iframe содержимым страницы, хранящимся в переменной javascript, и загрузить его так, как если бы это была обычная загрузка страницы? (Т. Е. Вызывается весь Javascript в document.ready и т.д.)

3. Я опубликовал ответ, который показывает, что это работает, используя document.write() в iframe

Ответ №1:

Вот мое решение с использованием iFrame — я загружаю ту же страницу (при успешном выполнении, но вы могли бы сделать это и при ошибке), и при загрузке страница отобразит предупреждение и войдет в консоль, чтобы показать, что скрипты в HTML-ответе работают. Я тестировал это с помощью FF4 и Chrome.

Это основная функция (заслуга:http://www.tek-tips.com/viewthread.cfm?qid=1021687 )

 function loadFrame(frameId, text){
    var ifrm = document.getElementById(frameId);
    ifrm = (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
    ifrm.document.open();
    ifrm.document.write(text);
    ifrm.document.close();
}
  
  • Недостаток, о котором я могу подумать при использовании этого метода, заключается в том, что если HTML-ответ содержит код с перебором кадров или по какой-либо причине зависит от window.location значения, это, скорее всего, завершится неудачей.

  • OTOH, преимущество выполнения этого с использованием iframes по сравнению с использованием .html() метода, предложенного herostwist, заключается в том, что он .html() использует собственное innerHTML свойство браузера, и поэтому поведение становится специфичным для браузера; браузер может удалить его script или head что, вероятно, не поможет вам в отладке. Кроме того, если на вызывающей странице и на странице ответа есть элементы с одинаковым идентификатором, вы можете обнаружить, что обработчики событий не привязываются к элементам страницы ответа. Но если эти случаи неприменимы к вашей ситуации, этого тоже должно быть достаточно.

Ответ №2:

Согласно документации jquery ajax, если вы задаете тип данных в html, «Возвращает HTML в виде обычного текста; включенные теги скрипта вычисляются при вставке в DOM». таким образом, ваш метод должен работать, если вы принудительно вводите тип данных в html.

Комментарии:

1. Для меня, похоже, не работает в jsfiddle. Если бы это сработало, я бы ожидал увидеть содержимое страницы 404 в результате, я вижу только, как появляется и исчезает раздел «start».