使用JQuery中的函数.on()处理事件onfocus

时间:2014-06-01 11:08:24

标签: javascript jquery

我编写了一个脚本来验证表单中字段中的输入,并希望此字段在字段获得焦点时立即开始操作。但是现在,什么也没发生。这是jsfiddle的例子:

http://jsfiddle.net/klebermo/f8U4c/1/

$(document).on('.valida', 'focus', function(){
    $("#result").append("<p>starting validation</p>");
    var regex = $(this).attr('pattern');

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

    $(this).val(str);

    $("#result").append("<p>counter = "+counter+"</p>");
    $("#result").append("<p>str = "+str+"</p>");

    $(this).keypress(function(event){
        var tecla = e.which;

        if(typeof tecla == type_of(regex, counter)){
            str[counter] = tecla;
            if(typeof tecla == 'number' || typeof tecla == 'string')
                counter++;
            else
                counter += 2;
        }

        $("#result").append("<p>counter = "+counter+"</p>");
        $("#result").append("<p>str = "+str+"</p>");

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

任何人都知道我的代码出了什么问题?

2 个答案:

答案 0 :(得分:3)

您的参数顺序错误:

$(document).on('.valida', 'focus', function(){

应该是:

$(document).on('focus', '.valida', function(){

否则,它会在.valida元素上寻找<focus>个事件,但却无法找到任何内容。

此外,每次关注元素时,您都会重新绑定按键事件:

$(this).keypress(function(event){

这并不是要在按键事件中实际执行代码,它只是要添加一个新的事件处理程序。因此,每次关注元素时,都会不断添加新的处理程序。您可能只需在焦点处理程序外添加按键处理程序一次。按照您在焦点中进行的操作(显示验证)分离您在按键操作中所做的事情(计算验证)。

答案 1 :(得分:1)

首先是

选择器

$('.valida').on('focus', function(){

此外: http://api.jquery.com/on/

焦点和模糊事件由W3C指定为不冒泡,但jQuery定义了跨浏览器的焦点和焦点输出事件。当焦点和模糊用于附加委托事件处理程序时,jQuery会映射名称并分别将它们作为focusin和focusout传递。为保持一致性和清晰度,请使用冒泡事件类型名称。 改变了你的工作。