这是rails app中的jquery代码。代码的目的是评估#rfq_need_report的值,如果need_report为true则显示#rfq_report_language,如果为false则显示隐藏:
$(document).ready(function() {
var rpt = $('#rfq_need_report').val();
alert(rpt);
if (rpt) {
alert(rpt);
$('#rfq_report_language').show();
alert('show');
} else {
$('#rfq_report_language').hide();
alert(rpt);
alert('hide');
}
}); // end ready
此处的警报仅用于调试。 rpt是假的,但是警报('show')被执行。似乎if循环处于假状态并决定执行循环为true。有时如果循环正在工作,有时则没有。什么可能导致这种奇怪的行为?感谢。
答案 0 :(得分:2)
在HTML中,任何输入(如value="something"
)的值字段始终被评估为字符串。我的猜测是,在javascript中你要么将该值设置为true或false,但事实上它被设置为“true”或“false”作为字符串。您可以尝试对此主题的回答:How can I convert a string to boolean in JavaScript?
答案 1 :(得分:1)
rpt可以是一个字符串,因此将其转换为布尔值将有助于:
if(rpt === "false") { rpt = false; } else { rpt = true; }
答案 2 :(得分:1)
我必须假设$('#rfq_need_report').val()
没有传回实际的布尔值,而是JavaScript认为'truthy'的东西,这就是你的if语句执行真值子句的原因。
有两种快速方法(我使用)将'truthy'值转换为实际布尔值:
1:var bool = !!truthy;
2:var bool = truthy === 'true'
我在期待字符串值时使用第二个,而在不期待字符串时使用第一个。
第一个例子可能需要解释,所以......
第一个! “不是”真实布尔值的真实价值,尽管与我想要的相反,第二个“不是”它回到应该的位置。
有关truthy vs falsy的更多示例,只需将javascript truthy falsy
弹出到您最喜爱的搜索引擎中即可开始阅读。我个人的快速参考是:Truthy and falsy in JavaScript