我登录我的网站(在localhost上运行),并将用户ID存储在会话变量
中$_SESSION['user_id'] = $user_id;
主页加载,一切都很好。我在主页面上显示用户ID,所以我确定它的价值。当我加载另一页时,使用
php = 'some_php_file.php';
window.open(php,php);
第二页打开确定。但是,如果我再次尝试打开同一页面,单击主页面上的相同按钮,系统将退出。如果我省略window.open()中的第二个php
(使用''而不是),我可能会有同一个窗口的多个副本(我不想要的),但是没有自动注销的问题。
知道可能发生的事情吗?
编辑:如果我关闭第二个窗口并重复此过程,我没有注销问题。我可以按照自己的意愿关闭并重新打开第二个窗口。只有当我尝试打开第二个窗口时才会出现问题,但它已经打开。我也可以打开不同的第二个窗口' (不同的php文件)。如果我尝试在同一个窗口打开TWICE,我才会被注销。
编辑2:似乎我找到了它。在我调用window.open()之前,我正在测试php文件是否存在,使用此函数:function fileExists(url){
var http = new XMLHttpRequest();
http.open('HEAD',url,true);
http.send();
return http.status != 404;
}
如果我将http.open()行更改为
http.open('HEAD',url,false);
它有效!但是manual告诉我们使用' true'在第三个参数......我该怎么办?
答案 0 :(得分:1)
在我看来,fileExists
函数一直只返回true
因为它不等待XHR完成。除非您指定async = false
。
可能是时候阅读How to return the response from an asynchronous call?。
我不知道这一直是真实的后果是什么,因为你没有完全分享你对这个结果的所作所为。
现在,如果您想“坚持使用手册”并保留async = true
(您确实应该这样做),那么只需将以下代码包装在回调中即可。 E.g:
function fileExistsAsync(url, callback){
var http = new XMLHttpRequest();
http.open('HEAD',url,true);
http.send();
http.onreadystatechange = function () {
if (http.readyState === 4) {
callback(http.status != 404);
}
}
}
fileExistsAsync(url, function (exists) {
console.log("async " + exists);
});