There IS a difference, and it is NOT subtle as others believe.
EDIT: Layman’s example of each:
- Call all the blue houses in town (context), if Jane is there, tip off her hat.
- Call all the buildings in town (no context yet). IF it is a blue house (add context) and Jane is there, tip off her hat.
Let’s break down what it selects.
First we have: Context selector http://api.jquery.com/jQuery/#jQuery-selector-context
$('input.current_title', '#storePreferences').prop('disabled', false);
This says: use a selector in context. http://api.jquery.com/jQuery/#jQuery-selector-context
While this form MIGHT work, it should really be:
$('input.current_title', $('#storePreferences')).prop('disabled', false);
OR
var myContext = $('#storePreferences');
$('input.current_title', myContext).prop('disabled', false);
This meets the requirement for a context selector being met: “A DOM Element, Document, or jQuery to use as context”.
This says: using the context, find inside that the selector. An equivalent would be:
$('#storePreferences').find('input.current_title').prop('disabled', false);
Which is what happens internally. Find '#storePreferences'
and in that find all the 'input.current_title'
matching elements.
Then we have: Descendant Selector
$('#storePreferences input.current_title').prop('disabled', false);
This is a Descendant Selector (“ancestor descendant”) http://api.jquery.com/descendant-selector/ which says: find all the input.current_title
elements inside the #storePreferences
element. THIS IS WHERE IT GETS TRICKY! – that is EXACTLY what it does –
finds ALL the input.current_title
(anywhere), then finds those INSIDE the #storePreferences
element.
Thus, we run into jQuerys’ Sizzle right to left selector – so it initially finds MORE(potentially) than it needs which could be a performance hit/issue.
Thus the form of:
$('#storePreferences').find('input.current_title').prop('disabled', false);
would perform better than the Descendant version most likely.