Как отобразить сообщение об ошибке (текст / html) на запрос AJAX / getJSON? - PullRequest
7 голосов
/ 01 июля 2011

Моя ситуация такова: я разрабатываю небольшое веб-приложение, в котором сервер предоставляет динамические ответы 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 и открывает его в окне.

1 Ответ

1 голос
/ 01 июля 2011

Попробуйте это:

var win = window.open('', '_self');
win.document.getElementsByTagName('Body')[0].innerText = jqXHR.responseText;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...