2015-08-04 5 views
2

Я видел этот шаблон используется в какой-то код ...document.getElementById в качестве селектора JQuery

currency = $(document.getElementById('currency')); 

Что ожидать функционально эквивалентен ...

currency = $('#currency'); 

Я предполагаю, что идея состоит в том, чтобы сделать селектор быстрее, поскольку ему не нужно разбирать строку выбора ... но действительно ли это делает заметную разницу? Есть ли что-то еще в игре, которую я не рассматривал?

Зачем кому-то использовать этот шаблон?

+0

В конце концов, 'getElementById' будет вызван в любом случае. Это выглядит немного как микро-оптимизация ... Давайте не будем даже читать: P – Lix

+0

[Это сравнение] (http://jsperf.com/getelementbyid-vs-jquery-id/44) на самом деле намекает, что там является улучшением с вашим первым примером ... – Lix

ответ

3

Внутренне, когда синтаксический анализ селекторной строки прошел, jQuery автоматически обнаруживает, что вы передали селектор id и звонили document.getElementById для вас.

Итак, когда вы выбираете элемент непосредственно перед вызовом jQuery, вы сохраняете только часть синтаксического анализа селектора, но это незначительно для большинства случаев использования.

См source

0

$(document.getElementById('currency')); не читается, и в конце концов все равно будет getElementById. Вы не увидите его эффекта в большинстве случаев (элемент кэшируется и будет вызываться только один раз).

2

Нет смысл использовать первый синтаксис - как сделать то же самое (во второй части вы пропустите разбор для JQ-запроса) - также JQ может кэшировать запросы - так просто правильный $ ('# .. ') и сохранить свой код чистый enter image description here http://jsperf.com/document-getelementbyid-as-jquery-selector

+1

Эй, jsperf резервную копию - отличный материал! –

+2

Это интересный тест - тестирование случая, когда оно ничего не соответствует. –

+0

@ T.J.Crowder это было описание проблемы - мы просто проверяем выбор элемента - можете ли вы предложить некоторое улучшение? Я буду очень благодарен –

-1

Он использует document.querySelector(), если поддерживается, и если не использует document.getElementById() на мой взгляд, для не Jquery purpopses, document.querySelector() лучше (для меня)

document.querySelector("#id .class > tag.nested"); 
1

Я видел этот шаблон используется в некоторых коде ...

валюты = $ (document.getElementById ('валюта'));

Что ожидать функционально эквивалентен ...

валюты = $ ('# валюта');

, да. Раньше это было не так, когда IE6 и IE7 все еще были на месте. getElementById в IE7 и ранее был сломан и возвращал элементы с соответствующими name, а также соответствующие id. В jQuery (1.x) встроен интеллект для обработки разбитых старых браузеров. К счастью, Microsoft исправила это в IE8.

Я предполагаю, что идея состоит в том, чтобы сделать селектор быстрее, поскольку он не нуждается в анализе строки выбора ... но действительно ли это делает заметную разницу?

Это, вероятно, имеет реальное значение, но не таким образом, что это означает что-либо воспринимаемое в реальном мире.Единственный способ узнать наверняка - test it на DOM, который является представителем тех, кого вы хотите знать, и в браузерах, на которые вы хотите получить ответ. (JSPerf, похоже, возникли проблемы на данный момент, хотя.)

Here's a test что не использовать представительный DOM предлагая существенную процентную разницу:

enter image description here

... но опять же, в реальных условиях, если вы не делаете это миллионы раз в цикле, это не имеет значения. Также обратите внимание, что тестируемые настолько быстрые, что поля ошибки, вероятно, будут большими.

+0

Я думаю, что тест не совсем в моем случае. В моем случае после выбора с 'getElementById' он передается в оболочку jQuery - в тесте, только версия jQuery имеет накладные расходы на создание экземпляра jQuery. –

+0

@BillyMoon: Га, пропустил это. :-) Но ты получил идею. –

+0

интересен об IE6/7, поэтому этот шаблон в основном не выполняет основную задачу jQuery (чтобы сгладить противоречивость браузера), как это иногда бывает (в старых браузерах, где dom-элемент имеет имя attr, как и идентификатор другого), выберите неправильный элемент, тогда как версия jQuery всегда будет выбирать правильный элемент. Это правильно? –

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