Javascript JS函数返回应为真的假变量
我对返回变量的状态有问题。我有函数“altFormValidate”。本质上,问题是当我调用它时,如果蜜罐计数为0,验证运行正常,“validationResult”变量返回true,但是如果蜜罐计数大于0,“validationResult”变量仍然返回false,即使在执行了应该使其为true的代码之后也是如此Javascript JS函数返回应为真的假变量,javascript,jquery,variables,Javascript,Jquery,Variables,我对返回变量的状态有问题。我有函数“altFormValidate”。本质上,问题是当我调用它时,如果蜜罐计数为0,验证运行正常,“validationResult”变量返回true,但是如果蜜罐计数大于0,“validationResult”变量仍然返回false,即使在执行了应该使其为true的代码之后也是如此 function altFormValidate(intendedFormID){ //Validate honeypot traps var validationResul
function altFormValidate(intendedFormID){ //Validate honeypot traps
var validationResult = false;
}
var honeyPotFields = ["Fname", "EmailAddress", "Lname", "Telephone", "Address1", "Address2", "Surname", "Title"];
var honeyPotCount = 0;
honeyPotFields.forEach(function(entry) { //Check page for honeypots filled out
if($('#' + entry).length >= 1){
var honeyPotVal = $('#' + entry).val();
if (honeyPotVal !== ""){
honeyPotCount = honeyPotCount + 1; //Count successful honeypot traps
}
}
});
if (!honeyPotCount > 0) //Check honeypot count
{
$('#' + intendedFormID).attr("action", formAction); //Append SF action to form
validationResult = true;
}
else
{
if (honeyPotCount == 1){ //If one honeypot filled in
//SUSPECT - implement further checks
$.colorbox({ //init popup with confirmation input: "#machine-check"
href: "/inc/form-confirmation.html",
transition: "elastic",
speed: 350,
opacity: 0.65,
className: "seg-window",
onComplete: function() {
jQuery('#colorbox').find('a.btn-close, a.close, a.cancel').unbind('click.closeColorbox').bind('click.closeColorbox', function(e) {
jQuery.colorbox.close();
e.preventDefault();
});
jQuery('#machine-check').bind('change', function(e) {
jQuery.colorbox.close();
e.preventDefault();
validationResult = true; //This code doesn't seem to change the variable "validationResult" when I call the entire function altFormValidate but I know that changing "machine-check" does change the variable.
});
}
});
}
else if (honeyPotCount == 2){ //If two honeypots filled in
//PRIME SUSPECT - init Captcha/Akismet etc
alert("Robot Alert!");
validationResult = false;
}
} return validationResult;
}
在提交表单时,我会这样调用上述函数:
var req = true;
if(req){ //If required fields are filled in
var extraValidation = altFormValidate('WebToLeadForm', 'webToLeadPost');
if (extraValidation == true){
alert("form sent");
//document.WebToLeadForm.submit();
return true;
}
}
所以我的问题是,为什么extraValidation()在没有找到蜜罐的情况下返回true,而在找到蜜罐的情况下返回false,然后执行相关代码使其成为true?我想问题在于我在哪里返回validationResult变量。我没有测试它,但我猜是这样的
if (!honeyPotCount > 0)
不一样
if (!(honeyPotCount > 0))
我没有测试,但我猜
if (!honeyPotCount > 0)
不一样
if (!(honeyPotCount > 0))
如果(!honeyPotCount>0)
不执行您认为它可以执行的操作。事实恰恰相反
如果honeyPotCount
为0
它将返回true
,否则它将返回false
逻辑不是代码>的值大于
。下面是if语句中实际发生的情况:
- 它接受
honeyPotCount
并将其强制为布尔值,然后返回它的倒数。
!0
返回true
-1
,!1
,!2
,etc返回false
- 然后将该布尔值设置为0,以便与
0
进行比较。
- 所以,如果honeyPostCount===0
,!honeyPotCount===true
,true==1
和1>0===true
!honeyPotCount===false
,false==0
和0>0===false
if(!(honeyPotCount>0))
来修复此问题。
但是,从逻辑中删除否定并将其更改为if(honeyPotCount<1),这意味着“如果honeyPotCount小于1”,会更具可读性更好的是,如果(!HONEYPOTCUNT>0)没有做你认为它做的事情,你永远不会减少HONEYPOTCUNT
,因此你也可以通过将它改成来让它更简单更清晰。事实恰恰相反
如果honeyPotCount
为0
它将返回true
,否则它将返回false
逻辑不是代码>的值大于
。下面是if语句中实际发生的情况:
- 它接受
honeyPotCount
并将其强制为布尔值,然后返回它的倒数。
!0
返回true
-1
,!1
,!2
,etc返回false
- 然后将该布尔值设置为0,以便与
0
进行比较。
- 所以,如果honeyPostCount===0
,!honeyPotCount===true
,true==1
和1>0===true
但是,如果honeyPostCount===1
,!honeyPotCount===false
,false==0
和0>0===false
如果(!(honeyPotCount>0))表示“如果honeyPotCount不大于0”,则可以通过添加括号来覆盖优先级if(!(honeyPotCount>0))
来修复此问题。
但是,从逻辑中删除否定并将其更改为if(honeyPotCount<1),这意味着“如果honeyPotCount小于1”,会更具可读性更好的是,您永远不会减少
honeyPotCount
,因此如果(honeyPotCount==0)异步性是一个问题,您还可以将其更改为,使其更加简单和清晰。机器检查的更改处理程序将在altFormValidate
返回后很长时间内启动。啊,这很有意义!那么,我如何才能使这个函数同步工作,因为只有在altForm validate函数之后,更改处理程序才会启动?你不能将异步操作转换为同步操作,你应该做相反的操作。始终防止实际的表单提交,在知道最终值时给altFormValidate
一个回调函数,并在该回调函数中提交表单值。看看异步工作流一般是如何工作的。谢谢@dcoderasynchronousity,这是一个很好的描述。机器检查的更改处理程序将在altFormValidate
返回后很长时间内启动。啊,这很有意义!那么,我如何才能使这个函数同步工作,因为只有在altForm validate函数之后,更改处理程序才会启动?你不能将异步操作转换为同步操作,你应该做相反的操作。始终防止实际的表单提交,在知道最终值时给altFormValidate
一个回调函数,并在该回调函数中提交表单值。看看异步工作流通常是如何工作的。非常好,非常有描述性,谢谢@DCoderIt,它的可读性要差得多,但对于非负数它会产生相同的结果。我不明白这里的相关性是什么?它的可读性要差得多,但对于非负数它会产生相同的结果。我不明白这里的相关性是什么?