【问题标题】:Replace current page with ajax content用ajax内容替换当前页面
【发布时间】:2011-05-22 05:20:17
【问题描述】:

我有一个带有对话框窗口的页面,它将 ajax 发布数据发送到服务器并接收响应。在开发过程中,可能有两种响应——一种是正常的(这不是问题),一种是有错误的。服务器返回代码 500 和一个包含大量调试信息的页面。这是从框架返回的常规页面,包含一些 javascript 代码。我希望能够显示此错误页面以防万一。

问题是,我不能简单地将返回的结果附加到正文元素或在新页面中打开新链接并再次加载此错误。我只是得到一个 html 页面而不是数据,我必须显示页面(在当前窗口或另一个窗口中)。

我正在使用 jQuery。

【问题讨论】:

  • 请仔细阅读。我收到的错误不是文本,而是我需要显示的整个 html 页面。没有文本,没有更改,没有提取只是具有一些 javascript 功能的常规 html 页面(在返回代码的 head 部分中定义)。我需要用这个替换当前页面或使用返回的 html 代码创建新窗口(也是头部,而不是仅正文部分)

标签: javascript jquery html ajax


【解决方案1】:

刚刚想通了 就这么简单

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

【讨论】:

    【解决方案2】:

    这是一个示例,说明如何更改响应是 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();
    

    【讨论】:

      【解决方案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 页面。

      【讨论】:

      • 与其他答案不同,一种方法不使用 document.write();虽然性能较慢。赞成。
      • 不幸的是,这在 FF 中似乎不再适用于包含链接的 html,因为数据 url 不再继承安全上下文。有关详细信息,请参阅here(尽管注释仅指浏览器位置栏中的数据 uri,但这似乎也适用于您建议的技术[我仍然因其优雅而赞成])。可能我错过了一些明显的东西......
      【解决方案4】:

      我认为没有任何方法可以做到这一点。 iframe 旨在加载其他页面,并且没有其他沙箱可以转储独立页面 - 这就是框架的设计目的。

      您正在使用的框架可能会比较困难,但是让它为您的 Ajax 请求生成不同的错误可能是值得的。我的 Ajax 页面只会发送

      {"exit": 1, "message": "As in the shell, a non-zero exit is an error and this is why..."}
      

      【讨论】:

        【解决方案5】:

        如下配置jQuery ajax设置:

        $.ajaxSetup({
            error: handleXhrError
        });
        

        handleXhrError 函数如下所示:

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

        另见:

        【讨论】:

        • 是的,这是用 ajax 请求中的 html 替换当前页面的正确解决方案。
        • 先生! ...你在 SO 上救了我很多次。
        【解决方案6】:

        在您的 ajax 回调中:

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

        这会将整个页面的 HTML 内容替换为从您的 AJAX 请求中收到的内容。在 Chrome 中工作...不确定 IE。

        尽管如此,我不确定您为什么要包含 <head> 部分...但是您可以轻松修改上面的内容以仅显示 AJAX 响应正文中的内容,并将其附加到div 甚至是灯箱。好多了。

        【讨论】:

          【解决方案7】:

          我找到了这个解决方案。我不知道它是否正确,但对于 Opera 和 Firefox 来说它是有效的。

          var error_win = window.open(
             '',
             'Server error',
             'status=0,scrollbars=1, location=0'
          );
          error_win.document.write(XMLHttpRequest.responseText);
          

          【讨论】:

          • 这种方法的唯一缺点是不会触发 onload 事件,但总比没有好
          • 我的代码不行,缺少error_win.document.close()。之后,触发 onload 事件,页面正常工作
          【解决方案8】:

          我可能会产生误解,但是您知道您特别想显示结果中的哪些元素吗?你可以尝试这样的事情:

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

          这就是你要找的吗?

          【讨论】:

            【解决方案9】:

            您是否尝试过简单地创建一个元素并将返回的错误页面插入到该元素中?我使用错误页面和 jQuery 来做到这一点。

                var errorContainer = $( '<div/>' );
                errorContainer.html( errorTextResponse );
                errorContainer.appendTo( $( 'body' ) );
            

            【讨论】:

            • 我需要显示的页面的头部会发生什么? Head 部分加载 javascript 和 css 文件
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-23
            • 2010-10-03
            • 1970-01-01
            • 2011-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多