我有以下代码来检查对象是否存在项目列表。
出于测试目的,我只有一个对象sub_total_0
,但是脚本保持循环,因为typeof
无法确定sub_total_1
未定义或不存在,并继续2,3,4,5, ...
var i = 0;
while (typeof document.getElementById("sub_total_" + i) != "undefined") {
var obj_sub_total = document.getElementById("sub_total_" + i);
if (obj_sub_total != "undefined") {
if (fr.order_method_id.value == 1) {
obj_sub_total.style.visibility = "visible";
} else {
obj_sub_total.style.visibility = "hidden";
}
}
i++;
}
答案 0 :(得分:1)
你有
typeof document.getElementById("sub_total_" + i) != "undefined"
和
if (obj_sub_total != "undefined") {
getElementById
返回null
或HTML元素。这些都不是字符串"undefined"
,每个字符串的类型都是"object"
。因此,你的条件没有意义。
你测试真实性。 HTML元素始终为true,null
始终为false。
while (document.getElementById("sub_total_" + i)) {
和
if (obj_sub_total) {
答案 1 :(得分:1)
getElementById()如果找不到元素则返回null,null
的类型是对象,这就是您的条件不起作用的原因。
您可以检查它是否是真值,并且因为while()循环验证了对象,所以不需要if
条件
var i = 0,
obj_sub_total;
while (obj_sub_total = document.getElementById("sub_total_" + i)) {
console.log(obj_sub_total)
if (fr.order_method_id.value == 1) {
obj_sub_total.style.visibility = "visble";
} else {
obj_sub_total.style.visibility = "hidden";
}
i++;
}
演示:Fiddle
答案 2 :(得分:1)
您的支票无效,因为在typeof
上使用getElementById
的返回值将始终给您"object"
,因为它如果找不到,则返回null
,typeof null
为"object"
。
直接检查返回值:如果有一个元素,它就是一个" truthy"值(用作条件时强制为true
的值);如果没有,null
是" falsey"价值(强迫false
)。
所以:
while (document.getElementById("sub_total_" + i)) {
您也不需要两次查找,这是您目前正在做的事情;代替:
var obj_sub_total;
while ((obj_sub_total = document.getElementById("sub_total_" + i)) != null) {
(你在技术上并不需要!= null
那里,但没有它,看起来有点像你意外使用=
你想要==
的地方。)
另一种选择是使用一个类querySelectorAll
:
var list = document.querySelectorAll(".sub_total");
然后在i
为< list.length
时循环,例如:
var list = document.querySelectorAll(".sub_total");
for (i = 0; i < list.length; ++i) {
var obj_sub_total = list[i];
// ...
}
或者即使使用id
s:
var list = document.querySelectorAll("[id^=sub_total]");