Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it more efficient to use find() rather than > for child selector in jQuery?

In jQuery, I thought it will be more efficient to find a child DOM with a specific selector with Implementation 1 as below:

var $dataTable = $('#' + tabId + ' > div.container > div.dataTableContainer > table.dataTable');

But one friend of mine told me that it will be more efficient when using Implementation 2 as below:

var dataTable = $('#' + tabId).find('table.dataTable');

Referenced to other question, I found the Implementation 2 may be less efficient than:

var $dataTable = $('#' + tabId + ' div.container div.dataTableContainer  table.dataTable');

But will Implementation 2 be more efficient than Implementation 1?

like image 622
Javakid Avatar asked Oct 12 '16 08:10

Javakid


2 Answers

document.querySelector() with direct descendant selector > is fastest, .find() is slowest.

var tabId = "abc";

console.time(".find()");
var $dataTable = $('#' + tabId).find('table.dataTable');
console.timeEnd(".find()");

console.time("jQuery(), >");
var $dataTable = $('#' + tabId + ' > div.container > div.dataTableContainer > table.dataTable');
console.timeEnd("jQuery(), >");

console.time("document.querySelector()");
var $dataTable = document.querySelector('#' + tabId + ' div.container div.dataTableContainer  table.dataTable');
console.timeEnd("document.querySelector()");

console.time("document.querySelector(), >");
var $dataTable = document.querySelector('#' + tabId + ' >  div.container > div.dataTableContainer > table.dataTable');
console.timeEnd("document.querySelector(), >");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="abc">
  <div class="container">
    <div class="dataTableContainer">
      <table class="dataTable">
        <tbody>
          <tr>
            <td></td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>

</div>
like image 126
guest271314 Avatar answered Oct 04 '22 01:10

guest271314


My guess:

Under the hood $('#XXX whatever') does a native document.queryselectorAll(), which will check all of the elements within the document to see if they match '#xxx whatever'

$('#XXX').find('whatever') first does a document.getElementById('XXX'), finding the element with id="XXX" and then does a queryselectorAll() within that element, so has fewer child elements to test and see if they match 'whatever'

But this guess is completely negated by real data - see the answer by @guest271314

like image 25
kevmc Avatar answered Oct 04 '22 02:10

kevmc