我有以下功能:
function validateField(target, field, field_check) {
if(target.val().trim().length > 0) {
$.ajax({
url: '<?php echo $html->url('/fonykers/validate_',true); ?>'+ field + '/' + target.val(),
dataType: 'json',
type: 'POST',
success: function(response) {
if(!response.ok) {
if(target.is('.ok')) {
target.removeClass('ok');
}
target.addClass('error');
error.html(response.msg);
error.fadeIn();
field_check = false;
} else {
if(target.is('.error')) {
target.removeClass('error');
}
target.addClass('ok');
alert('voy a asignar true');
field_check = true;
}
},
error:function (xhr, ajaxOptions, thrownError){
alert(xhr.statusText);
alert(thrownError);
field_check = false;
}
});
} else {
error.html('You must specify a ' + field);
error.fadeIn();
target.addClass('error');
field_check = false;
}
}
我用它来验证我的表单输入字段,目标变量是字段本身,例如:$('#name_field')
第二个变量是一个字符串,指定字段的名称,例如name
知道它会调用哪些PHP函数。最后一个布尔值,我用来知道是否有效,或者现在该字段是否有效,例如我在脚本的开头定义的name_check
并设置为false。
我的问题是field_check
在本地范围内得到了适当的改变,但它永远不会修改已经传入的que外部变量,我做错了什么?
答案 0 :(得分:2)
这是因为变量不是通过引用传递的。您可以将其作为返回值,也可以使用以下解决方法:http://sirdarckcat.blogspot.com/2007/07/passing-reference-to-javascript.html
答案 1 :(得分:1)
原始变量(int / boolean / etc)按值传递给函数 - 也就是说,当有人将其中一个传递给函数时,变量的值将传递给函数,而不是变量本身。你正在修改的是一个完全不同的变量。
最简单的解决方案是在完成字段验证后返回true或false,并使用函数的返回值而不是检查field_check
。
你也可以使用全局/属性做一些不同的事情。例如......
var validator = function (target, field) {
...
this.field_check = false;
}
validator(target, field);
if (validator.field_check) {
...
}
注意使用this.field_check
并将函数赋值给变量
答案 2 :(得分:0)
在JavaScript中,简单类型总是按值传递,而不是通过引用传递。换句话说,您传递的是布尔值的副本。副本得到改变,但原始的永远不会。
您的验证字段函数需要返回新值,或者需要一个将接收它的回调函数。您必须将新值显式设置为原始变量。