访问不存在的DOM元素时为什么没有错误?

时间:2013-10-06 14:40:00

标签: javascript jquery

我有一些div有部分观点。为什么对不存在的div的引用不会显示某种错误?例如,我现在只有一个taskN div:

<div id="task1">
    @Html.Partial("~/Views/PartialViews/TaskDosCommand.cshtml")
</div>

这是我的jQuery来显示div:

$('#task' + task.PrestoTaskType).show();

task.PrestoTaskType为1时,task1 div会正确显示。但是,当task.PrestoTaskType不是1时,如2,则没有任何显示(这是好的),但没有错误;网页上未显示任何错误,Chrome开发者工具控制台中未显示任何内容:

enter image description here

访问不存在的DOM元素时,是否应该显示某种错误?

3 个答案:

答案 0 :(得分:3)

不,因为jQuery所做的是.show() jQuery对象包装的所有元素。如果那根本就没有元素,那就这样吧。

这正是jQuery中与monad类似的一个方面,它使它如此有用:想象一下如果事情不能以这种方式工作你必须编写的代码:

var $whatever = $(...);
if ($whatever.length) $.doSomething();

这更糟糕的是:你需要引入一个变量(为了避免浪费)一个有条件的......为了什么收益?

如果您希望查看jQuery匹配的内容,您可以使用上述.length轻松完成此操作,也可以在此过程中使用.filter

答案 1 :(得分:3)

jQuery的一个好处是所有jQuery元素都返回一个集合,无论是0,1还是多个元素。这很方便,因为当你想调用它上面的方法时,你不需要检查集合的大小或自己将它包装在一个数组中(例如each不会破坏0-1元素)。

虽然你所谈论的内容在这种特殊情况下令人沮丧,但jQuery最好以这种方式工作,这样你就不必在其他地方进行各种检查。

答案 2 :(得分:2)

如果你想根据这种元素的存在来分支代码,你可以这样做:

var task = $('#task' + task.PrestoTaskType);

if (task[0]) {
    task.show();
} else {
    // task not found
    // take appropriate steps
}

如果jQuery对象为空,[0]访问器将返回jQuery对象中的第一个DOM元素或undefined。由于您的jQuery对象是使用ID选择器构造的,因此它只包含一个DOM元素,或者它是空的。