驗證碼客戶端驗證

驗證碼客戶端驗證

衆所周知,驗證碼是寫入 _SESSION 的,而 _SESSION 是存在服務端的,所以想在客戶端用 js 來驗證這個驗證碼是有些難度的,廢話就不多說了。現在開始陳述我遇到的問題,和最後解決的方法。我是在做登錄模塊的時候遇到的這些問題的。

 

一 探索的過程

剛剛開始的時候,我是用 form表單來進行數據提交的,然後給 form表單一個 onsubmit 事件:<form name="form1" method="post" οnsubmit="return check_form();"></form> 。然後用自定義函數 check_form() 去驗證表單的值,不符合條件的就返回 false 阻止表單提交。

然後驗證到驗證碼的時候就出問題了,驗證碼的值是用 _SESSION 存在服務器的,js獲取不到,也就無法去對比驗證的。然後,我就想到了下面的這些解決方法:

① js 異步調用phpphp去把輸入的值和存入 _SESSION 的值進行對照,再返回 true 或 false js,然後 js 返回給表單,進而根據結果的對錯決定要不要阻止表單提交。理想很美好,現實卻很骨感。因爲 異步調用返回的值,它是一個局部變量,外面用不到。我是用 jQuery 的 $.post(); 去進行這個異步調用的。大致代碼如下:

function check_form() {

 xxxx

 xxxx

 xxxx

    $.post("call/ajax.php",{imgck:_imgcktxt,aj_tp:1},function(res){

        if (res=='false') {

            $("#notice").html('驗證碼不正確');

            return false// ##-- 注意的,問題就出在這裏,這裏的值返回不出去。也就是說,這裏的 return 不是 check_form() 的返回值。

        }

    });

 xxxx

 xxxx

 xxxx

}

然後,我就有一種咫尺天涯的感覺了。

② 好了,我們來看第二種方法。既然,值,返回不出來,那我就用dom把值寫入html裏面,這就是現在的思路。代碼如下:

function check_form() {

 xxxx

 xxxx

 xxxx

    $.post("call/ajax.php",{imgck:_imgcktxt,aj_tp:1},function(res){

        if (res=='false') {

            $("#notice").html('驗證碼不正確');

            $("#codehidden").attr('value','false'); // #codehidden是一個隱藏域 <input type="hidden" id="codehidden" />

        }

    });

    var codestate = $("#codehidden").attr('value');

    if (codestate=="false") {

        return false;

    }

 xxxx

 xxxx

 xxxx

}

這樣好像行了,可是,事實往往不盡人意。這種做法總是慢一拍的,var codestate = $("#codehidden").attr('value'); 得到的值是上一次的。SO還是不行。

到目前爲止,可以把外面的值傳遞給 $.post, 可是 $.post 裏面的值卻怎麼也傳不出來就算我把它寫入頁面中再調出來卻也還是慢了一拍。設置了全局變量,就是在外面定義變量,然後,load()裏面的值好像是可以傳出來的,是不是我們就可以用load()來代替$.post()呢,。?

③ 好吧,看三個方法。在 js 異步調用 php 的時候,在 php 處理程序那裏,除了把值返回給 js,同時還把值寫入 cookie,然後在 js 那裏調用 cookie 判斷是否阻止表單提交。這個方法我沒試過。估計不好用,太麻煩了。

④ 再看們第四個方法,上面三個方法都是沒用的。這回不是隻用一個 js 函數作用在 form表單了。而是給沒個表單元素都設置一個失去焦點事件 onBlur 的 js 函數,然後去控制提交按鈕的可用與否。如下:

//--------------------------按鈕狀態設置

function change_submit(zt) {

    if (zt == false) {

       document.forms[0].elements['submit'].disabled = 'disabled';

    }else {

       document.forms[0].elements['submit'].disabled = '';

    }

}

可是這種方法太繁雜了,每個表單元素都要有一個函數,而且每個函數裏面還要關聯別的表單元素,所以,不用。

二 最後,我還是乖乖的,不用 form 表單提交了,直接,只用 js 提交了。

三 這次,登錄模塊的製作,溫習了的一些知識如下:

① 異步調用返回的值是局部變量,外面用不了的。

② onSubmit 事件,既是表單提交事件,常用來阻止表單提交,onSubmit="return false"

③ js 是解釋執行的,執行到錯的地方就停了不執行了。

④ 中斷 js 的執行,用 return;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章