Во время мониторинга / попытки ответить на распространенные вопросы о jQuery я заметил, что существуют определенные практики использования javascript вместо jQuery, которые фактически позволяют вам писать меньше и делать ... ну, в общем, столько же. А также может принести выигрыш в производительности.
Конкретный пример
$(this)
против this
Внутри события клика, ссылающегося на идентификатор кликаемых объектов
JQuery
$(this).attr("id");
Javascript
this.id;
Существуют ли другие распространенные практики, подобные этой? Где некоторые операции Javascript могут быть выполнены проще, без привлечения JQuery в смесь. Или это редкий случай? (из jQuery "ярлыка", на самом деле требующего больше кода)
РЕДАКТИРОВАТЬ: Хотя я ценю ответы относительно jQuery против простой производительности javascript, я на самом деле ищу гораздо более количественные ответы. При использовании jQuery , в тех случаях, когда было бы лучше (удобочитаемость / компактность) использовать простой javascript вместо использования $()
. В дополнение к примеру, который я привел в своем первоначальном вопросе.
источник
this.id
?Ответы:
this.id
(как вы знаете)this.value
(для большинства типов ввода. Единственные проблемы, которые мне известны, это IE, когда свойства a<select>
неvalue
установлены на его<option>
элементах, или радиовходы в Safari.)this.className
получить или установить целое свойство классаthis.selectedIndex
против,<select>
чтобы получить выбранный индексthis.options
против,<select>
чтобы получить список<option>
элементовthis.text
против,<option>
чтобы получить его текстовое содержаниеthis.rows
против,<table>
чтобы получить коллекцию<tr>
элементовthis.cells
против,<tr>
чтобы получить его клетки (тд и т)this.parentNode
чтобы получить прямой родительthis.checked
чтобы получить проверенное состояниеcheckbox
Спасибо @Tim Downthis.selected
чтобы получить выбранное состояниеoption
Спасибо @Tim Downthis.disabled
чтобы получить отключенное состояниеinput
Спасибо @Tim Downthis.readOnly
чтобы получить состояниеinput
ReadOnly Спасибо @Tim Downthis.href
против<a>
элемента, чтобы получить егоhref
this.hostname
против<a>
элемента, чтобы получить домен егоhref
this.pathname
против<a>
элемента, чтобы получить путь егоhref
this.search
против<a>
элемента, чтобы получить строку запроса егоhref
this.src
против элемента, где допустимо иметьsrc
... Я думаю, вы поняли идею.
Будут времена, когда производительность имеет решающее значение. Например, если вы выполняете что-то в цикле много раз, вы можете отказаться от jQuery.
В общем, вы можете заменить:с участием:Выше был плохо сформулирован.
getAttribute
не является заменой, но он извлекает значение атрибута, отправленного с сервера, и соответствующийsetAttribute
ему устанавливает его. Необходим в некоторых случаях.Приведенные ниже предложения как бы покрывают это. Смотрите этот ответ для лучшего лечения.
... для прямого доступа к атрибуту. Обратите внимание, что атрибуты не совпадают со свойствами (хотя иногда они отражают друг друга). Конечно там
setAttribute
тоже.Скажем, у вас возникла ситуация, когда получили страницу, где нужно развернуть все теги определенного типа. Это быстро и просто с jQuery:
Но если их много, вы можете захотеть сделать небольшой нативный DOM API:
Этот код довольно короткий, он работает лучше, чем версия jQuery, и его легко превратить в функцию многократного использования в вашей личной библиотеке.
Может показаться, что у меня бесконечный цикл с внешним
while
из-заwhile(spans[0])
, но поскольку мы имеем дело с «живым списком», он обновляется, когда мы делаемparent.removeChild(span[0]);
. Это довольно изящная функция, которую мы упускаем при работе с массивом (или объектом, похожим на массив).источник
this.value
когда в некоторых случаях есть пара особенностей браузера. Все зависит от ваших потребностей. Есть много хороших техник, которые легко без jQuery, особенно когда производительность имеет решающее значение. Я постараюсь думать больше.attr()
массово злоупотребляется. Если вы имеете дело только с одним элементом, тогда вам это понадобится редкоattr()
. Два из моих любимых - путаница вокругchecked
свойства флажков (всевозможные мистические заклинания вокруг этого:$(this).attr("checked", "checked")
и$(this).is(":checked")
т. Д.) И аналогичноselected
свойству<option>
элементов.getAttribute()
. Вам это почти никогда не нужно : он не работает в IE, не всегда отражает текущее состояние и в любом случае это не то, что делает jQuery. Просто используйте свойства. stackoverflow.com/questions/4456231/…Правильный ответ заключается в том, что вы всегда будете терять производительность при использовании jQuery вместо «старого» нативного JavaScript. Это потому, что jQuery - это библиотека JavaScript. Это не какая-то необычная новая версия JavaScript.
Причина того, что jQuery является мощным, заключается в том, что он делает некоторые вещи чрезмерно утомительными в кросс-браузерной ситуации (AJAX - один из лучших примеров) и сглаживает несоответствия между множеством доступных браузеров и предоставляет согласованный API. Это также легко облегчает такие понятия, как связывание, подразумеваемая итерация и т. Д., Чтобы упростить совместную работу над группами элементов.
Изучение jQuery не заменит изучение JavaScript. У вас должна быть прочная основа в последнем, чтобы вы в полной мере оценили то, что знание первого облегчает вам задачу.
- Отредактировано, чтобы охватить комментарии -
Поскольку комментарии быстро указывают (и я согласен со 100%), приведенные выше утверждения относятся к бенчмаркингу. «Нативное» решение JavaScript (при условии, что оно хорошо написано) превзойдет решение jQuery, которое выполняет то же самое почти в каждом случае (я хотел бы увидеть пример в противном случае). JQuery ускоряет время разработки, что является значительным преимуществом, которое я не хочу преуменьшать. Он обеспечивает легкий для чтения, легкий для понимания код, который некоторые разработчики могут создавать самостоятельно.
По моему мнению, ответ зависит от того, чего вы пытаетесь достичь. Если, как я полагаю, исходя из вашей ссылки на выигрыш в производительности, вам не хватает максимальной скорости работы приложения, то использование jQuery приводит к дополнительным расходам при каждом вызове
$()
. Если вы предпочитаете удобочитаемость, согласованность, совместимость с различными браузерами и т. Д., То, безусловно, есть причины отдавать предпочтение jQuery над «нативным» JavaScript.источник
$()
. Если вы не сделаете этот звонок, вы сэкономите время.Там есть фреймворк, который называется ... о, угадайте, что?
Vanilla JS
, Надеюсь, вы получите шутку ...: D Он жертвует разборчивостью кода для производительности ... Сравнивая его с приведеннымjQuery
ниже, вы можете увидеть, что получениеDOM
элементаID
почти в 35 раз быстрее. :)Так что, если вам нужна производительность, вам лучше попробовать Vanilla JS и сделать свои собственные выводы. Может быть, у вас не будет JavaScript, который может повесить графический интерфейс браузера / заблокировать поток пользовательского интерфейса во время интенсивного кода, как внутри
for
цикла.На их домашней странице есть несколько сравнений:
источник
Уже есть принятый ответ, но я считаю, что ни один из ответов, набранных непосредственно здесь, не может быть исчерпывающим в своем списке нативных методов / атрибутов javascript, который практически гарантирует межбраузерную поддержку. Для этого я могу перенаправить вас в причудливый режим:
http://www.quirksmode.org/compatibility.html
Это, пожалуй, самый полный список того, что работает и что не работает в любом браузере. Обратите особое внимание на раздел DOM. Читать много, но дело не в том, чтобы прочитать все, а в том, чтобы использовать его в качестве справочного материала.
Когда я начал серьезно писать веб-приложения, я распечатал все таблицы DOM и повесил их на стену, чтобы я сразу понял, что безопасно для использования и что требует взлома. В эти дни я просто гуглю что-то вроде того,
quirksmode parentNode compatibility
когда у меня есть сомнения.Как и все остальное, суждение в основном зависит от опыта. Я бы не советовал вам читать весь сайт и запоминать все проблемы, чтобы выяснить, когда использовать jQuery, а когда использовать простой JS. Просто будьте в курсе списка. Это достаточно легко для поиска. Со временем у вас разовьется инстинкт, когда простой JS предпочтительнее.
PS: PPK (автор сайта) также имеет очень хорошую книгу, которую я рекомендую прочитать
источник
Когда:
использовать JavaScript. В противном случае используйте jQuery (если можете).
Изменить : Этот ответ применяется как при выборе использования jQuery в целом, а не при его исключении, так и при выборе, использовать ли vanilla JS внутри jQuery. Выбор между
attr('id')
и.id
склоняется в пользу JS, в то время как выбор междуremoveClass('foo')
и.className = .className.replace( new Regexp("(?:^|\\s+)"+foo+"(?:\\s+|$)",'g'), '' )
склоняется в пользу JQuery.источник
.classList.remove('foo')
кажется, работает нормально в новых браузерахОтветы других были сосредоточены на широком вопросе «JQuery против простого JS». Судя по вашему OP, я думаю, вы просто задались вопросом, когда лучше использовать vanilla JS, если вы уже решили использовать jQuery. Ваш пример является прекрасным примером того, когда вы должны использовать vanilla JS:
$(this).attr('id');
Это медленнее и (на мой взгляд) менее читабельно, чем:
this.id
,Это медленнее, потому что вам нужно раскрутить новый объект JS, просто чтобы получить атрибут способом jQuery. Теперь, если вы собираетесь использовать его
$(this)
для выполнения других операций, во что бы то ни стало, сохраните этот объект jQuery в переменной и оперируйте этим. Однако я сталкивался со многими ситуациями, когда мне просто нужен атрибут из элемента (например,id
илиsrc
).Я думаю, что наиболее распространенным случаем является тот, который вы описываете в своем посте; люди,
$(this)
без всякой необходимости заворачивающие объект jQuery. Я вижу это чаще всего сid
иvalue
(вместо использования$(this).val()
).Редактировать: вот статья, которая объясняет, почему использование jQuery в этом
attr()
случае медленнее. Исповедь: украл ее из тега вики, но я думаю, что стоит упомянуть вопрос.Отредактируйте еще раз: учитывая удобочитаемость / производительность при непосредственном доступе к атрибутам, я бы сказал, что хорошим правилом, вероятно, является попытка использовать его,
this.<attributename>
когда это возможно. Вероятно, в некоторых случаях это не сработает из-за несоответствий браузера, но, вероятно, лучше сначала попробовать это и воспользоваться jQuery, если он не работает.источник
this.style.display = 'none'
. Это лучше чем$(this).hide()
? Я бы сказал, что последний лучше читается, но первый, скорее всего, быстрее. Нет ничего плохого в том, чтобы поэкспериментировать самостоятельно, чтобы увидеть, будут ли определенные действия работать в браузерах без jQuery. Обычно это делается перед тем, как обернуть элемент в объект jQuery для выполнения операции.Если вас больше всего беспокоит производительность, ваш главный пример - удар по голове. Вызывать jQuery излишне или избыточно, IMHO, вторая основная причина низкой производительности (первая - плохой обход DOM).
На самом деле это не пример того, что вы ищете, но я вижу это так часто, что стоит упомянуть: один из лучших способов повысить производительность ваших jQuery-скриптов - это кешировать объекты jQuery и / или использовать цепочку:
источник
var something
мне не нужно было кэшировать объект jQuery (поскольку я использовал цепочку), но я все равно делаю это по привычке.$('.something')
дважды означает, что jQuery должен дважды пройти DOM, ища все элементы с этим селектором.$(this)
уменьшает количество вызовов функции jQuery. Это даст вам наибольшую выгоду в петлевом сценарии.element
равно$(this)
. Это не содержит несколько элементов.Я обнаружил, что JS и JQ частично совпадают. Код, который вы показали, является хорошим примером этого. Честно говоря, лучшая причина использовать JQ поверх JS - просто совместимость с браузерами. Я всегда склоняюсь к JQ, даже если я могу достичь чего-то в JS.
источник
Это мое личное мнение, но так как jQuery в любом случае является JavaScript, я думаю, что теоретически он не может работать лучше, чем vanilla JS.
Но практически он может работать лучше, чем рукописный JS, поскольку рукописный код может быть не таким эффективным, как jQuery.
Итог - для небольших вещей я склонен использовать vanilla JS, для интенсивных проектов JS мне нравится использовать jQuery, а не изобретать велосипед - это также более продуктивно.
источник
Список живых свойств первого ответа
this
в качестве элемента DOM довольно полон.Вам также может быть интересно узнать некоторых других.
Когда это документ:
this.forms
чтобы получитьHTMLCollection
текущие формы документов,this.anchors
чтобы получитьHTMLCollection
всеHTMLAnchorElements
сname
установленным,this.links
чтобы получитьHTMLCollection
всеHTMLAnchorElement
s сhref
установкой,this.images
чтобы получитьHTMLCollection
всеHTMLImageElement
сthis.applets
Когда вы работаете с
document.forms
,document.forms[formNameOrId]
получает так называемую или идентифицированную форму.Когда это форма:
this[inputNameOrId]
чтобы получить так называемое или идентифицированное полеКогда это поле формы:
this.type
чтобы получить тип поляПри изучении селекторов jQuery мы часто пропускаем изучение уже существующих свойств элементов HTML, к которым так быстро получить доступ.
источник
document.embeds
иdocument.plugins
также широко поддерживаются (DOM 0).document.scripts
это также удобный набор, определенный в спецификации HTML5 и широко поддерживаемый (и Firefox 9+ ).Как обычно, я опаздываю на эту вечеринку.
Это не было дополнительной функциональностью, которая заставила меня принять решение использовать jQuery, столь же привлекательный, как это было. Ведь ничто не мешает вам писать свои собственные функции.
Это был тот факт, что при модификации DOM нужно было учиться многим трюкам, чтобы избежать утечек памяти (я говорю о вас, IE). Иметь один центральный ресурс, который управлял всеми этими проблемами для меня, написанный людьми, которые были намного лучше, чем JS-программисты, чем я когда-либо буду, и который постоянно пересматривался, пересматривался и проверялся, был послан Богом.
Я предполагаю, что этот вид подпадает под аргумент кросс-браузерной поддержки / абстракции.
И, конечно же, jQuery не исключает использования прямой JS, когда вам это нужно. Я всегда чувствовал, что эти два, казалось, работали без проблем вместе.
Конечно, если ваш браузер не поддерживается jQuery или вы поддерживаете низкоуровневую среду (старый телефон?), Тогда большой файл .js может быть проблемой. Помните, когда jQuery был крошечным?
Но обычно разница в производительности не является проблемой. Это должно быть достаточно быстро. Поскольку гигагерц циклов ЦП расходуется каждую секунду, меня больше заботит производительность моих кодеров, единственных ресурсов разработки, мощность которых не удваивается каждые 18 месяцев.
Тем не менее, я в настоящее время изучаю проблемы доступности, и, видимо, .innerHTML немного нет с этим. JQuery, конечно, зависит от .innerHTML, поэтому сейчас я ищу среду, которая будет зависеть от несколько утомительных методов, которые разрешены. И я могу себе представить, что такая инфраструктура будет работать медленнее, чем jQuery, но пока она работает достаточно хорошо, я буду счастлив.
источник
Вот нетехнический ответ - многие задания могут не разрешать определенные библиотеки, такие как jQuery.
Фактически, Google фактически не разрешает jQuery ни в одном из своих кодов (ни в React, потому что он принадлежит Facebook), чего вы могли не знать, пока интервьюер не скажет: «Извините, но вы не можете использовать jQuery, он не включен утвержденный список в XYZ Corporation ". Vanilla JavaScript работает абсолютно везде, всегда и никогда не доставит вам этой проблемы. Если вы полагаетесь на библиотеку, да, вы получаете скорость и легкость, но вы теряете универсальность.
Кроме того, если говорить об интервьюировании, то другим недостатком является то, что если вы говорите, что вам нужно использовать библиотеку для решения проблемы JavaScript во время викторины, вы обнаружите, что вы на самом деле не понимаете проблему, что выглядит довольно плохо. Принимая во внимание, что если вы решите это в необработанном ванильном JavaScript, это продемонстрирует, что вы действительно понимаете и можете решить каждую часть любой проблемы, которую они бросают перед вами.
источник
$(this)
отличается отthis
:Используя его,
$(this)
вы гарантируете, что прототип jQuery передается объекту.источник