我认为我在下面的代码中遇到了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
元素
任何帮助表示赞赏!!
答案 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");
});