document.getElementById vs jQuery $ ()


620

Це:

var contents = document.getElementById('contents');

Те саме, що це:

var contents = $('#contents');

Враховуючи, що jQuery завантажений?


10
Окрім пунктів, що виникають у відповідях, версія jQuery - додаток. На 100 разів повільніше.

8
це десь доведено?
FranBran

12
@torazaburo Насправді, версія jQuery навіть не в 3 рази повільніше (принаймні, у Chrome). Дивіться: jsperf.com/getelementbyid-vs-jquery-id/44
Michał Perłakowski

2
@ MichałPerłakowski у цьому посиланні версія jquery у 10 разів повільніше. 26mil vs 2.4mil
Claudiu

1
Правильне оновлене посилання для JSPerf: jsperf.com/getelementbyid-vs-jquery-id У моєму випадку (FF 58) це в 1000 разів повільніше. У будь-якому випадку, jQuery все ще виконує 2,5 мільйони оп в секунду. Взагалі це не проблема, і це, звичайно, не може бути порівняно за функціональністю.
Дієго Янчич

Відповіді:


1017

Не зовсім!!

document.getElementById('contents'); //returns a HTML DOM Object

var contents = $('#contents');  //returns a jQuery Object

У jQuery, щоб отримати той самий результат document.getElementById, що і ви, ви можете отримати доступ до об’єкта jQuery і отримати перший елемент в об'єкті (Пам'ятайте, що об’єкти JavaScript діють аналогічно асоціативним масивам).

var contents = $('#contents')[0]; //returns a HTML DOM Object

24
Для всіх, хто цікавиться document.getElementBy, не працює належним чином в <IE8. Він також отримує елементи, nameтому теоретично можна стверджувати, що document.getElementByIdце не тільки вводить в оману, але може повернути неправильні значення. Я думаю, що @John це нове, але я подумав, що це не завадить додати його.
Lime

14
Будьте уважні, якщо ваш ідентифікатор не зафіксовано. $('#'+id)[0]не дорівнює document.getElementById(id)тому, що idможе містити символи, які в jQuery розглядаються спеціально!
Якоб

1
Це було дуже корисно - ніколи цього не знав! Я впевнений, що я його фактично використовував і раніше, що саме мене бентежить. Гей, ви щодня дізнаєтесь щось! Дякую!
jedd.ahyoung

3
google, jquery equivalent of document.getelementbyidі перший результат - це повідомлення. Дякую тобі!!!
ajakblackgoat

$('#contents')[0].idповертає ідентифікаційне ім'я.
Омар

139

Ні.

Виклик document.getElementById('id')поверне необроблений об'єкт DOM.

Виклик $('#id')поверне об'єкт jQuery, який обертає об'єкт DOM та надає методи jQuery.

Таким чином, ви можете викликати лише такі методи jQuery, як css()або animate()під час $()виклику.

Ви також можете написати $(document.getElementById('id')), що поверне об’єкт jQuery і еквівалентно $('#id').

Ви можете отримати базовий об'єкт DOM від об’єкта jQuery, написавши $('#id')[0].


4
Чи знаєте ви, хто з них швидший - $ (document.getElementById ('елемент')) проти $ ('# елемент')?
Іван Івкович

10
@ IvanIvković: Перший - швидший, оскільки не передбачає розбору рядків.
СЛАкс

1
@SLaks Яка основна відмінність між необробленим об'єктом DOM та об'єктом jQuery? Тільки що, використовуючи jQuery об'єкт, ми маємо можливість застосовувати методи jQuery?
Roxy'Pro

@ Roxy'Pro: Це різні об'єкти. Об'єкти jQuery обгортають об'єкти DOM. Дивіться документацію.
СЛАкс

Цей doc- об’єкти JavaScript DOM в порівнянні з jQuery-об’єктами виглядає корисним. In one sentence, DOM objects are the objects that the web browser is using to render elements on the web page whereas jQuery objects are basically wrapper objects around a set of DOM elements.
user3454439

31

Близько, але не те саме. Вони отримують той самий елемент, але версія jQuery загорнута в об’єкт jQuery.

Еквівалент був би таким

var contents = $('#contents').get(0);

або це

var contents = $('#contents')[0];

Вони витягнуть елемент із об’єкта jQuery.


29

Примітка про різницю швидкості. Прикріпіть наступний фрагмент до дзвінка onclick:

function myfunc()
{
    var timer = new Date();

        for(var i = 0; i < 10000; i++)
        {
            //document.getElementById('myID');
            $('#myID')[0];
        }


    console.log('timer: ' + (new Date() - timer));
}

По черзі коментуйте одного, а потім прокоментуйте іншого. У моїх тестах,

document.getElementbyId в середньому становив приблизно 35 мс (коливається від 25msдо 52msна приблизно 15 runs)

З іншого боку,

jQuery в середньому становив близько 200 мс (починаючи від приблизно 181msдо 222msприблизно 15 runs).

З цього простого тесту видно, що jQuery зайняв приблизно 6 разів довше.

Звичайно, це над 10000ітераціями, тому в більш простій ситуації я б, мабуть, використовував jQuery для зручності використання та всіх інших класних речей, таких як .animateі .fadeTo. Але так, технічно getElementByIdце зовсім трохи швидше .


Дякую за цю відповідь. Я хотів запитати, повинен чи я замінити всі $('#someID') з document.getElementById("someID") ? Я працюю над тим, в чому я широко використовував, $('#someID')і моя сторінка працює повільно для великих входів файлів. Підкажіть будь-ласка, яким повинен бути мій крок
Mazhar MIK

Якщо ви повторно використовуєте один і той же один раз у тому ж обсязі, тоді збережіть його, як var $myId = $('#myId');і повторно використовуйте збережену змінну $myId. Пошук за ідентифікатором, як правило, досить швидка річ, хоча так, якщо сторінка млява, можливо, є інша причина.
медсестра

Дякую @nurdyguy Це було корисно. Я спробую це здійснити.
Мажар МІК

17

Ні. Перший повертає елемент DOM або null, тоді як другий завжди повертає об'єкт jQuery. Об'єкт jQuery буде порожнім, якщо жоден елемент з ідентифікатором не будеcontents не збігався.

Елемент DOM, який повертається, document.getElementById('contents')дозволяє вам робити такі речі, як зміна .innerHTML(або .value) тощо, однак вам потрібно буде використовувати методи jQuery на Об'єкт jQuery.

var contents = $('#contents').get(0);

Є більш еквівалентним, однак якщо жоден елемент з ідентифікатором contentsне збігається, document.getElementById('contents')повернеться в нулевий, але$('#contents').get(0) повернеться невизначеним.

Одна з переваг використання об’єкта jQuery полягає в тому, що ви не отримаєте помилок, якщо жодні елементи не повернулися, оскільки об'єкт завжди повертається. Однак ви отримаєте помилки, якщо спробуєте виконати операції з nullповерненимdocument.getElementById


15

Ні, насправді такий же результат був би:

$('#contents')[0] 

jQuery не знає, скільки результатів буде повернуто з запиту. Що ви отримуєте назад - це спеціальний об’єкт jQuery, який представляє собою сукупність усіх елементів управління, які відповідають запиту.

Частина того, що робить jQuery настільки зручним, полягає в тому, що методи MOST, що викликаються на цьому об'єкті, схожі на те, що вони призначені для одного елемента керування, насправді знаходяться в циклі, що викликається всіма членами в колекції

Коли ви використовуєте синтаксис [0], ви берете перший елемент із внутрішньої колекції. У цей момент ви отримуєте об’єкт DOM


10

У випадку, якщо хтось інший потрапить на це ... Ось ще одна різниця:

Якщо ідентифікатор містить символи, які не підтримуються стандартом HTML (див. Питання ТАК тут ), то jQuery може не знайти його, навіть якщо getElementById.

Це сталося зі мною з ідентифікатором, що містить символи "/" (наприклад: id = "a / b / c"), використовуючи Chrome:

var contents = document.getElementById('a/b/c');

вдалося знайти свій елемент, але:

var contents = $('#a/b/c');

не.

До речі, найпростішим виправленням було переміщення цього ідентифікатора в поле імені. У JQuery не було проблем з пошуком елемента за допомогою:

var contents = $('.myclass[name='a/b/c']);

5

Як і більшість людей сказали, головна відмінність полягає в тому, що він загорнутий в об'єкт jQuery з викликом jQuery проти необробленого об'єкта DOM за допомогою прямого JavaScript. Об'єкт jQuery зможе, звичайно, виконувати інші функції jQuery з ним, але, якщо вам просто потрібно виконати прості маніпуляції з DOM, як, наприклад, базовий стиль чи обробку базових подій, метод прямого JavaScript - це завжди трохи швидше, ніж jQuery, оскільки ви цього не робите ' не доведеться завантажувати у зовнішню бібліотеку коду, побудовану на JavaScript. Це економить додатковий крок.


5

var contents = document.getElementById('contents');

var contents = $('#contents');

Фрагменти коду неоднакові. Перший повертає Elementоб'єкт ( джерело ). Другий еквівалент jQuery поверне об'єкт jQuery, що містить колекцію або нуля, або одного елемента DOM. ( документація jQuery ). Внутрішньо jQuery використовує document.getElementById()для ефективності.

В обох випадках, якщо більше одного знайденого елемента буде повернуто лише перший елемент.


Під час перевірки проекту github на jQuery я виявив такі фрагменти рядків, які, здається, використовують коди document.getElementById ( https://github.com/jquery/jquery/blob/master/src/core/init.js рядок 68 далі)

// HANDLE: $(#id)
} else {
    elem = document.getElementById( match[2] );

4

Ще одна відмінність: getElementByIdповертає перший збіг, тоді як $('#...')повертає колекцію збігів - так, той самий ідентифікатор можна повторити в HTML-документі.

Далі, getElementIdвикликається з документа, в той час як $('#...')може бути викликаний з селектора. Отже, у наведеному нижче коді document.getElementById('content')повернеться все тіло, але $('form #content')[0]повернеться всередину форми.

<body id="content">
   <h1>Header!</h1>
   <form>
      <div id="content"> My Form </div>
   </form>
</body>

Можливо, дивно використовувати дублікати ідентифікаторів, але якщо ви використовуєте щось на зразок Wordpress, шаблон або плагін може використовувати той самий ідентифікатор, який ви використовуєте у вмісті. Вибірковість jQuery може допомогти вам там.


2

jQuery побудований на JavaScript. Це означає, що все одно просто javascript.

document.getElementById ()

Метод document.getElementById () повертає елемент, який має атрибут ID із вказаним значенням, і повертає нуль, якщо немає елементів із зазначеним ідентифікатором. Ідентифікатор повинен бути унікальним на сторінці.

Jquery $ ()

Виклик jQuery () або $ () за допомогою селектора ідентифікатора як його аргументу поверне об’єкт jQuery, що містить колекцію або нуля, або одного елемента DOM. Кожне значення id повинно використовуватися лише один раз у документі. Якщо більше одного елемента було призначено однаковий ідентифікатор, запити, які використовують цей ідентифікатор, виберуть лише перший відповідний елемент у DOM.


1

Я розробив базу даних noSQL для зберігання дерев DOM у веб-браузерах, де посилання на всі елементи DOM на сторінці зберігаються в короткому індексі. Таким чином, функція "getElementById ()" не потрібна для отримання / зміни елемента. Коли елементи дерева DOM інстанціюються на сторінці, база даних присвоює сурогатні первинні ключі кожному елементу. Це безкоштовний інструмент http://js2dx.com


1

Усі відповіді вище є правильними. Якщо ви хочете побачити його в дії, не забувайте, що у браузері є консоль, де ви можете бачити фактичний результат:

У мене HTML:

<div id="contents"></div>

Перейдіть на консоль (cntrl+shift+c)і скористайтеся цими командами, щоб чітко побачити результат

document.getElementById('contents')
>>> div#contents

$('#contents')
>>> [div#contents,
 context: document,
 selector: "#contents",
 jquery: "1.10.1",
 constructor: function,
 init: function …]

Як ми бачимо, у першому випадку ми отримали сам тег (тобто, строго кажучи, об’єкт HTMLDivElement). В останньому ми фактично маємо не звичайний об’єкт, а масив об'єктів. Як зазначено в інших відповідях вище, ви можете використовувати таку команду:

$('#contents')[0]
>>> div#contents

1

На сьогодні всі відповіді старі. На 2019 рік ви можете безпосередньо отримати доступ до ідентифікаційних файлів з ідентифікаційними файлами в JavaScript, просто спробуйте

<p id="mytext"></p>
<script>mytext.innerText = 'Yes that works!'</script>

Інтернет-демонстрація! - https://codepen.io/frank-dspeed/pen/mdywbre

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.