back.js 5.22 KB
/**
 * 找回密码
 * @author: xuqi<qi.xu@yoho.cn>
 * @date: 2015/12/14
 */

var $ = require('yoho-jquery');

var regx = require('../common/mail-phone-regx');

var emailAc = require('../common/ac-email'); // 邮箱自动完成

var emailReg = regx.emailRegx,
    phoneRegx = regx.phoneRegx;

var $cr = $('#country-code-hide'),
    $phoneNum = $('#phone-num'),
    $ca = $('#captcha'),
    $ccList = $('#country-code-list'),
    $cc = $('#country-code'),
    $btn = $('#find-btn'),
    $accErr = $('#account-err'),
    $caErr = $('#captcha-err'),
    caCount = 4, // 验证码位数
    hasPh = false,
    hasCa = false;

require('../../simple-header');
require('yoho-jquery-placeholder');

function imgcode() {
    var time = new Date(),
        $captchaImg = $('#captcha-img'),
        captchaImgSrc = $captchaImg.attr('src').split('?')[0];

    $('#captcha-img').attr('src', captchaImgSrc + '?t=' + time.getTime());
}

function enableBtn() {
    if (hasPh && hasCa) {
        $btn.removeClass('disable').prop('disabled', false);
    } else {
        $btn.addClass('disable').prop('disabled', true);
    }
}

function authcode() {
    if (!hasPh || !hasCa) {
        enableBtn();
        return;
    }

    $.ajax({
        type: 'POST',
        url: '/passport/back/authcode',
        data: {
            verifyCode: $.trim($ca.val()),
            phoneNum: $phoneNum.val(),
            area: $cr.val()
        }

    }).then(function(data) {
        if (data.code === 200) {
            hasCa = true;
        } else if (data.code === 402) {
            hasPh = false;
            hasCa = true;
            $accErr.removeClass('hide').find('em').text('该账号不存在');
            $phoneNum.addClass('error');
        } else if (data.code === 400) {
            hasCa = false;
            imgcode();
        }
        enableBtn();
    });
}

function vaPn(v) {
    var pass = true,
        errTxt = '';

    v = $.trim(v);
    if (v !== '') {
        if (/^[0-9]+$/.test(v)) {
            if (phoneRegx[$cr.val()].test(v)) {
                pass = true;
            } else {
                errTxt = '手机号码格式不正确, 请重新输入';
                pass = false;
            }
        } else {
            if (emailReg.test(v)) {
                pass = true;
            } else {
                errTxt = '邮箱格式不正确, 请重新输入';
                pass = false;
            }
        }
    } else {
        errTxt = '账户名不能为空';
        pass = false;
    }
    hasPh = pass;
    authcode();

    return {
        pass: pass,
        errTxt: errTxt
    };
}

function vaCa() {
    var v = $.trim($ca.val());

    if (v === '' || v.length < caCount) {
        hasCa = false;
        enableBtn();
        return;
    }

    hasCa = true;

    authcode();
}

emailAc($phoneNum, function() {
    var pnVa = vaPn($phoneNum.val());

    if (pnVa.pass) {
        $accErr.addClass('hide');
        $phoneNum.removeClass('error');
    } else {
        $accErr.removeClass('hide').find('em').text(pnVa.errTxt);
        $phoneNum.addClass('error');
    }
}
);

$ca.attr('maxlength', caCount);

// IE8 placeholder
$('input').placeholder();

$('#change-captcha, #captcha-img').on('click', function() {
    imgcode();
});

$cc.on('click', function(e) {
    e.stopPropagation();
    if ($ccList.css('style') === 'block') {
        $ccList.slideUp('fast');
    } else {
        $ccList.slideDown('fast');
    }
});

$ccList.delegate('li', 'click', function(e) {
    var $cur = $(this),
        code = $cur.data('cc'),
        pnVa;

    e.stopPropagation();
    $cr.val(code);
    $cc.find('em').html($cur.text());

    // 切换后验证手机号码
    if ($.trim($phoneNum.val()) !== '') {
        pnVa = vaPn($phoneNum.val());
        enableBtn();
        if (hasPh) {
            $accErr.addClass('hide');
            $phoneNum.removeClass('error');
        } else {
            $accErr.removeClass('hide').text(pnVa.errTxt);
            $phoneNum.addClass('error');
        }
    }
    $ccList.slideUp('fast');
});

$(document).click(function() {
    if ($ccList.css('display') === 'block') {
        $ccList.slideUp();
    }
});

$phoneNum.keyup(function() {
    vaPn($.trim($(this).val()));
}).focus(function() {
    $(this).removeClass('error');

    // focus隐藏错误提示
    $accErr.addClass('hide');
});

// 验证码在鼠标移开后验证, keyup时不再验证
$ca.blur(function() {
    var errTxt = $.trim($ca.val()) === '' ? '验证码不能为空' : '验证码不正确';

    if (hasCa) {
        $caErr.addClass('hide');
        $ca.removeClass('error');
    } else {
        $caErr.removeClass('hide').find('em').text(errTxt);
        $ca.addClass('error');

        // 验证码错误则刷新验证码
        if ($ca.val() < caCount) {

            // 防止重复刷新验证码
            imgcode();
        }
    }
}).focus(function() {
    $(this).removeClass('error');

    // focus隐藏错误提示
    $caErr.addClass('hide');
}).keyup(function() {
    vaCa();
});

$('#find-btn').click(function(e) {

    if (/^[0-9]+$/.test($.trim($phoneNum.val()))) {
        $('#find-form').attr('action', '/passport/back/mobile');
    }
    if ($(this).hasClass('disable')) {
        return;
    }
    if (!hasCa || !hasPh) {
        e.preventDefault();
        return true;
    }
});