2013-10-06 43 views
0

我有一些部分視圖的divs。爲什麼對不存在的div的引用不會顯示某種錯誤?例如,我只有一個taskN格設置現在:訪問不存在的DOM元素時爲什麼沒有錯誤?

<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元素時?

+1

想想如果'$('selector')'意思是「準備與這個選擇器匹配的一組DOM元素」。集可以是空的,所以空集不是錯誤。隨後的調用如'.show()'意味着,「爲集合中的每個元素執行此操作。」再說一遍,如果它是一個空集,就沒有問題。你總是可以顯式檢查一個jQuery對象的'.length',看它是否實際上是空的。 – Pointy

回答

3

不,因爲jQuery所做的是.show()jQuery對象包裝的所有元素。如果那根本不是要素,那就這樣吧。

這正是jQuery的的單子樣,使得它非常有用:想象你就不得不寫,如果事情沒有工作,這樣的代碼:

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

這簡直是糟糕的是:你需要引入一個變量(爲了避免浪費)一個有條件的......爲了什麼而獲得確切的收益?

如果你想看到什麼jQuery的匹配,你可以做到這一點很容易與.length如上,或許也是使用的過程中.filter

+0

當然,這是一個好處,但我始終認爲沒有錯誤的原因是因爲jQuery * always *返回一個jQuery對象,它具有show()方法(或其他)。 –

+0

@DavidThomas:確實如此。 – Jon

3

jQuery的好處之一就是所有的jQuery元素都返回一個集合,無論是0,1還是多個元素。這很方便,因爲當你想調用它的方法時,你不需要檢查集合的大小,或者自己將它包裝在一個數組中。(例如each對於0-1個元素不會中斷)。

雖然在這種特殊情況下你所說的令人沮喪,但jQuery最好以這種方式工作,所以你不必在其他地方進行這些檢查。

2

如果你想基於這樣的元素的存在分支代碼,你可以這樣做:

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

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

[0]訪問將在如果jQuery對象jQuery對象或undefined返回第一個DOM元素是空的。由於您的jQuery對象是使用ID選擇器構造的,因此它只包含一個DOM元素,或者它是空的。

相關問題