Заменить текущую страницу с содержанием ajax - PullRequest
28 голосов
/ 08 декабря 2010

У меня есть страница с диалоговым окном, которое отправляет данные поста ajax на сервер и получает ответ. Во время разработки может быть два ответа - один обычный (это не вопрос) или один с ошибкой. Сервер возвращает код 500 и страницу с большим количеством отладочной информации. Это обычная страница, возвращаемая из фреймворка и содержащая некоторый код JavaScript. Я хочу отображать эту страницу ошибок в случае, если это произойдет.

Проблема в том, что я не могу просто прикрепить возвращенный результат к элементу тела или открыть новую ссылку на новой странице и снова загрузить эту ошибку. Я просто получаю HTML-страницу вместо данных, и мне нужно отобразить страницу (в текущем окне или в другом).

Я использую jQuery.

Ответы [ 9 ]

31 голосов
/ 10 декабря 2010

Сконфигурируйте настройку jQuery ajax следующим образом:

$.ajaxSetup({
    error: handleXhrError
});

где handleXhrError функция выглядит следующим образом:

function handleXhrError(xhr) {
    document.open();
    document.write(xhr.responseText);
    document.close();
}

См. Также:

2 голосов
/ 22 июля 2013

Вот пример того, как изменить, если ответ является 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();
2 голосов
/ 26 июля 2011

Вы также можете попытаться использовать 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-страницу, какую захотите во время выполнения.

2 голосов
/ 10 декабря 2010

В вашем обратном вызове ajax:

success: function (data) {
   $("html").html($(data).find("html").html());
}

Это заменит содержимое HTML всей страницы на то, которое получено из вашего запроса AJAX.Работает в Chrome ... не уверен насчет IE.

Несмотря на это, я не уверен, почему вы захотите включить раздел <head> ... но вы можете легко изменить вышеприведенное для отображениячто находится в теле ответа AJAX, и добавьте его в div или даже в лайтбокс.Гораздо приятнее.

1 голос
/ 09 декабря 2010

Я нашел это решение.Я не знаю, правильно ли это, но для Opera и Firefox это работает.

var error_win = window.open(
   '',
   'Server error',
   'status=0,scrollbars=1, location=0'
);
error_win.document.write(XMLHttpRequest.responseText);
0 голосов
/ 18 января 2015

Только что понял это так просто, как

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);
0 голосов
/ 10 декабря 2010

Я не думаю, что есть способ сделать это. Iframes предназначены для загрузки других страниц, и нет другой песочницы, в которую можно выгрузить отдельную страницу - для этого были созданы фреймы.

Это может быть сложно с используемой платформой, но, вероятно, стоит, чтобы она генерировала разные ошибки для ваших запросов Ajax. Мои страницы Ajax будут отправлять только

{"exit": 1, "message": "As in the shell, a non-zero exit is an error and this is why..."}
0 голосов
/ 08 декабря 2010

У меня может быть неправильное понимание, но знаете ли вы, какие элементы из результата вы конкретно хотите отобразить? Вы можете попробовать что-то вроде этого:

  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);      
            }

Это то, что вы искали?

0 голосов
/ 08 декабря 2010

Вы пытались просто создать элемент и вставить возвращенную страницу ошибки в элемент?Я делаю это со страницами ошибок и jQuery.

    var errorContainer = $( '<div/>' );
    errorContainer.html( errorTextResponse );
    errorContainer.appendTo( $( 'body' ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...