2009-10-26 61 views
1

$("*", $("#container1"))$("#container2").find("*")之間的區別是什麼? 我通常使用AA,但在這種情況下可能會更加奇怪。

<html> 
<head> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script> 
<script language="JavaScript"> 
$(function(){ 

    var endTime = 0, iniTime = 0, counter = 0; 

    iniTime = (new Date()).getTime(); 
    $("*", $("#container1")).each(function() 
    { 
     counter++; 
    }); 
    endTime = (new Date()).getTime(); 

    $("#result").append("<div>Container enviroment -> "+counter+" "+(endTime-iniTime)+"</div>"); 

    endTime = 0; iniTime = 0; counter = 0; 
    iniTime = (new Date()).getTime(); 
    $("#container2").find("*").each(function() 
    { 
     counter++; 
    }); 
    endTime = (new Date()).getTime(); 

    $("#result").append("<div>Find method -> "+counter+" "+(endTime-iniTime)+"</div>"); 

}); 

</script> 
</head> 
<body> 
    <div id="result"></div> 
    <div id="container1"> 
     <span></span>... 
     </div> 
    <div id="container2"> 
     <span></span>... 
    </div> 
</body> 
</html> 

Result: 

IE8 
Container enviroment -> 9752 282 
Find method -> 9752 296 

Chrome 4.0 
Container enviroment -> 9752 65 
Find method -> 9752 66 

Firefox 
Container enviroment -> 9752 135 
Find method -> 9752 125 

Safari 
Container enviroment -> 9752 46 
Find method -> 9752 51 

回答

2

正確使用時,上下文選擇器與查找沒有區別。 Resig表示他不喜歡上下文選擇器,並且傾向於使用.find(),因爲它在語義上更有意義。

有很多方法搞砸上下文;例如,傳遞字符串不起作用,並導致選擇器默認解析整個文檔。我相當確定你的例子正確地使用上下文(沒有時間測試),但是再一次使用.find()打敗了這種不確定性。

+0

但是你不覺得給它一個開始上下文會阻止它不必掃描整個DOM,從而選擇更好的表現?取決於頁面,這可能會對性能產生重大影響。 – 2009-10-26 17:17:18

+0

我確實注意到了他的測試,但由於不切實際的標記結構,我不確定它們是否相關。 – 2009-10-26 17:17:59

+0

+1完全同意。如果它對OP有幫助,這裏的上下文有一篇很好的博客文章:http://beardscratchers.com/journal/jquery-its-all-about-context – karim79 2009-10-26 17:18:17

1

我相信上下文選擇器必須隱式調用find()本身。

爲了簡單起見,最好只使用find()

編輯:從1.3.2源代碼:

// HANDLE: $(expr, [context]) 
// (which is just equivalent to: $(content).find(expr) 
相關問題