Моя ситуация такова, что я разрабатываю небольшое веб-приложение, в котором сервер предоставляет динамические ответы JSON. Сервер построен на Cherrypy. Иногда в коде, создающем данные JSON, возникает ошибка, которая выдает, а cherrypy улавливает ее и возвращает ошибку 500 с полной 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');
Он просто преобразует ответ в полностью автономный URL-адрес data:
и открывает его в окне.