阿里云淘寶拖動驗證碼高仿


效果圖

淘寶或者阿里云上經(jīng)常能看到鼠標(biāo)拖動的驗證碼出現(xiàn)


阿里云驗證碼

一直想自己實現(xiàn),今天整理了下網(wǎng)上資料,找到了QapTcha這個插件庆尘,或者說一個模板。今天就用他來實現(xiàn)一個簡單的拖動驗證碼巷送。

廢話不多說驶忌,上代碼:

工程結(jié)構(gòu)

主頁面(核心代碼)

...

    <body>
        <div class="container">
            <h1>高仿淘寶拖動驗證碼</h1>
            <form method="post" action="#">
                <fieldset>
         

                    <div id="QapTcha" class="QapTcha"></div>
                    
                    <input type="submit" name="submit" value="提交表單" />
                </fieldset>
            </form>
        </div>
        
...
  
        <script type="text/javascript">
            $(document).ready(function () {
                $('.QapTcha').QapTcha({ disabledSubmit: true,autoSubmit:false, autoRevert: true, txtLock: "請按住滑塊,拖動到最右側(cè)", txtUnlock: '驗證通過', PHPfile: 'QapTcha.jquery.php' });
            });
        </script>

    </body>
</html>

Qaptcha腳本

jQuery.QapTcha = {
    build: function(options) {
        var defaults = {
            txtLock: '已上鎖 :表單不能提交笑跛,請拖動上方箭頭到最右側(cè)解鎖',//未解鎖文字
            txtUnlock: '已解鎖鎖 : 表單能提交',//解鎖成功文字
            disabledSubmit: true,//未解鎖提交按鈕無效
            autoRevert: true,//是否自動回彈
            PHPfile: 'php/Qaptcha.jquery.php',//驗證服務(wù)器
            autoSubmit: false//是否自動提交
        };
        if (this.length > 0) return jQuery(this).each(function(i) {
            var opts = $.extend(defaults, options),
                t = $(this),
                form = $('form').has(t),
                Clr = jQuery('<div>', {
                    'class': 'clr'
                }),
                bgSlider = jQuery('<div>', {
                    'class': 'bgSlider'
                }),
                bgMasks = jQuery('<div>', {
                    'class': 'bgMasks'
                }),
                Slider = jQuery('<div>', {
                    'class': 'Slider'
                }),
                Icons = jQuery('<div>', {
                    id: 'Icons'
                }),
                TxtStatus = jQuery('<div>', {
                    'class': ' TxtStatus dropError TxtStatusFont',
                    text: opts.txtLock
                });
         
            if (opts.disabledSubmit) form.find('input[type=\'submit\']').attr('disabled', 'disabled');
            //美化拖動驗證付魔,模仿淘寶
            bgSlider.appendTo(t);//添加驗證背景
            Icons.insertAfter(bgSlider);
            Clr.insertAfter(Icons);
            Slider.appendTo(bgSlider);//添加滑塊
            bgMasks.appendTo(bgSlider);//添加上層遮罩
            TxtStatus.appendTo(bgSlider);//添加文字
            t.show();

            Slider.draggable({//滑塊添加滑動
                drag: function(event, ui) {//拖動回調(diào)
                    $(bgMasks).width(bgSlider.width() - ui.position.left)
                },
                revert: function(event, ui) {//驗證回彈
                    if (opts.autoRevert) {
                        if (parseInt(Slider.css("left")) > (bgSlider.width() - Slider.width() - 3)) return false;
                        else return true
                    }
                },
                revertDuration: 15,
                containment: bgSlider,
                axis: 'x',//橫向
                stop: function(event, ui) {//推動結(jié)束回調(diào)
                    if (ui.position.left > (bgSlider.width() - Slider.width() - 3)) {
                        $.ajax({//拖動到頭給服務(wù)器發(fā)消息
                            type: "post",
                            async: "async",
                            data: {
                                action: 'qaptcha',
                            },
                            url: opts.PHPfile,
                            dataType: "json",
                            success: function(data) {
                                if (!data.error) {
                                    Slider.draggable('disable').css('cursor', 'default');
                                    TxtStatus.text(opts.txtUnlock).addClass('dropSuccess').removeClass('dropError');
                                    Slider.addClass('SliderSuccess');
                                    Icons.css('background-position', '-16px 0');
                                    form.find('input[type=\'submit\']').removeAttr('disabled');//提交按鈕可用
                                    if (opts.autoSubmit) form.find('input[type=\'submit\']').trigger('click');
                                } else {
                                    alert(data.error);
                                    refurbishValidate(t);
                                }
                            },
                            beforeSend: function() {//提交前設(shè)置加載圖標(biāo)
                                var htmLoading = '<span>加載中...</span><div class="loader"><div class="ball-spin-fade-loader"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div></div>';
                                TxtStatus.html(htmLoading).addClass('dropSuccess').removeClass('dropError')
                            },
                            complete: function(XMLHttpRequest, textStatus) {
                                isAjaxing = false;
                                $("#btn_loading").css('display', 'none')
                            },
                            error: function(e) {
                                alert('驗證失敗');
                                refurbishValidate(t);
                            }
                        });
                    } else {
                        while (bgMasks.width() <= bgSlider.width()) {
                            $(bgMasks).width(bgMasks.width() + Slider.width())
                        }
                        $(bgMasks).width(bgMasks.width() - Slider.width())
                    }
                }
            });
        })
    }
};
jQuery.fn.QapTcha = jQuery.QapTcha.build;

function refurbishValidate(ctrl) {//重置表單
    ctrl.html("");
    ctrl.QapTcha({
        disabledSubmit: true,
        autoSubmit: false,
        autoRevert: true,
        txtLock: "請按住滑塊聊品,拖動到最右側(cè)",
        txtUnlock: '驗證通過',
        PHPfile: 'Qaptcha.jquery.php'
    })
}

//服務(wù)端驗證

<?php
session_start();


$aResponse['error'] = false;
    
if(isset($_POST['action']))
{
    if(htmlentities($_POST['action'], ENT_QUOTES, 'UTF-8') == 'qaptcha')#確認(rèn)是qaptcha發(fā)送的action
    {

        //這里可以進(jìn)一步對參數(shù)分析以驗證正確性
        echo json_encode($aResponse);
    }
    else
    {
        $aResponse['error'] = true;
        echo json_encode($aResponse);
    }
}
else
{
    $aResponse['error'] = true;
    echo json_encode($aResponse);
}

源碼倉庫
效果預(yù)覽

只是對模板的一個簡單應(yīng)用,后臺并沒有做復(fù)雜驗證几苍,阿里云的驗證要比這個復(fù)雜的多翻屈,后天可以大致判斷是否是人操作。
這里沒有加這類判斷妻坝,只加了滾動伸眶,有興趣的朋友可以自己加入自己的驗證邏輯!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掷匠,更是在濱河造成了極大的恐慌,老刑警劉巖涂臣,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異售担,居然都是意外死亡赁遗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門族铆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岩四,“玉大人,你說我怎么就攤上這事哥攘∑驶停” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵逝淹,是天一觀的道長耕姊。 經(jīng)常有香客問我,道長栅葡,這世上最難降的妖魔是什么茉兰? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮欣簇,結(jié)果婚禮上规脸,老公的妹妹穿的比我還像新娘。我一直安慰自己熊咽,他們只是感情好莫鸭,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著横殴,像睡著了一般被因。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天氏身,我揣著相機與錄音,去河邊找鬼惑畴。 笑死蛋欣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的如贷。 我是一名探鬼主播陷虎,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杠袱!你這毒婦竟也來了尚猿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤楣富,失蹤者是張志新(化名)和其女友劉穎凿掂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纹蝴,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡庄萎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了塘安。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糠涛。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖兼犯,靈堂內(nèi)的尸體忽然破棺而出忍捡,到底是詐尸還是另有隱情,我是刑警寧澤切黔,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布砸脊,位于F島的核電站,受9級特大地震影響绕娘,放射性物質(zhì)發(fā)生泄漏脓规。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一险领、第九天 我趴在偏房一處隱蔽的房頂上張望侨舆。 院中可真熱鬧,春花似錦绢陌、人聲如沸挨下。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臭笆。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愁铺,已是汗流浹背鹰霍。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茵乱,地道東北人茂洒。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像瓶竭,于是被迫代替她去往敵國和親督勺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,190評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫斤贰、插件智哀、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,109評論 4 62
  • "等我在學(xué)校上班發(fā)財了,就和你離婚" 他淡淡地說荧恍, 聽完后瓷叫,她心里暖暖的, 她想块饺,沒有比這更天長地久赞辩。 海枯石爛的...
    浮生所夢閱讀 381評論 1 0
  • 前天在朋友圈里看到一篇文章叫做《在故鄉(xiāng)與他鄉(xiāng)和解》授艰,讓我感觸良多辨嗽,好像讀到了幾年前的自己,以及那些為了迷失的歸屬感...
    雁去留影閱讀 586評論 0 1
  • 本期Open Talk撥開大數(shù)據(jù)迷霧尋找真實用戶由百格活動提供活動技術(shù)支持淮腾。 一糟需、活動介紹 “從硅谷到北京,大數(shù)據(jù)...
    百格活動閱讀 300評論 0 0