Заменить текущую страницу содержимым ajax
У меня есть страница с диалоговым окном, которое отправляет данные ajax на сервер и получает ответ. Во время разработки могут быть два ответа - один регулярный (это не вопрос) или один с ошибкой. Сервер возвращает код 500 и страницу с большим количеством отладочной информации. Это регулярная страница, возвращаемая из фреймворка и содержащая код javascript. Я хочу показать эту страницу ошибки, если это произойдет.
Проблема заключается в том, что я не могу просто присоединить полученный результат к элементу body или открыть новую ссылку на новой странице и снова загрузить эту ошибку. Я просто получаю html-страницу вместо данных, и мне нужно отображать страницу (в текущем окне или в другом).
Я использую jQuery.
Ответы
Ответ 1
Настройте настройку jQuery ajax следующим образом:
$.ajaxSetup({
error: handleXhrError
});
где функция handleXhrError
выглядит следующим образом:
function handleXhrError(xhr) {
document.open();
document.write(xhr.responseText);
document.close();
}
См. также:
Ответ 2
В вашем обратном вызове ajax:
success: function (data) {
$("html").html($(data).find("html").html());
}
Это заменит весь HTML-контент страницы тем, который получен от вашего запроса AJAX. Работает в Chrome... не уверен в IE.
Несмотря на это, я не уверен, почему вы хотите включить раздел <head>
... но вы можете легко изменить приведенное выше, чтобы отобразить только то, что в теле ответа AJAX, и добавить его в div или даже лайтбокс. Намного приятнее.
Ответ 3
Вы также можете попытаться использовать URL-адрес данных, последние версии основных поддерживающих его браузеров:
function utf8_to_b64( str ) {
return window.btoa(unescape(encodeURIComponent( str )));
}
function loadHtml(html)
{
localtion.href='data:text/html;base64,'+utf8_to_b64(html);
}
Таким образом, вы можете загрузить любую HTML-страницу, которую вы хотите во время выполнения.
Ответ 4
Вот пример того, как изменить либо, если ответ представляет собой URL-адрес или html-контент (с использованием django\php)
var xmlhttp;
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
var replace_t = '{{ params.replace_t }}';
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
if(replace_t == 'location')
window.location.replace(xmlhttp.responseText);
else if(replace_t == 'content')
{
document.open();
document.write(xmlhttp.responseText);
document.close();
}
}
}
xmlhttp.open("GET",SOME_ASYNC_HANDLER_URL,true);
xmlhttp.send();
Ответ 5
Я нашел это решение. Я не знаю, правильно ли это, но для Opera и Firefox он работает.
var error_win = window.open(
'',
'Server error',
'status=0,scrollbars=1, location=0'
);
error_win.document.write(XMLHttpRequest.responseText);
Ответ 6
Пробовали ли вы просто создать элемент и вставить возвращаемую страницу ошибки в элемент? Я делаю это со страницами ошибок и jQuery.
var errorContainer = $( '<div/>' );
errorContainer.html( errorTextResponse );
errorContainer.appendTo( $( 'body' ) );
Ответ 7
Возможно, я ошибаюсь, но знаете ли вы, какие элементы из результата вы хотите отобразить? Вы можете попробовать что-то вроде этого:
success: function(data){
//store the response
var $response=$(data);
//use .find() to locate the div or whatever else you need
var errorMessage = $response.find('#warning').text();
alert(errorMessage);
}
Это то, что вы искали?
Ответ 8
Я не думаю, что это можно сделать. Iframes предназначены для загрузки других страниц, и нет другой изолированной программной среды для сброса автономной страницы - для каких фреймов были разработаны.
Это может быть сложно с использованием используемой вами структуры, но, вероятно, стоит иметь для нее разные ошибки для ваших запросов Ajax. Мои страницы Ajax будут отправлять только
{"exit": 1, "message": "As in the shell, a non-zero exit is an error and this is why..."}
Ответ 9
Просто понял это
так же легко, как
document.body.innerHTML = YourAjaxrequest.responseText;
_______________________________________________ ^ вверх здесь, вот чем пишет ваша текущая страница HTML с ответом.
request.onreadystatechange = function() {
if (request.readyState == 1) {
document.getElementById('sus').innerHTML = "SENDING.......";
}
if (request.readyState == 3){
document.getElementById('sus').innerHTML = "SENDING >>>>>>>>>>>>>";
}
if (request.readyState == 4 && request.status == 200) {
//document.getElementById('sus').innerHTML = request.responseText;
document.body.innerHTML = request.responseText;
}
}
request.send(formD);
},false);