我在我的项目中使用Ajax,所以在header.php中我使用Javascript代码将XMLHttpRequest发送到服务器。我在网站的每个页面中都包含了这个header.php文件。 问题是在signin.php页面我正在使用头功能。由于我在标头中使用的Ajax代码,这是行不通的。当我从header.php中删除该代码时。标题功能正常。请帮帮我。
我在signin.php中使用的标题函数: 标题( “位置:的index.php”);
在header.php中使用Ajax代码:
<script>
function favourite(str)
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("like-div").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","add_to_favourites.php?"+str,true);
xmlhttp.send();
}
</script>
答案 0 :(得分:0)
实际上,Location
标头确实有效,但它会重定向在后台运行的Ajax请求,而不是在浏览器中触发完整的URL更改。浏览器透明地处理Ajax请求的这种重定向,因此最终发生的事情是#like-div
的内容被 index.php 的完整HTML代码替换。
显然这不是这种情况下的预期行为,所以我们需要做的是在Ajax请求期间以某种方式检测重定向,并发回一些JavaScript以在浏览器中手动设置document.location
。
一种可能的解决方案是使用jQuery来放置Ajax请求(因为它支持在响应中支持浏览器独立的脚本执行),并在检测到XMLHttpRequest时发送JavaScript重定向代码而不是Location
标头:
<强>的JavaScript 强>
$("#like-div").load("add_to_favourites.php?" + str);
/* see how much easier it is with jQuery? */
<强>的header.php 强>
/* Function for Ajax-friendly redirects */
function redirect_with_ajax($url, $permanent = false)
{
@ob_end_clean();
if(isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) === "xmlhttprequest")
{
print('<script> location.href = ' . json_encode($url) . '; </script><div>You are being redirected <a href="' . htmlentities($url, ENT_QUOTES, "UTF-8") . '">here</a>.</div>');
}
else
{
header($_SERVER["SERVER_PROTOCOL"] . " " .
($permanent ? "301 Moved Permanently" : "302 Found"));
header("Location: " . $url);
}
exit;
}
/* Do the redirect */
redirect_with_ajax("index.php");
代码未经测试,可能包含错误。请谨慎使用。