在Ajax请求上更新整个页面

我有一个AJAX请求可以有两种可能的结果:

  • 服务器响应一个消息,我应该把它放在一个<div>
  • 服务器响应一个HTML页面,在这种情况下,我需要用新页面替换当前页面并更改地址(客户端在请求前知道地址)。
  • 如果我有需要处理这两种情况的AJAX请求,那么解决方案是什么?

     url = "http://example.com"
     ajax.request(callback)
    
     function callback(response) {
         if (case2(response)) {
               history.pushState({}, "New page", url);
               document.innerHTML = response
         } else {
                updateDiv(response)
         }
     }
    

    我对实现第一个分支的正确方法很感兴趣,或者如果服务器能够以某种方式编写一个头文件,使浏览器能够像通常的HTTP响应一样处理响应,并更新页面位置和内容,例如重定向给定的内容。

    我知道服务器可以返回一个链接而不是一个页面,但在这种情况下,客户端需要一个额外的阶段 - 重定向,然后填充服务器上的新页面。


    坦率地说,我认为这种方法基本上被设计破坏了。 你不应该在那个地方做出这个决定。 例如,ajax响应只能表示应该加载一个全新的页面,然后在第二个(非Ajax)请求上生成新的内容到一个新的URL。

    如果您不得不采取已经采用的方式,并且提供的响应内容不是很大,那么您可以尝试JavaScript-URI。 基本上,以javascript:"string"形式的URI将加载一个新的页面,该页面是该字符串的源代码。 所以,如果response已经是一个字符串,只需将javascript:response分配给window.location.href 。 也许你必须事先做一些转义。 我不知道,这种方法如何兼容跨浏览器。

    <a href="javascript:response">load</a>
    

    也是可能的。

    它的一个变体是构建不带变量名称的URL,但带有实际的字符串数据。 喜欢

    function source2url(src) {
        // make valid javascript string from source text
        var esc1 = src
            .replace(//g, '\')
            .replace(/'/g, ''')
            .replace(/x0A/g, 'x0A')
            .replace(/x0D/g, 'x0D');
    
        // make valid url from that
        return "javascript:'" + encodeURIComponent(esc1) + "'";
    }
    
    window.location.href = source2url(response);
    

    这当然会产生相当大的URI。 并且您将始终在地址栏中使用Javascript-URI。

    UPDATE

    类似的方法是在数据URI中使用base64编码。 维基百科条目解释了它是如何工作的,包括一个javascript示例。 但是,您必须以某种方式对内容进行64位编码。 (注意:您可以使用带有或不带有base64编码的数据URI,您必须查看给出的特定内容的缩写URI。)


    我曾经有过类似的问题。 返回完整的错误页面,而不是简单的HTML代码片段。 我们最终通过改变逻辑来解决这个问题,但这是我找到的解决方案之一:

    document.open();
    document.write(responseText);
    document.close();
    

    我们放弃这个的原因是在IE上有一些问题。 我没有花时间去调查为什么,但是在尝试写入字符串时抛出了“拒绝访问”异常。 我认为有一些<meta>标签混淆了IE,或者是有条件的评论,我不确定。 (当我使用一些简单的页面时,它工作...)

    底线是:你不应该这样做,但如果没有别的事情可以做(比如返回一个url字符串),上面的代码可能会工作。


    如果响应是有效的XML,那非常简单。

    var new_doc = (new DOMParser).parseFromString(response, "application/xml");
    document.replaceChild(document.adoptNode(new_doc.doctype), document.doctype);
    document.replaceChild(document.adoptNode(new_doc.documentElement), document.documentElement);
    
    链接地址: http://www.djcxy.com/p/1959.html

    上一篇: Update whole page on Ajax request

    下一篇: PHP header(): 302 Moved Temporarily error