2015-03-31 117 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