我遇到了返回变量状态的问题。我有函数“altFormValidate”。基本上问题在于,当我调用它时,如果蜜罐计数为0,则验证运行正常,并且“validationResult”变量返回true,但如果蜜罐计数大于0,则“validationResult”变量仍返回false,甚至在执行应该成功的代码之后。
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但是然后执行相关代码才能使其成为真?我在想这个问题是我返回validationResult变量的地方。
答案 0 :(得分:3)
我没有测试它,但我猜是
if (!honeyPotCount > 0)
与
不同if (!(honeyPotCount > 0))
答案 1 :(得分:2)
if (!honeyPotCount > 0)
没有按照您的想法行事。它恰恰相反。
如果honeyPotCount
为0
,则会返回true
,否则会返回false
。
Logical-not !
的{{3}}高于>
。所以这就是你的if语句中实际发生的事情:
honeyPotCount
并将其强制转换为布尔值,然后将其反转。
!0
返回true
!-1
,!1
,!2
等返回false
。0
进行比较。
honeyPostCount === 0
,!honeyPotCount === true
,true == 1
和1 > 0 === true
。honeyPostCount === 1
,!honeyPotCount === false
,false == 0
和0 > 0 === false
。您可以通过添加括号来覆盖优先级if (!(honeyPotCount > 0))
,意思是“如果honeyPotCount不大于0”,则可以修复它。
但是从逻辑中删除否定并将其更改为if (honeyPotCount < 1)
会更具可读性,这意味着“如果honeyPotCount小于1”。 更好,您永远不会减少honeyPotCount
,因此您也可以通过将其更改为if (honeyPotCount === 0)
来使其更简单,更清晰。