javascript检查对象存在

时间:2015-03-31 11:22:34

标签: javascript object exists

我有以下代码来检查对象是否存在项目列表。 出于测试目的,我只有一个对象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++;
} 

3 个答案:

答案 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",因为它如果找不到,则返回nulltypeof 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]");