Заменить текущую страницу содержимым ajax

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

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

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

Ответ 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);