2010-01-16 95 views
29

我總是想知道爲什麼如果我試圖通過id結構中不存在的id選擇器來查找元素,jQuery將返回true。

像這樣:

<div id="one">one</div> 

<script> 
    console.log(!!$('#one')) // prints true 
    console.log(!!$('#two')) // is also true! (empty jQuery object) 
    console.log(!!document.getElementById('two')) // prints false 
</script> 

我知道我可以使用!!$('#two').length因爲長度=== 0,如果對象是空的,但它似乎是合乎邏輯,我認爲,如果發現了一個選擇將返回該元素,否則null (就像原生document.getElementById一樣)。

F.ex,這個邏輯不能在jQuery的完成:

var div = $('#two') || $('<div id="two"></div>'); 

難道不更符合邏輯,如果如果沒有找到ID選擇返回null?

有人嗎?

回答

46

這種行爲選擇,因爲否則的jQuery會定期拋出NullReference例外

幾乎所有的jQuery函數返回一個jQuery對象周圍有問題的DOM元素的包裝,所以你可以使用點符號。

$("#balloon").css({"color":"red"}); 

現在想象$("#balloon")回到。這意味着$("#balloon").css({"color":"red"}); 會拋出一個錯誤,而不是像你期望的那樣默默無聞。

因此,您只能使用.length.size()

+3

我也在想這是其中一個原因。但以這種方式抑制錯誤真的是一個好主意嗎?如果沒有找到id,我確定想知道拋出錯誤的位置而不是調試每個鏈。 – David 2010-01-16 15:41:41

+1

如果您使用id選擇器,這可能是您想要的行爲,因爲id(通常)是唯一的。但是如果您使用類選擇器來關閉頁面上的所有對話框/彈出窗口,該怎麼辦?您不希望函數僅僅因爲用戶當前沒有打開任何對話框而拋出錯誤。你會希望它默默無聞。 – Dan 2010-01-17 12:59:48

+2

JavaScript沒有任何稱爲NullReference異常的東西。也許你的意思是'ReferenceError'? – 2010-01-17 14:15:52

8

這是jQuery的只是如何工作的。

$("#something")

對象0 =#DIV東西長度= 1周的jQuery 1.2.6 =

$("#nothing")

對象長度= 0的jQuery 1.2.6 =

5

可以接近通過訪問元素的長度來做你想做的事情,並與三元運算符結合:

console.log(!!$('#notfound').length); // false 
console.log(!!$('#exists').length); // true 
var element= $('#notfound').length ? $('#notfound') : $('#exists'); 
console.log(element.attr('id')); // outputs 'exists' 

至於問題的心臟:

難道不更符合邏輯,如果如果沒有找到該ID 選擇返回null?

不,不做事的方式JQuery的 - 即支持JQuery的語句鏈接:

$('#notfound').hide("slow", function(){ 
     jQuery(this) 
     .addClass("done") 
     .find("span") 
      .addClass("done") 
     .end() 
     .show("slow", function(){ 
      jQuery(this).removeClass("done"); 
     }); 
    }); 

即使notfound不存在這個代碼將不會停止執行腳本運行。如果初始選擇器返回null,則必須添加if/then塊以檢查null。如果addClass,find,end和show方法返回null,則必須添加if/then塊以檢查每個方法的返回狀態。鏈接是處理動態類型語言(如Javascript)中的程序流程的絕佳方式。

2

你可以檢查jQuery對象的.length財產。就像這樣:

if($("#two").length > 0) { // exists... 

} else { // doesn't exist 

} 
+1

這是很好的一個。它實際上可以縮短:'if($(「#two」)。length)'也應該這樣做。 – miek 2010-01-16 13:58:02

0

總之,您可以將jQuery選擇器的返回值看作包含0..n個元素的組,但從不爲null。

你大概什麼真正感興趣的是$("#two")[0],這將給你通過選擇返回的第一個實際元素。

+0

'$(「#two:first」)'仍然會返回一個jQuery對象。 – James 2010-01-16 11:43:12

+0

謝謝J-P,我糾正了。更新了答案。 – miek 2010-01-16 13:55:39

3

因爲爲Javascript它是一個定義的對象因此不假它返回真,jQuery將總是給你不管該元件是否被找到或沒有一個新的對象 - 然而數組長度將是零,例如

$("span").length

如果你沒有<span>,這將是零,但它可能是1或更多。

您可以編寫自己的插件,以避免重複,如果語句,一個jQuery插件,像我一樣的this one。這是很容易做到:

(function($) 
{ 
     /* Checks if a jQuery object exists in the DOM, by checking the length of its child elements. */ 
     $.fn.elementExists = function() 
     { 
       ///  <summary> 
       ///  Checks if a jQuery object exists in the DOM, by checking the length of its child elements. 
       ///  </summary> 
       ///  <returns type="Boolean" /> 
       return jQuery(this).length > 0; 
     }; 
})(jQuery); 

用法:

if ($("#someid").elementExists()) 
{ 

} 
相關問題