Оптимизация/Лучшие практики jQuery

Хорошо седло ковбои, потому что это будет длинным. Я проводил утро, проходя часть моего старого кода, и меня оставляют, задаваясь вопросом о лучших практиках и optimzation. Для предотвращения поездки вниз субъективный маршрут, я просто отправлю некоторые примеры с некоторыми, надо надеяться, легкими отвечать на вопросы. Я попытаюсь сохранить примеры очень простыми для простоты ответа и уменьшить вероятность ошибок. Здесь мы идем:

1) Присвоение по сравнению с Вызовами jQuery

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

$('div#apples').hide();
$('div#apples').show();

по сравнению с.

var oranges = $('div#oranges');
oranges.show();
oranges.hide();

Делает это то же правило, применяются при ссылке на jQuery $(this)?напр. Простой бит сценария, чтобы сделать некоторые данные в таблице активируемыми по щелчку и настроить ссылку.

$('tr td').each( function() {
    var colNum = $(this).index();
    var rowNum = $(this).parent().index();
    $(this).wrap(''); 
})

по сравнению с.

$('tr td').each( function() {
    var self = $(this);
    var colNum = self.index()
    var rowNum = self.parent().index()
    self.wrap(''); 
});

2) this по сравнению с $(this)

Хорошо, таким образом, этот следующий - что-то, о чем я задавался вопросом в течение долгого времени, но я, может казаться, не нахожу информации о нем. Извините мое незнание. Когда делает имеет смысл называть ваниль js this в противоположность перенесенному jQuery $(this)? Это - мое понимание это -

$('button').click(function() {
  alert('Button clicked: ' + $(this).attr('id'));
});

Намного менее эффективно, чем доступ к атрибуту DOM ванили this возразите как следующее -

$('button').click(function() {
  alert('Button clicked: ' + this.id);
});

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

3) Больше специфики всегда лучше?

Этот довольно прост, ВСЕГДА выгодно быть более конкретным с нашими селекторами? Легко видеть это $('.rowStripeClass') было бы намного медленнее, чем $('#tableDiv.rowStripeClass'), но где мы разграничиваем? $('body div#tableDiv table tbody tr.rowStripeClass') быстрее все еще? Любой вход ценился бы!

Если Вы сделали его настолько далеко, благодарит смотреть! Если Вы не имеете, :p ​

38
задан HurnsMobile 12 July 2010 в 17:38
поделиться

5 ответов

Я постараюсь ответить на них как можно более кратко:

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

  2. Используйте this , когда вам нужен только элемент DOM, и $ (this) , когда вам нужны методы jQuery (которые в противном случае были бы недоступны) ваш пример this.id vs $ (this) .attr ("id") идеален, несколько более распространенных примеров:

    • Используйте this.checked вместо $ (this) .is (': checked')
    • Используйте $. Data (this, 'thing') вместо $ (this) .data ('вещь')
    • Любой другой случай, когда создание объекта jQuery в принципе бесполезно.
  3. Снижение от селектора идентификатора предпочтительнее с точки зрения производительности ... насколько конкретно вам нужно быть? Короче говоря, это полностью зависит от: будьте настолько конкретны, насколько вам нужно .

37
ответ дан 27 November 2019 в 03:44
поделиться

Этот блог не слишком устарел, но он дает некоторые ответы на ваши вопросы, а также дает дополнительную информацию об ускорении вашего сайта при использовании jquery: http: // www .artzstudio.com / 2009/04 / jquery-performance-rules /

Один из моих любимых - номер шесть, в котором говорится об ограничении манипуляций с DOM. Всегда плохо делать .append в цикле for, поскольку каждый раз, когда вы добавляете данные в DOM, а это дорогостоящая операция.

4
ответ дан 27 November 2019 в 03:44
поделиться

До ваших вопросов:

  1. Кэширование объекта jQuery должно обеспечить наилучшую производительность. Это позволит избежать поиска в DOM, который может замедлиться при многократном выполнении. Вы можете извлечь выгоду из цепочки jQuery - иногда нет необходимости в локальной переменной.
  2. То же самое происходит с $ (this), когда this является элементом DOM. Несмотря на то, что это самый быстрый способ получить объект jQuery, он все же медленнее, чем кеширование. Если достаточно ванильного DOM-элемента - тогда вообще не вызывайте jQuery. Пример с атрибутом id превосходен - предпочтительнее this.id, чем $ (this) .attr ('id), если вам не понадобится $ (this)
  3. Более конкретные селекторы действительно уменьшат время поиска DOM. Тем не менее, действительно есть черта, которую нужно провести - делайте селекторы более конкретными, только если вы на 100% уверены, что это заметно улучшит производительность.
4
ответ дан 27 November 2019 в 03:44
поделиться

1) Назначение и вызовы jQuery

Применяется ли это же правило при обращении к $ (this) jQuery?

Да, безусловно. Вызов функции $ создает новый объект jQuery и с ним связаны накладные расходы. Множественные вызовы $ с одним и тем же селектором каждый раз создают новый объект.

2) this vs $ (this)

Я бы сказал, что знание разницы важно, потому что иногда становится критически важным, чтобы вы не обертывали свои объекты с помощью jQuery. В большинстве случаев вы не захотите проводить преждевременную оптимизацию и просто для того, чтобы все было согласовано, всегда оборачивайте их с помощью $ (this) и предпочтительно кешируйте его в переменной.Однако рассмотрим этот крайний пример неупорядоченного списка

    , который содержит миллион
  • элементов:

    $("#someList  li").each(function() {
        var id = $(this).attr('id');
    });
    

    Будет создан миллион новых объектов, что повлечет за собой значительную производительность. штраф, когда вы могли бы обойтись без создания каких-либо новых объектов. Для атрибутов и свойств, согласованных во всех браузерах, вы можете получить к ним доступ напрямую, не заключая их в jQuery. Однако в этом случае постарайтесь ограничить это случаями, когда приходится иметь дело с большим количеством элементов.

    3) Всегда ли больше конкретности лучше?

    Не всегда. Это в основном зависит от браузеров, и, опять же, не стоит углубляться в микрооптимизации, если вы не знаете наверняка, что в вашем приложении что-то работает довольно медленно. Например:

    $("#someElement") vs $("#someElement", "#elementsContainer")
    

    Может показаться, что, поскольку мы также предоставляем контекст при поиске элемента по идентификатору, второй запрос будет быстрее, но все наоборот. Первый запрос преобразуется в прямой вызов встроенного getElementById (..) , а второй - нет из-за селектора контекста.

    Кроме того, некоторые браузеры могут предоставлять интерфейс для доступа к элементам по имени класса, используя getElementsByClassName , и jQuery может использовать его для этих браузеров для более быстрых результатов, и в этом случае предоставляет более конкретный селектор, например:

    $("#someElement.theClass")
    

    может на самом деле быть помехой, чем просто написание:

    $(".theClass")
    
9
ответ дан 27 November 2019 в 03:44
поделиться

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

  1. Назначение и вызовы jQuery

    Ваш пример не лучший. Ссылки на объекты jQuery следует сохранять в тех местах, которые используются в циклах или событиях , или которые являются результатами сложных запросов .

  2. this vs $ (this)

    Опять же, в критических для производительности ситуациях raw dom лучше. Другой , кроме этого, вы должны выбрать, который короче или более читаемый . Сюрприз, сюрприз, это не всегда jQuery.

  3. Всегда ли больше специфичности лучше?

    Есть больше типов специфичности, которые люди обычно путают. Один из них бесполезен , например: имя тега для селектора идентификатора тег # id , он будет медленнее, чем простой идентификатор. Но есть другой тип , когда он будет огромным преимуществом , если быть точным. Теперь этот тип зависит от браузера, потому что современные будут жертвовать старыми, но он того стоит. Это происходит, когда вы указываете тег для тега class . класс . В IE 6-7 он будет значительно быстрее, чем простой .class , потому что sizzle может использовать быструю функцию document.getElementsByTagName .Теперь другой тип - это когда вы указываете слишком много предков . Это замедлит работу в каждом браузере. Это потому, что селектор выполняется справа налево. Следует помнить о правиле: всегда выбирайте крайний правый селектор как можно точнее .

3
ответ дан 27 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: