Я начинаю проект с jQuery.
Какие ошибки/ошибки/неправильные представления/злоупотребления/злоупотребления у вас есть в вашем проекте jQuery?
Я начинаю проект с jQuery.
Какие ошибки/ошибки/неправильные представления/злоупотребления/злоупотребления у вас есть в вашем проекте jQuery?
Не знать о производительности и злоупотребления селекторами вместо того, чтобы назначать их локальным переменным. Например: -
$('#button').click(function() {
$('#label').method();
$('#label').method2();
$('#label').css('background-color', 'red');
});
Вместо: -
$('#button').click(function() {
var $label = $('#label');
$label.method();
$label.method2();
$label.css('background-color', 'red');
});
Или еще лучше с цепочкой: -
$('#button').click(function() {
$("#label").method().method2().css("background-color", "red");
});
Я нашел этот в качестве просветительного момента, когда я понял, как работают стеки вызовов.
Изменить: добавлены предложения в комментариях.
Понять, как использовать контекст. Как правило, селектор jQuery будет искать весь документ:
// This will search whole doc for elements with class myClass
$('.myClass');
Но вы можете ускорить процесс поиска в контексте:
var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);
Не используйте селектор серого класса, например:
$('.button').click(function() { /* do something */ });
Это приведет к просмотру каждого элемента, чтобы увидеть, имеет ли он класс "button".
Вместо этого вы можете помочь, например:
$('span.button').click(function() { /* do something */ });
$('#userform .button').click(function() { /* do something */ });
Я узнал об этом в прошлом году из Блог Ребекки Мерфи
Обновить. Этот ответ был дан более 2 лет назад и не подходит для текущей версии jQuery. Один из комментариев включает тест, подтверждающий это. Существует также обновленная версия теста, которая включает в себя версию jQuery во время этого ответа.
Попробуйте разделить анонимные функции, чтобы их можно было повторно использовать.
//Avoid
$('#div').click( function(){
//do something
});
//Do do
function divClickFn (){
//do something
}
$('#div').click( divClickFn );
При использовании функции $.ajax
для Ajax запросов к серверу вам следует избегать использования события complete
для обработки данных ответа. Он сработает, был ли запрос успешным или нет.
Вместо complete
используйте success
.
Смотрите Ajax Events в документах.
Я видел сотни строк кода внутри документа doc ready. Уродливые, нечитаемые и невозможные для поддержания.
Предположим, вы хотели оживить абзац, исчезающий при щелчке. Вы также хотели удалить элемент из DOM впоследствии. Вы можете подумать, что можете просто связать методы:
$("p").click(function(e) {
$(this).fadeOut("slow").remove();
});
В этом примере вызывается функция .remove() до завершения .fadeOut(), уничтожения эффекта постепенного замирания и просто моментального удаления элемента. Вместо этого, когда вы хотите запустить команду только после завершения предыдущего, используйте обратный вызов:
$("p").click(function(e){
$(this).fadeOut("slow", function(){
$(this).remove();
});
});
Второй параметр .fadeOut() - анонимная функция, которая будет запущена после завершения анимации .fadeOut(). Это приводит к постепенному замиранию и последующему удалению элемента.
Если вы связываете() одно и то же событие несколько раз, он будет срабатывать несколько раз. Обычно я всегда ходим unbind('click').bind('click')
, чтобы быть в безопасности
Не злоупотреблять плагинами.
В большинстве случаев вам понадобится только библиотека и, возможно, пользовательский интерфейс. Если вы сохраните это, ваш код будет поддерживаться в долгосрочной перспективе. Не все плагины поддерживаются и поддерживаются, фактически большинство из них не являются. Если вы можете имитировать функциональность с помощью основных элементов, я настоятельно рекомендую ее.
Плагины легко вставляются в ваш код, что позволяет вам немного времени, но когда вам понадобится дополнительное что-то, это плохая идея изменить их, так как вы потеряете возможные обновления. Время, которое вы сэкономите в начале, вы потеряете позже, изменив устаревшие плагины.
Выберите плагины, которые вы используете с умом. Помимо библиотеки и пользовательского интерфейса, я постоянно использую $. Cookie, $. форма, $. validate и thickbox. Для остальных я в основном разрабатываю свои собственные плагины.
Pitfall: использование циклов вместо селекторов.
Если вы обнаружите, что достигли метода jQuery '.each' для итерации элементов DOM, спросите себя, можете ли использовать селектор для получения элементов.
Дополнительная информация о селекторах jQuery:
http://docs.jquery.com/Selectors
Pitfall: НЕ использовать инструмент Firebug
Firebug был практически создан для такого рода отладки. Если вы собираетесь обманывать DOM с Javascript, вам нужен хороший инструмент, например Firebug, чтобы вы могли видеть.
Дополнительная информация о Firebug: http://getfirebug.com/
Другие замечательные идеи в этом эпизоде Полиморфного подкаста: (секреты jQuery с Дейвом Уордом) http://polymorphicpodcast.com/shows/jquery/
Непонимание использования этого идентификатора в правильном контексте. Например:
$( "#first_element").click( function( event)
{
$(this).method( ); //referring to first_element
$(".listOfElements").each( function()
{
$(this).someMethod( ); // here 'this' is not referring first_element anymore.
})
});
И вот один из образцов, как вы можете его решить:
$( "#first_element").click( function( event)
{
$(this).method( ); //referring to first_element
var $that = this;
$(".listOfElements").each( function()
{
$that.someMethod( ); // here 'that' is referring to first_element still.
})
});
Избегайте поиска по всей DOM несколько раз. Это то, что действительно может задержать ваш script.
Плохо:
$(".aclass").this();
$(".aclass").that();
...
Хорошо:
$(".aclass").this().that();
Плохо:
$("#form .text").this();
$("#form .int").that();
$("#form .choice").method();
Хорошо:
$("#form")
.find(".text").this().end()
.find(".int").that().end()
.find(".choice").method();
Всегда кэшируйте $(this) в значимую переменную особенно в .each()
Подобно этому
$(selector).each(function () {
var eachOf_X_loop = $(this);
})
Подобно тому, что сказал Репо Ман, но не совсем.
При разработке winforms ASP.NET я часто делаю
$('<%= Label1.ClientID %>');
забыв знак #. Правильная форма
$('#<%= Label1.ClientID %>');
События
$("selector").html($("another-selector").html());
не клонирует ни одно из событий - вы должны их перепроверять.
В соответствии с JP comment - clone() выполняет повторную проверку событий, если вы передаете true.
Избегайте множественного создания одних и тех же объектов jQuery
//Avoid
function someFunc(){
$(this).fadeIn();
$(this).fadeIn();
}
//Cache the obj
function someFunc(){
var $this = $(this).fadeIn();
$this.fadeIn();
}
Я тоже говорю это для JavaScript, но jQuery, JavaScript НИКОГДА не заменит CSS.
Кроме того, убедитесь, что сайт доступен для тех, у кого отключен JavaScript (не так актуально сегодня, как и в тот же день, но всегда приятно иметь полностью пригодный для использования сайт).
Создание слишком большого количества манипуляций с DOM. Хотя методы .html(),.append(),.prepend() и т.д. Велики, из-за того, что браузеры визуализируют и повторно отображают страницы, использование их слишком часто приведет к замедлению. Часто лучше создавать html в виде строки и включать его в DOM один раз, вместо того, чтобы изменять DOM несколько раз.
Вместо:
var $parent = $('#parent');
var iterations = 10;
for (var i = 0; i < iterations; i++){
var $div = $('<div class="foo-' + i + '" />');
$parent.append($div);
}
Попробуйте следующее:
var $parent = $('#parent');
var iterations = 10;
var html = '';
for (var i = 0; i < iterations; i++){
html += '<div class="foo-' + i + '"></div>';
}
$parent.append(html);
Или даже это ($ wrapper - это вновь созданный элемент, который еще не был добавлен в DOM. Добавление узлов в эту оболочку div не вызывает замедление, а в конце мы добавляем $wrapper к $parent, используя только одна манипуляция DOM):
var $parent = $('#parent');
var $wrapper = $('<div class="wrapper" />');
var iterations = 10;
for (var i = 0; i < iterations; i++){
var $div = $('<div class="foo-' + i + '" />');
$wrapper.append($div);
}
$parent.append($wrapper);
Использование ClientID для получения "реального" идентификатора элемента управления в проектах ASP.NET.
jQuery('#<%=myLabel.ClientID%>');
Кроме того, если вы используете jQuery внутри SharePoint, вы должны вызвать jQuery.noConflict().
Передача идентификаторов вместо объектов jQuery в функции:
myFunc = function(id) { // wrong!
var selector = $("#" + id);
selector.doStuff();
}
myFunc("someId");
Передача завернутого набора намного более гибкая:
myFunc = function(elements) {
elements.doStuff();
}
myFunc($("#someId")); // or myFunc($(".someClass")); etc.
Чрезмерное использование цепочки.
Смотрите это:
this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);
Использовать стиль накопителей
Используя оператор +, в памяти создается новая строка, и ей назначается связанное значение. Только после этого результат присваивается переменной. Чтобы избежать промежуточной переменной для результата конкатенации, вы можете напрямую назначить результат с помощью оператора + =. Slow:
a += 'x' + 'y';
Быстрее
a += 'x';
a += 'y';
Примитивные операции могут быть быстрее вызовов функций
Рассмотрите возможность использования альтернативной примитивной операции над вызовами функций в критических циклах и функциях производительности. Slow:
var min = Math.min(a, b);
arr.push(val);
Быстрее
var min = a < b ? a : b;
arr[arr.length] = val;
Подробнее в Рекомендации по эффективности JavaScript
Если вы хотите, чтобы пользователи видели html-объекты в своем браузере, используйте "html" вместо "text", чтобы ввести строку Unicode, например:
$('p').html("Your Unicode string")
мои два цента)
Обычно работа с jquery означает, что вам не нужно постоянно беспокоиться о элементах DOM. Вы можете написать что-то вроде этого - $('div.mine').addClass('someClass').bind('click', function(){alert('lalala')})
- и этот код будет выполняться без каких-либо ошибок.
В некоторых случаях это полезно, в некоторых случаях - совсем не так, но это факт, что jquery имеет тенденцию быть, ну, пустым-дружеским. Тем не менее, replaceWith
выдаст ошибку, если попытается использовать ее с элементом, который не принадлежит документу. Я считаю это довольно противоречивым.
Другая ошибка - это, на мой взгляд, порядок узлов, возвращаемых методом prevAll() - $('<div><span class="A"/><span class="B"/><span class="C"/><span class="D"/></div>').find('span:last-child').prevAll()
. На самом деле, неважно, но мы должны иметь в виду этот факт.
Если вы планируете Ajax в большом количестве данных, например, 1500 строк таблицы с 20 столбцами, то даже не думайте об использовании jQuery для вставки этих данных в ваш HTML. Используйте простой JavaScript. jQuery будет слишком медленным на более медленных машинах.
Кроме того, половина времени jQuery будет делать то, что заставит его работать медленнее, например, пытаться разобрать теги script во входящем HTML и разбираться с чертами браузера. Если вам нужна быстрая скорость вставки, придерживайтесь обычного JavaScript.
Использование jQuery в небольшом проекте, который может быть дополнен только несколькими строками обычного JavaScript.
Неиспользуется привязка событий. JavaScript и jQuery работают по-разному.
По популярному запросу, пример:
В jQuery:
$("#someLink").click(function(){//do something});
Без jQuery:
<a id="someLink" href="page.html" onClick="SomeClickFunction(this)">Link</a>
<script type="text/javascript">
SomeClickFunction(item){
//do something
}
</script>
В принципе, требуемые для JavaScript привязки больше не нужны. То есть используйте встроенную разметку (onClick и т.д.), потому что вы можете просто использовать идентификатор и классы, которые разработчик обычно использует для целей CSS.