在做任何事情之前,我应该测试一个元素是否存在吗?

时间:2013-02-17 06:21:51

标签: jquery

假设我有以下HTML和Javascript。这里,页面上只有1个div,但在任何给定时间,总共可能有2个div(动态插入)。

在jQuery中,你应该首先测试一个元素是否存在,然后再对它做任何事情,特别是如果你知道它可能不存在吗?

我应该使用if (('#div2).length > 0)进行测试吗?

或者我应该让jQuery搞清楚吗?我知道如果不存在,jQuery足够聪明,知道元素不存在,所以它不会对它做任何事情,也不会抛出错误。但是,首先测试它是否存在是否更好?最佳实践可能还是存在性能差异?

HTML:

<div id="div1"></div>

使用Javascript:

$('#div1').text('Hello World!');

/*
  Should I first test and see if this div exists?
  With if (('#div2').length > 0)
  Or leave it as is and let jQuery handle it
*/
$('#div2').text('Should I have first tested to see if this div existed?');

2 个答案:

答案 0 :(得分:0)

我相信您可能不应该在不存在的元素上执行代码。话虽如此,我无法想象在没有匹配元素的选择器上执行操作会产生任何实际问题。所以不应该测试它。

jQuery循环遍历所有匹配的元素以执行操作,因此如果它不匹配任何元素,它将只循环任何东西。除了非常小的潜在性能提升之外,我看不出你会获得什么。

“过早成熟是所有邪恶的根源。” -Donald Knuth

答案 1 :(得分:0)

jQuery的工厂函数返回的对象是类似数组的。选定的DOM元素将设置为数字索引({0: elem1, 1:elem2, etc})。 length属性将设置为匹配元素的数量。

jQuery的方法都旨在迭代元素集合以执行操作。这实质上意味着obj.test('foo')等同于:

for (i = 0; i < obj.length; i++) {
    obj[i].textContent = 'foo';
}

如果集合中没有元素,则方法不会执行任何操作,因为迭代器永远不会迭代。

所以,tl; dr,在对选择执行操作之前,很少有理由检查选择是否包含元素。