2012-01-05 247 views
0

我觉得我在用下面的代码呼叫功能不工作

我试图调用双向的功能,但这么想的工作第二种方式this元素一个问题:

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

的工作方式是:

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

validate_mail: function(a){ 
    var c=true; 
    var email_filter = /^[\w.-][email protected][\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.-][email protected][\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元素

任何帮助表示赞赏!

+1

究竟是不是工作? – Stefan 2012-01-05 21:28:10

+0

如果我们甚至不知道代码应该做什么以及想要做什么,我们如何能够帮助您? – 2012-01-05 21:29:06

+0

函数validate_email没有响应,我认为在第二个例子中调用它是错误的 – sorin 2012-01-05 21:31:31

回答

1

当您返回匿名函数时,this未引用所有者对象。你可以在某些变量this值存储在返回函数之前,并使用它,而不是这样的:

... 
var that = this; 

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

而不是使用

this.validate_mail(email);

使用

checking.form.validate_mail(email);它应该工作的罚款。

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

+0

checking.form.validate_mail(在你的答案中的小错字) – JohnJohnGa 2012-01-05 21:36:02

1

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

我将重写代码,如下,以使其更清晰:

var checking = { 
    form: { 
     validate_mail: function(a){ 
      var c=true; 
      var email_filter = /^[\w.-][email protected][\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"); 
}); 
+0

函数的调用在这种情况下应该怎么看? – sorin 2012-01-05 21:54:11

+0

因此:'$('#register input [name = email]')。blur(function(){checking.form.check_mail(“#register”,“.error_email”);});' 注意额外匿名功能。 而不是创建返回可用于绑定的函数的函数,而是创建可执行的函数,并从绑定到事件时使用的匿名函数调用它们。 – jeffreydev 2012-01-05 22:09:40