在Ajax请求上更新整个页面
我有一个AJAX请求可以有两种可能的结果:
<div>
如果我有需要处理这两种情况的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