#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».