今天分享一個我前幾天寫代碼遇到的經典錯誤,大家也一起來找找,看你們能發現嗎?
項目就是一個簡單的ajax用戶名驗證,下面用代碼開始講解:
前端頁面:
<script type='text/javascript' src='jquery.js'></script>
<form action="" method='post'>
用戶名:<input type='text' name='uname'><span></span><br/>
</form>
JS驗證代碼:
<script type='text/javascript' >
$('input[name=uname]').blur = function(){ // jquery的強大選擇器和blur方法
var obj = $(this); // 當前表單對象
var send_data = {'uname':obj.val()};
$.post('check.php',send_data,function(data){ // jquery的post請求Ajax驗證
if(data){
// jquery的連綴,next()指代的是span標籤,而html是span標籤的方法
obj.next().html("<font style='color:red'>用戶名已經存在</font>");
}else{
obj.next().html("<font style='color:green'>用戶名可以使用</font>");
}
})
}
</script>
PHP後端代碼:
$arr = array('Klose','Kobe','Bayern');
if(in_array($_POST['uname'],$arr)){
echo 1;
}else{
echo 0;
}
好了,代碼寫完了,但是這個時候你運行程序,無論你在表單填寫的是任何名字,得到的結果都是:“用戶名已經
存在”!!!爲什麼會這樣呢?我其實也困擾了很久,程序邏輯處理看似沒有問題,但是卻忽略了一個知識點,那就是
javascript其實也是有類型的,我們從PHP頁面返回的值,在js頁面用typeof打出來,結果發現:是string字符類型,
也就是從表面上看是數字0或者1,結果是字符0或者1,因此if(data)會永遠是真!
解決辦法有兩個:1. js判斷加上一句:if(data == 1),這樣雖然字符1和數字1的類型不同,但是==只判斷數值,因
此這種方法是可行的(不推薦); 2. 改寫PHP頁面的代碼,直接返回true和false,這樣避免了類型問題(推薦)
大家可以關注我的微信公衆號:iwork,我會每天推送一篇原創文章,讓大家都能有所收穫!