//再次验证手机号码 格式是否正确
var reg = /^1[3|5|4|8|7|][0-9]\d{8}$/;
var r = phone.match(reg);
if (r == null) {
layer.open({
content: '手机号码格式不正确'
,skin: 'msg'
,time: 3 //2秒后自动关闭
});
return false; //第一个return false是有效的
}
//再次验证手机号码是否已经存在
$.post("__MODULE__/Login/ajaxCheckPhoneIsExist",{phone:phone},function(data,status){
if(data=="手机号码已被注册"){
layer.open({
content: '该手机号码已经存在'
,skin: 'msg'
,time: 3 //2秒后自动关闭
});
return false; //第2个return false无效
}
});
alert("11111");
//第一個return false是有效的
//第2個return false無效
請問是什麼原因
題主的第一個
return false
是同步調用的,因此能看見效果;$.post
方法是異步執行的,因此在$.post
方法的回調函數裡面return false
的時候,其實是生效了的,但是在執行這句代碼的時候,$.post
外面的程式碼早就執行完成了,所以看不到效果而已。另外,在回呼函數裡面加上這句程式碼並沒有什麼意義,因為即使是return
,也是退出目前執行的函數,即$.post
的回調函數,並不能阻止$.post
外面程式碼的執行。如果有程式碼需要在
$.post
請求成功之後執行的,那就把程式碼放到$.post
方法的回呼函數裡面去吧。例如題主如果本意想讓alert('1111')
在請求成功後透過條件判斷執行,那可以alert('11111')
放在$.post方法的回呼函數中;這裡再跟題主解釋一下同步和非同步吧,舉個栗子,例如題主在寫程式碼,覺得口渴了,就去燒水喝。這個過程中題主就相當於一個線程,寫程式碼是題主目前正在執行的事情,覺得口渴了就去接點水放在那裡燒,不用管它,題主依然繼續寫程式碼,只需要等到水燒好了自己拿下來喝就好了。題主的程式碼也是一樣的,js從上到下執行,當執行到
$.post
就發送一個請求,請求的過程中外部的js還是繼續執行(並沒有等待$.post
請求返回結果),等到ajax請求返回了,再回調之前定義的回呼函數。這裡除了$.post
是非同步執行外,其餘的程式碼都是同步執行的。另外發現題主的正則可以優化,個人認為可以寫成
/^1[34578]d{9}$/g
return返回的是當前函數的,你的第一個return相對的是一個click事件的回調函數,而第二個是相對的ajax請求的回調函數,自然不會阻止外層的函數回調
post中函數是非同步函數,只有在請求成功後才會被調用,在請求成功返回前,會繼續向下執行程式碼。所以return false語句無效。解決方法是把return false 放在非同步函數外面,不要放在$.post()的非同步函數中。
$.post
是非同步執行的,需要使用$.ajax
並設定async: false
。放在alert(1111)同級