Php AJAX登录在Internet Explorer中不起作用

Php AJAX登录在Internet Explorer中不起作用,php,jquery,ajax,login,Php,Jquery,Ajax,Login,哦,乔伊,另一件事显然做得不好 我在标题中说“偶尔工作”,是因为我实际上已经能够让代码在IE中工作,但有时(没有任何代码更改)它不起作用,显然我的一个客户也是如此 我的临时解决方案是告诉他“停止使用IE”,但与此同时,我觉得调查是我的责任 问题: 登录过程似乎有点混乱,然后停止,而不会抛出通常伴随错误用户名或密码的错误消息。这只是在IE中(我的版本是IE9,但我不能保证这个问题仅限于那个版本)。登录在所有其他经过测试的浏览器中都能完美工作,包括移动浏览器 Javascript: $('#登录框>

哦,乔伊,另一件事显然做得不好

我在标题中说“偶尔工作”,是因为我实际上已经能够让代码在IE中工作,但有时(没有任何代码更改)它不起作用,显然我的一个客户也是如此

我的临时解决方案是告诉他“停止使用IE”,但与此同时,我觉得调查是我的责任

问题: 登录过程似乎有点混乱,然后停止,而不会抛出通常伴随错误用户名或密码的错误消息。这只是在IE中(我的版本是IE9,但我不能保证这个问题仅限于那个版本)。登录在所有其他经过测试的浏览器中都能完美工作,包括移动浏览器

Javascript:
$('#登录框>表单')。提交(函数(){
$('#登录响应').html(“”);
var str=$(this.serialize();
$.ajax({
键入:“POST”,
url:'lib/check login.php',
数据:str,
cache:false,
错误:函数(XMLHttpRequest、textStatus、errorshown){
console.log(errorthround+'\n'+textStatus);
},
成功:功能(msg){
var输出=msg.split(“|”);
无功延迟=1600;
如果(输出[0]=“正常”){
如果(输出[1]=''){//没有推荐人,重定向到主页
window.location=主页;
}
否则{//referer set,重定向回引用页面
console.log('sayingreferer');
//window.location=输出[1]。子字符串(1);
window.location=主页;
}
}
否则{
$(“#登录响应”).html('no,denied');
$(“#登录框输入”).val(“”);
$(“#登录框输入#用户名”).focus();
}
}
});
返回false;
});
PHP:
我想说,在你知道问题出在哪里之前,不要责怪IE。这里的问题是您正在提交表单并发出ajax请求。因此,有时它会工作,有时它不会,这取决于网络速度

修复方法:

$('#login-box > form').submit(function(e){
e.preventDefault();
...your code.


// or
return false;
}
你不应该使用

console.log
这只是为了调试,而不是为了生产代码上的错误。这是IE上的海森堡。 如果删除console.log不能解决您的问题,您可以这样做(我知道这不是很好,但可以做到):

$('#登录框>表单')。提交(函数(){
$('#登录响应').html(“”);
var str=$(this.serialize();
var-errorNb=0;
var xhr={
键入:“POST”,
url:'lib/check login.php',
数据:str,
cache:false,
错误:函数(XMLHttpRequest、textStatus、errorshown){
errorNb++;

如果(错误:1)您正在使用mysqli。您应该使用准备好的语句/占位符,而不是手动转义。2)当您处理ajax请求时,php应该返回json编码的数据,而不是您必须自己解析的自定义字符串格式。3)至于挂起,这种情况有时会发生,因为您处理的是网络资源。浏览器有时会“无缘无故”地坐着旋转,然后在重新启动请求后完美工作。@MarcB我同意不使用mysqli,但这段代码是在我熟悉PDO之前编写的,所以请原谅我。:)嘿,至少我逃避了我的查询变量!至于第3点,相信我,我已经尝试了足够多的时间,知道IE失败的次数比成功的次数多,而其他浏览器永远不会失败L,所以我认为这是IE的一个失败,而不是我必须接受的偶然障碍。MyQLI没有什么错。我只是说你应该使用准备好的语句来代替。它们是推荐使用的正向技术来使用,而不是手动逃逸/构建查询。@,PDO比MyQuLi快,但我明白你们所说的ABO。ut准备了陈述。正如我所说,这段代码比我对
->query()…而(->fetch())
方法以外的任何东西的舒适度都要早。当我们在这里的时候,对问题的实际解决方案有什么想法吗?我的印象是,我代码末尾的
return false
e.preventDefault()同义
。两者都有不是多余的吗?这就是我说“或”的原因。另外,我在你的代码中没有看到它们。对不起,它们在那里,我只是在复制/粘贴时没有看到。无论如何,添加
e.preventDefault()
也没有帮助。很不幸。谢谢。这让我发疯。讽刺的是,我用来调试的代码正是导致问题的代码。毕竟我是对的:这是IE的错。享受你的50个代表积分奖金吧!非常感谢。没想到Console.log会成为问题。
$('#login-box > form').submit(function(e){
e.preventDefault();
...your code.


// or
return false;
}
console.log
$('#login-box > form').submit(function(){
    $('#login-response').html("<img src='assets/images/wait.gif' height='32' />");
    var str = $(this).serialize();
    var errorNb=0;
    var xhr={
        type: 'POST',
        url: 'lib/check-login.php',
        data: str,
        cache: false,
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            errorNb++;
            if(errorNb<10)//to prevent infinite loop
                    $.ajax(xhr);
        },
        success: function(msg) {
            //your success code here
        }
    };
    $.ajax(xhr);
};