Javascript 验证脚本丢失字符

Javascript 验证脚本丢失字符,javascript,jquery,validation,Javascript,Jquery,Validation,下面的脚本应该一次验证用户输入的每个字符,但它正在丢失字符,并且始终是符号后的字符(例如:如果我为日期字段键入14121982,我在文本字段中得到14/\u 2/\u 9822,在内部得到14/\u 2/\u 982)。此外,textfield的内容和content my intenal变量之间的差异也是一个问题 jsfiddle var counter; var tam; var str; var regex; $('.valida').each(function(){ $(thi

下面的脚本应该一次验证用户输入的每个字符,但它正在丢失字符,并且始终是符号后的字符(例如:如果我为日期字段键入
14121982
,我在文本字段中得到
14/\u 2/\u 9822
,在内部得到
14/\u 2/\u 982
)。此外,textfield的内容和content my intenal变量之间的差异也是一个问题

jsfiddle

var counter;
var tam;
var str;
var regex;

$('.valida').each(function(){

    $(this).on('focus', function(e){
        regex = $(this).attr('pattern');

        counter = 0;
        tam = size_of(regex);
        str = generate_string(regex, tam);

        $(this).val(str);
    });

    $(this).on('keypress', function(e){
        var tecla = e.which;
        var tecla2 = String.fromCharCode(tecla);
        var t = type_of(regex, counter);

        if(typeof tecla == t) {
            str = replaceAt(str, counter, tecla2);
            //counter++;
        } else {
            if(t != 'number' && t != 'string') {
                str = replaceAt(str, counter, t);
                counter++;
            }
        }

        counter++;

        result = $("<div>");
        result.append( "counter = "+counter+"<br>" );
        result.append( "tecla2 = "+tecla2+"<br>" );
        result.append( "typeof tecla2 = "+typeof tecla+"<br>" );
        result.append( "typeof t = "+t+"<br>" );
        result.append( "str = "+str+"<br>" );
        $("#result").empty().append(result);

        $(this).val(str);
    });

});
$('.valida').each(function(){

    $(this).on('focus', function(e){
        regex = $(this).attr('pattern');

        counter = 0;
        tam = size_of(regex);
        str = generate_string(regex, tam);

        $(this).val(str);
    });

    $(this).on('keypress', function(e){
        e.preventDefault();

        var tecla = e.which;

        if(tecla >= 48 && tecla <= 57)
            var tecla2 = tecla - 48;
        else
            var tecla2 = String.fromCharCode(tecla);

        result = $("<div>");
        result.append( "tecla = "+tecla+"<br>" );

        var t = type_of(regex, counter);

        if(counter < tam) {
            if(t != 'number' && t != 'string') {
                str = replaceAt(str, counter, t);
                counter++;
            }

            t = type_of(regex, counter);

            if(typeof tecla2 == t) {
                result.append( "tecla2 = "+tecla2+"<br>" );
                str = replaceAt(str, counter, tecla2);
                counter++;
            }
        }

        result.append( "counter = "+counter+"<br>" );
        $("#result").empty().append(result);

        $(this).val(str);
    });

});

代码

var counter;
var tam;
var str;
var regex;

$('.valida').each(function(){

    $(this).on('focus', function(e){
        regex = $(this).attr('pattern');

        counter = 0;
        tam = size_of(regex);
        str = generate_string(regex, tam);

        $(this).val(str);
    });

    $(this).on('keypress', function(e){
        var tecla = e.which;
        var tecla2 = String.fromCharCode(tecla);
        var t = type_of(regex, counter);

        if(typeof tecla == t) {
            str = replaceAt(str, counter, tecla2);
            //counter++;
        } else {
            if(t != 'number' && t != 'string') {
                str = replaceAt(str, counter, t);
                counter++;
            }
        }

        counter++;

        result = $("<div>");
        result.append( "counter = "+counter+"<br>" );
        result.append( "tecla2 = "+tecla2+"<br>" );
        result.append( "typeof tecla2 = "+typeof tecla+"<br>" );
        result.append( "typeof t = "+t+"<br>" );
        result.append( "str = "+str+"<br>" );
        $("#result").empty().append(result);

        $(this).val(str);
    });

});
$('.valida').each(function(){

    $(this).on('focus', function(e){
        regex = $(this).attr('pattern');

        counter = 0;
        tam = size_of(regex);
        str = generate_string(regex, tam);

        $(this).val(str);
    });

    $(this).on('keypress', function(e){
        e.preventDefault();

        var tecla = e.which;

        if(tecla >= 48 && tecla <= 57)
            var tecla2 = tecla - 48;
        else
            var tecla2 = String.fromCharCode(tecla);

        result = $("<div>");
        result.append( "tecla = "+tecla+"<br>" );

        var t = type_of(regex, counter);

        if(counter < tam) {
            if(t != 'number' && t != 'string') {
                str = replaceAt(str, counter, t);
                counter++;
            }

            t = type_of(regex, counter);

            if(typeof tecla2 == t) {
                result.append( "tecla2 = "+tecla2+"<br>" );
                str = replaceAt(str, counter, tecla2);
                counter++;
            }
        }

        result.append( "counter = "+counter+"<br>" );
        $("#result").empty().append(result);

        $(this).val(str);
    });

});
var计数器;
var tam;
var-str;
var regex;
$('.valida')。每个(函数(){
$(此).on('focus',函数(e){
regex=$(this.attr('pattern');
计数器=0;
tam=的大小(正则表达式);
str=生成_字符串(regex,tam);
$(this).val(str);
});
$(此).on('keypress',函数(e){
var-tecla=e.which;
var tecla2=String.fromCharCode(tecla);
var t=类型(正则表达式,计数器);
if(tecla的类型==t){
str=替换(str,计数器,tecla2);
//计数器++;
}否则{
if(t!=“number”&&t!=“string”){
str=替换(str,计数器,t);
计数器++;
}
}
计数器++;
结果=$(“”);
结果。追加(“counter=“+counter+”
”; 结果。追加(“tecla2=“+tecla2+”
”; 结果。追加(“tecla2类型=“+tecla类型+”
”; 结果。追加(“typeof t=“+t+”
”); 结果。追加(“str=“+str+”
”); $(“#结果”).empty().append(结果); $(this).val(str); }); });

任何人都可以看到这里出了什么问题?

经过多次试用,我终于得到了一个工作代码:

jsfiddle

var counter;
var tam;
var str;
var regex;

$('.valida').each(function(){

    $(this).on('focus', function(e){
        regex = $(this).attr('pattern');

        counter = 0;
        tam = size_of(regex);
        str = generate_string(regex, tam);

        $(this).val(str);
    });

    $(this).on('keypress', function(e){
        var tecla = e.which;
        var tecla2 = String.fromCharCode(tecla);
        var t = type_of(regex, counter);

        if(typeof tecla == t) {
            str = replaceAt(str, counter, tecla2);
            //counter++;
        } else {
            if(t != 'number' && t != 'string') {
                str = replaceAt(str, counter, t);
                counter++;
            }
        }

        counter++;

        result = $("<div>");
        result.append( "counter = "+counter+"<br>" );
        result.append( "tecla2 = "+tecla2+"<br>" );
        result.append( "typeof tecla2 = "+typeof tecla+"<br>" );
        result.append( "typeof t = "+t+"<br>" );
        result.append( "str = "+str+"<br>" );
        $("#result").empty().append(result);

        $(this).val(str);
    });

});
$('.valida').each(function(){

    $(this).on('focus', function(e){
        regex = $(this).attr('pattern');

        counter = 0;
        tam = size_of(regex);
        str = generate_string(regex, tam);

        $(this).val(str);
    });

    $(this).on('keypress', function(e){
        e.preventDefault();

        var tecla = e.which;

        if(tecla >= 48 && tecla <= 57)
            var tecla2 = tecla - 48;
        else
            var tecla2 = String.fromCharCode(tecla);

        result = $("<div>");
        result.append( "tecla = "+tecla+"<br>" );

        var t = type_of(regex, counter);

        if(counter < tam) {
            if(t != 'number' && t != 'string') {
                str = replaceAt(str, counter, t);
                counter++;
            }

            t = type_of(regex, counter);

            if(typeof tecla2 == t) {
                result.append( "tecla2 = "+tecla2+"<br>" );
                str = replaceAt(str, counter, tecla2);
                counter++;
            }
        }

        result.append( "counter = "+counter+"<br>" );
        $("#result").empty().append(result);

        $(this).val(str);
    });

});

代码

var counter;
var tam;
var str;
var regex;

$('.valida').each(function(){

    $(this).on('focus', function(e){
        regex = $(this).attr('pattern');

        counter = 0;
        tam = size_of(regex);
        str = generate_string(regex, tam);

        $(this).val(str);
    });

    $(this).on('keypress', function(e){
        var tecla = e.which;
        var tecla2 = String.fromCharCode(tecla);
        var t = type_of(regex, counter);

        if(typeof tecla == t) {
            str = replaceAt(str, counter, tecla2);
            //counter++;
        } else {
            if(t != 'number' && t != 'string') {
                str = replaceAt(str, counter, t);
                counter++;
            }
        }

        counter++;

        result = $("<div>");
        result.append( "counter = "+counter+"<br>" );
        result.append( "tecla2 = "+tecla2+"<br>" );
        result.append( "typeof tecla2 = "+typeof tecla+"<br>" );
        result.append( "typeof t = "+t+"<br>" );
        result.append( "str = "+str+"<br>" );
        $("#result").empty().append(result);

        $(this).val(str);
    });

});
$('.valida').each(function(){

    $(this).on('focus', function(e){
        regex = $(this).attr('pattern');

        counter = 0;
        tam = size_of(regex);
        str = generate_string(regex, tam);

        $(this).val(str);
    });

    $(this).on('keypress', function(e){
        e.preventDefault();

        var tecla = e.which;

        if(tecla >= 48 && tecla <= 57)
            var tecla2 = tecla - 48;
        else
            var tecla2 = String.fromCharCode(tecla);

        result = $("<div>");
        result.append( "tecla = "+tecla+"<br>" );

        var t = type_of(regex, counter);

        if(counter < tam) {
            if(t != 'number' && t != 'string') {
                str = replaceAt(str, counter, t);
                counter++;
            }

            t = type_of(regex, counter);

            if(typeof tecla2 == t) {
                result.append( "tecla2 = "+tecla2+"<br>" );
                str = replaceAt(str, counter, tecla2);
                counter++;
            }
        }

        result.append( "counter = "+counter+"<br>" );
        $("#result").empty().append(result);

        $(this).val(str);
    });

});
$('.valida')。每个(函数(){
$(此).on('focus',函数(e){
regex=$(this.attr('pattern');
计数器=0;
tam=的大小(正则表达式);
str=生成_字符串(regex,tam);
$(this).val(str);
});
$(此).on('keypress',函数(e){
e、 预防默认值();
var-tecla=e.which;

如果(tecla>=48&&tecla),一个问题是在“generate_string”中使用“tam”而不是“tamanho”,但我不知道这是否是唯一的问题。您需要在“keypress”事件处理程序中调用
e.preventDefault()
,否则在代码更新事件处理程序中的值后,浏览器会将字符添加到值的末尾。