2016-01-10 2 views
2

Учитывая следующий HTML:document.getElementsByClassName ("СТГ") против document.querySelectorAll ("# Идентификатор тэгу")

<ul id="menu-mobile" > 
      <li class="menu"><a href="#">Link 1</a></li> 
      <li class="menu"><a href="#">Link 2</a></li> 
      <li class="menu"><a href="#">Link 3</a></li> 
    </ul> 

Как предназначаться все <li> с в лучшем подходе? это с использованием имени класса или идентификатора с querySelectorAll()?

var menuLink = document.querySelectorAll('#menu-mobile li');  
for (var i = 0; i < menuLink.children.length; i++) { 
var childElement = menuLink.children[i]; 
childElement.addEventListener('click', doSomething, false); 
} 

function doSomething() { 
    alert("Hello"); 
} 

и

var menuLink = document.getElementsByClassName('menu');  
for (var i = 0; i < menuLink.children.length; i++) { 
var childElement = menuLink.children[i]; 
childElement.addEventListener('click', doSomething, false); 
} 

function doSomething() { 
    alert("Hello"); 
} 

оба работают.

Благодаря

+0

'getElementsByClassName' приятно, если вам нужно отслеживать динамический набор элементов, поскольку это живая коллекция, но это на самом деле редко, и нетрудно сбить другой' querySelectorAll', когда вам нужен доступ к коллекции. Короче говоря, существует небольшой/редкий вариант использования для 'getElementsByClassName', все остальное должно использоваться' querySelectorAll' – dandavis

+0

@ dandavis, я вижу, большое спасибо –

ответ

3

querySelectorAll не требует, чтобы блокировать разметку, добавив класс к каждому элементу в списке (и поддерживается IE8).

+0

Спасибо, сэр ;-) –

1

Это зависит. getElementsByClassName - much faster, и этот факт может быть полезен, если вам требуется максимальная производительность. querySelectorAll является более подходящим для разработчиков в случае сложных запросов к DOM.

+0

Этот тест не отражает код в вопросе. Он использует селектор атрибутов, который не задает вопрос. – Quentin

+1

Я не думаю, что скорость выполнения имеет значение, потому что вы не должны вызывать ни одного очень часто, а если вы, то кеширование будет быстрее, чем либо. вам также нужно иметь в виду скрытые затраты на живые коллекции (например, из getElementsByClassName). эта коллекция обновляет, нужно ли это или нет, и в любое время что-то вставляется в дом, эта коллекция становится грязной и ее необходимо перестроить перед использованием. – dandavis

+0

@Quentin: это то, что я тоже думал, но на других тестах использование «.class», похоже, не намного быстрее, чем атрибут. я бы предположил, что кто-то все равно преобразуется в другую ... – dandavis

Смежные вопросы