[javascript] jQuery選擇器:為什麼$(“#id”)。find(“p”)比$(“#id p”)快


0 Answers

這是瀏覽器特定的,因為jQuery在可用時使用querySelectorAll 。 當我在WebKit中測試時,速度確實很快。 事實證明, querySelectorAll針對這種情況進行了優化。

在WebKit內部,如果整個選擇器是#<id>並且該文檔中只有一個具有該id的元素,則它將被優化為getElementById 。 但是,如果選擇器是其他任何東西, querySelectorAll遍歷文檔尋找匹配的元素。

是的,應該可以優化這個案例,使他們執行相同的 - 但現在,沒有人。 您可以在WebKit源代碼中找到它, SelectorDataList::execute使用SelectorDataList::canUseIdLookup來決定是否使用getElementById 。 它看起來像這樣:

if (m_selectors.size() != 1)
    return false;
if (m_selectors[0].selector->m_match != CSSSelector::Id)
    return false;
if (!rootNode->inDocument())
    return false;
if (rootNode->document()->inQuirksMode())
    return false;
if (rootNode->document()->containsMultipleElementsWithId(m_selectors[0].selector->value()))
    return false;
return true;

如果您在非WebKit瀏覽器中進行測試,則可能是因為缺少類似的優化。

Question

這個頁面的作者: http : //24ways.org/2011/your-jquery-now-with-less-suck斷言jQuery選擇器$('#id').find('p')$('#id p') ,儘管如果我理解正確,那大概會產生相同的結果。 這種差異的原因是什麼?




Related