今天售后反馈了一个问题,客户的一个适配过移动端的网站登陆界面在Android客户端会重复刷新,具体表现为输入用户名和密码点击登陆后,登陆成功却没有跳转到之前的界面,而是刷新了一下登陆界面。
既然问题是登陆之后,那就看看网站login的相关逻辑:
$('#loginbtn').click(function(){
var username = $('#username').val();
var pwd = $('#userpwd').val();
var client = 'wap';
if($.sValid()){
$.ajax({
type:'post',
url:ApiUrl+"/index.php?act=login",
data:{username:username,password:pwd,client:client},
dataType:'json',
success:function(result){
if(!result.datas.error){
if(typeof(result.datas.key)=='undefined'){
return false;
}else{
addcookie('username',result.datas.username);
addcookie('key',result.datas.key);
location.href = referurl;
}
$(".error-tips").hide();
}else{
$(".error-tips").html(result.datas.error).show();
}
}
});
}
});
可以看到登陆成功后有这样一个动作:
location.href = referurl;
看样子登陆成功后网页跳转到了referurl指向的url,随后找到了referurl的赋值语句:
var referurl = document.referrer;
这里应该就是问题的关键了,连上手机,打开Chrome://inspect,console输出了一下document.referrer的值却发现是空的,怪不得页面会刷新。但是网页在Chrome的Device mode下却是正常的,document.referrer的值也不为空。试着用QQ内部浏览器打开网址,相关的操作也都正常,看来是自己的代码有问题。
Google了一下document.referrer为空的相关信息又看了看自己的代码,感觉问题应该是出在了这里(shouldOverrideUrlLoading):
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
如果对url跳转没有特殊处理的话,其实可以不用view.loadUrl(url)。将上面的代码改成:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
});
就可以了。
至此,document.referrer不为空,网站也能正常登陆。WebView的loadUrl()这个方法没有再详细研究,不过以后要看情况使用了。