Моя ситуация такова: я разрабатываю небольшое веб-приложение, в котором сервер предоставляет динамические ответы JSON.Сервер построен на cherrypy.Иногда в коде, создающем данные JSON, есть ошибка, которая выдает, и cherrypy перехватывает их и возвращает ошибку 500 с полной HTML-страницей с подробным описанием исключения.(То есть в ответе есть все: <!doctype..><html><head>...</head><body>...</body></html>
) Но поскольку запрос AJAX, он не отображается.
Я могу достаточно легко перехватить эту ошибку и посмотреть на нее в инструментах разработки;но то, что я хотел бы сделать (чтобы облегчить отладку), это открыть новую страницу (как если бы пользователь перешел по ссылке) и отобразить этот ответ в браузере.Я пытался
window.open('', '_self');
$(document).html(jqXHR.responseText);
, но я просто получил пустую страницу.Я полагаю, я мог бы сохранить текст ошибки и подать его во втором запросе к серверу, но есть ли более чистый способ?
Чтобы продолжить, окончательный код, который сработал, был таким:
.error(function(jqXHR, textStatus, errorThrown) {
$(window).bind('unload', function() { document.write(jqXHR.responseText); } );
var win = window.open('', '_self');
return false;
});
Не уверен, что этот окончательный return false
необходим, но кажется, что он в хорошей форме.
Повторяем еще раз: вышеуказанный код надежно работал в Opera.Я думал, что видел, как это работает и в Webkit, но начал замечать, что это не так;и при дальнейшем тестировании он также не работал для Firefox.
То, что я обнаружил, работало на всех трех платформах:
document.open('text/html', true);
document.write(jqXHR.responseText);
document.close();
Не нужно открывать другое окно илисвязывать события;просто заново откройте документ и вставьте туда текст.
Ну, вот и я.Вышеописанная техника либо перестала работать, либо я отключился, когда сказал, что она вообще сработала.В частности, в Chrome не определено document.open
.
Но!Я только что нашел изящную технику, которая, кажется, работает везде:
errtext = 'data:text/html;base64,' + window.btoa(jqXHR.responseText);
window.open(errtext, '_self');
Это просто преобразует ответ в полностью автономный data:
URL и открывает его в окне.