功能调用不起作用

时间:2012-01-05 21:24:52

标签: javascript jquery

我认为我在下面的代码中遇到了this元素的问题

我试图以两种方式调用函数,但第二种方式不起作用:

函数validate_email没有响应,我认为在第二个例子中对它的调用是错误的。

工作方式是:

checking = {};
checking.form = function(){
    return{

validate_mail: function(a){
    var c=true;
    var email_filter = /^[\w.-]+@[\w.-]+([\.]+([\w]+[\.])?)+[a-zA-Z]{2,6}$/i;
    if( $.trim(a)!=""  && !$.trim(a).match(email_filter) )
    c=false;
    return c;
},
check_mail: function(div_id, error) {

        var email = $(div_id + ' input[name=email]').val();
        var check = this.validate_mail(email);
        if(check==false && $(div_id).is(':visible') )
         {
            $(div_id + ' '+ error).html('<b>some error</b>');   
        } else {
            $(div_id + ' ' + error).text('');
        }

    }
 }
}();


$(function(){
    $('#register input[name=email]').blur(function(){
         checking.form.check_mail("#register", ".error_email");
         });
}

不行的方式是:

checking = {};
checking.form = function(){
    return{

validate_mail: function(a){
    var c=true;
    var email_filter = /^[\w.-]+@[\w.-]+([\.]+([\w]+[\.])?)+[a-zA-Z]{2,6}$/i;
    if( $.trim(a)!=""  && !$.trim(a).match(email_filter) )
    c=false;
    return c;
},
check_mail: function(div_id, error) {
            return function(){ //**made the change  nr. 1**

        var email = $(div_id + ' input[name=email]').val();
        var check = this.validate_mail(email);
        if(check==false && $(div_id).is(':visible') )
         {
            $(div_id + ' '+ error).html('<b>some error</b>');   
        } else {
            $(div_id + ' ' + error).text('');
        }
      }
    }
 }
}();


$(function(){ //**made the change nr. 2**
    $('#register input[name=email]').blur(   
         checking.form.check_mail("#register", ".error_email")
        );

}

我需要一些帮助。我相信我没有以正确的方式使用this元素

任何帮助表示赞赏!!

3 个答案:

答案 0 :(得分:2)

而不是使用

this.validate_mail(email);

使用

checking.form.validate_mail(email);它应该可以正常工作。

您不能在案例中使用this,因为您没有创建实例。

答案 1 :(得分:1)

当您返回匿名函数时,this不会引用所有者对象。您可以在返回函数之前将this的值存储在某个变量中,然后使用它而不是:

...
var that = this;

return function(){
  that.validate_mail(...);
}
...

答案 2 :(得分:1)

在我看来,你的编码方式很奇怪,很容易出错,这也是错误所在。 在check_mail函数内的匿名函数内部不知道this

我会将您的代码重写为以下代码,以使其更清晰:

var checking = {
    form: {
        validate_mail: function(a){
            var c=true;
            var email_filter = /^[\w.-]+@[\w.-]+([\.]+([\w]+[\.])?)+[a-zA-Z]{2,6}$/i;
            if( $.trim(a)!=""  && !$.trim(a).match(email_filter) )
                c=false;
            return c;
        },
        check_mail: function(div_id, error) {
            var email = $(div_id + ' input[name=email]').val();
            var check = this.validate_mail(email);
            if(check==false && $(div_id).is(':visible') )
            {
                $(div_id + ' '+ error).html('<b>some error</b>');   
            } else {
                $(div_id + ' ' + error).text('');
            }
        }
    }
}

用法:

$('#register input[name=email]').blur(function () {
    checking.form.check_mail("#register", ".error_email"); 
});