2015-03-31 121 views
1

我有以下代码来检查对象是否存在的项目列表。 出于测试目的,我只有一个对象sub_total_0,但脚本继续循环,因为typeof不能确定sub_total_1未定义或不存在,并继续前进2,3,4,5,...JavaScript检查对象存在

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++; 
} 

回答

1

你有

typeof document.getElementById("sub_total_" + i) != "undefined" 

if (obj_sub_total != "undefined") { 

getElementById返回任一nullö一个HTML元素。这两个字符串都不是字符串"undefined",它们的类型都是"object"。因此你的条件没有意义。

您测试的是真实性。 HTML元素将始终为真,并且null将始终为假。

while (document.getElementById("sub_total_" + i)) { 

if (obj_sub_total) { 
+0

它完美的工作,感谢您的帮助。 – 2015-03-31 11:38:27

1

getElementById()返回NULL元素没有被发现,并null类型为对象,这就是为什么你的病情不工作。

你可以只检查是否是一个truthy值,因为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

+0

它完美地工作,感谢您的帮助。 – 2015-03-31 11:39:04

1

你的检查没有按” t工作,因为使用typeofgetElementById的返回值将总是给你"object",因为它返回null,如果它找不到,typeof null"object"。直接检查返回值:如果有一个元素,它是一个“真值”值(当用作条件时,强制为true);如果不存在,则null是“虚假”值(强制为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]"); 
+0

它完美地工作,感谢您的帮助。 – 2015-03-31 11:39:36