JQuery ловушек, чтобы избежать [закрыто]

210

Я начинаю проект с JQuery.

Какие подводные камни / ошибки / неправильные представления / злоупотребления / злоупотребления у вас были в вашем проекте jQuery?

flybywire
источник
4
Это не должно быть закрыто за то, что оно «не конструктивно». Были получены некоторые очень полезные ответы, и теперь этот вопрос был отмечен 220 раз. Пожалуйста, проголосуйте, чтобы открыть, если у вас есть достаточно кармы.
Рой Принс
Мне кажется, jQuery сам по себе подводный камень
gromit190

Ответы:

189

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

$('#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"); 
});

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

Редактировать: включены предложения в комментариях.

Гэвин Гилмор
источник
16
+1 за ссылку на YouTube. черт возьми, я многому научился.
Джейсон
23
Я думаю, что назначать вещи локальным переменным - это здорово, но не забывайте о силе цепочки (из вашего примера): $ ("# label"). Method (). Method2 (). Css ("background-color", " красный ");
Лэнс Макнирни
Видео на YouTube было отличным. Я видел другие презентации Google по этому вопросу, и я все еще узнал несколько вещей! Спасибо!
Габриэль Херли
+1 за ссылку тоже отлично!
Джош Стодола
7
Это своего рода соглашение использовать знак доллара для переменных с контекстом jQuery. Так что вы можете написатьvar $label = $('#label');
Тим Бют
90

Понять, как использовать контекст. Обычно селектор 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);
slolife
источник
9
Aaaaaaah! Ну, это около 1 000 000 моих ошибок исправлено. +1
джеммус
4
Кажется, ваш последний пункт неверен - groups.google.co.uk/group/jquery-dev/browse_thread/thread/…
Джеймс
1
Спасибо за указание на это JP. Теперь, что делать ... Должен ли я удалить свой ответ, чтобы никто больше не взбесился и ни за что не изменил свой код?
slolife
Нет, это все еще хороший момент с точки зрения оптимизации. :)
Джеймс
2
jQuery проверяет, является ли контекст источником jQuery, поэтому для этого нет причин [0]. $('.myClass', ct);или если вы знаете, что ct является экземпляром jQuery, вы можете использовать findct.find(".myClass")
gradbot
62

Не используйте голые селекторы классов, как это:

$('.button').click(function() { /* do something */ });

В конце концов, мы посмотрим на каждый элемент, чтобы увидеть, есть ли у него класс «кнопки».

Вместо этого вы можете помочь, например:

$('span.button').click(function() { /* do something */ });
$('#userform .button').click(function() { /* do something */ });

Я узнал об этом в прошлом году из блога Ребекки Мерфи.

Обновление - этот ответ был дан более 2 лет назад и не подходит для текущей версии jQuery. Один из комментариев включает в себя тест, чтобы доказать это. Существует также обновленная версия теста, которая включает версию jQuery на момент ответа.

оборота BrianH
источник
6
У меня также сложилось впечатление, что обратное было правдой. Возможно, это имеет место в браузерах, которые не реализуют getElementsByClassName, но в противном случае вы просто даете jQuery больше работы. Мне бы очень хотелось, чтобы Ребекка опубликовала несколько тестов :)
Алекс Барретт
7
Вы СОКРАЩАЕТЕ объем работы, которую он должен сделать. Это все равно что сказать кому-нибудь достать носки из ящика в комоде, вместо того чтобы сказать, чтобы он достал носки из вашей комнаты. Уменьшает количество «выглядящих», которые он должен делать.
Подлость
4
Обратное верно, когда вы пишете CSS (по крайней мере, включая тег элемента). См. Code.google.com/speed/page-speed/docs/…
kmiyashiro
7
@ Скрытность Не у всего есть точный аналог реальной жизни. Например, $('.b')может использовать, document.getElementsByClassName('b')если браузер поддерживает его, но выполнение $('a.b')заставит его получить все соответствующие элементы с классом, bа затем подтвердить, что они являются якорями в двухэтапной операции. Последнее звучит как дополнительная работа для меня. Для реальной аналогии попробуйте следующее: найдите все носки в моей комнате. Теперь выбросьте те, которых нет в моем комоде.
Алекс
2
Я полагаю, что неправильное представление о селекторах связано с тем, что в более старых версиях jquery было быстрее делать $ ('# foo'), чем $ ('div # foo'), поскольку по определению идентификатор уникален. Я почти уверен, что это было исправлено в более поздних выпусках, но эта рекомендация применялась только к идентификаторам, а не к другим типам селекторов
Alex Heyd
35

Попробуйте выделить анонимные функции, чтобы вы могли использовать их повторно.

//Avoid
$('#div').click( function(){
   //do something
});

//Do do
function divClickFn (){
   //do something    
}

$('#div').click( divClickFn );
Красный квадрат
источник
19
Я думаю, что это примерно так же, как синхронный (встроенный) код должен быть разбит на именованные функции. Если у вас есть кусок кода, который просит дать вам имя, то сделайте это. Но не перемещайте код из строки просто потому, что вы заключаете его в функцию; анонимные функции существуют по уважительной причине.
Дэн Бреслау
4
На самом деле мне нравится давать имя моей функции. Это очень полезно, когда вы отлаживаете код и вместо бесконечного списка анонимных функций вы видите функции с правильными именами.
SolutionYogi
1
Ваша точка зрения хорошо принята, и я, вероятно, сам был несколько раз сбит с толку. Тем не менее, « примерно такая же степень» все еще работает для меня.
Дэн Бреслау
1
особенно если привязка происходит в цикле!
daniellmb
Именованные функции также очень полезны при отладке; ничто не сосет больше, чем взгляд на колл-стэк глубиной 8 уровней, который не имеет ничего, кроме (anonymous). Подробнее об этом читайте здесь: stackoverflow.com/questions/182630/jquery-tips-and-tricks/…
кен,
34
  • Избегайте злоупотребления готовым документом.
  • Держите документ готовым только для инициализации кода.
  • Всегда извлекайте функции вне документа, чтобы их можно было использовать повторно.

Я видел сотни строк кода внутри инструкции doc ready. Уродливый, нечитаемый и невозможно поддерживать.

Питер Мортенсен
источник
6
+1. В общем, большая часть кода jQuery, который я видел, использует функции с сотнями строк. Я не знаю, почему «разработчики jQuery» не любят использовать меньшие функции.
SolutionYogi
6
@SolutionYogi, потому что большинство из них просто JS Noobs?
adamJLev
Я за то, что не помещаю очень длинные функции в готовый документ, это хороший совет. Однако создание многих функций небольших компонентов, которые запускаются из всеобъемлющей функции, которая не находится в документе, не обязательно является наилучшей практикой. Если всеобъемлющая функция является единственной, которая использует эти фрагменты кода, лучше поместить все это в одну функцию, даже если ее труднее читать. Вызов функций имеет много накладных расходов, и если вы используете код только в одном контексте, этого следует избегать.
sage88 20.09.13
34

При использовании $.ajaxфункции для запросов Ajax к серверу следует избегать использования completeсобытия для обработки данных ответа. Он сработает независимо от того, был ли запрос успешным или нет.

Вместо того complete, чтобы использовать success.

Смотрите Ajax Events в документах.

Патрик МакЭлхани
источник
1
Я много раз говорил об успехе и завершенности. Можете ли вы рассказать, почему завершить лучше?
Нил N
1
Я не говорю, что полное - это лучше. Я пытался сказать, что вам нужно избегать вводящего в заблуждение использования complete и использовать успех, чтобы иметь возможность обрабатывать данные ответов.
Артем Баргер
2
Ну, это всегда называют. Однако я бы не согласился. Complete лучше всего подходит для сокрытия загрузочного GIF и т. Д. Вы должны использовать успех для обработки ответа и ошибки для любых ошибок, конечно.
красный квадрат
1
Он предлагает использовать успех вместо полного. 'complete' всегда срабатывает, когда ajax-запрос 'complete', не имеет значения, был ли он выполнен успешно или неудачно.
SolutionYogi
@redsquare, не могли бы вы рассказать, с чем именно вы не согласны? Я имел в виду обработку данных и не возражал против скрытия / демонстрации возможностей, которые у вас есть, с полным обработчиком.
Артем Баргер
24

«Цепные» анимационные события с обратными вызовами.

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

$("p").click(function(e) {
  $(this).fadeOut("slow").remove();
});

В этом примере .remove () будет вызываться до завершения .fadeOut (), уничтожая эффект постепенного затухания и просто заставляя элемент мгновенно исчезать. Вместо этого, когда вы хотите запустить команду только после завершения предыдущего, используйте функцию обратного вызова:

$("p").click(function(e){
  $(this).fadeOut("slow", function(){
    $(this).remove();
  });
});

Второй параметр .fadeOut () - это анонимная функция, которая запускается после завершения анимации .fadeOut (). Это способствует постепенному исчезновению и последующему удалению элемента.

Сэмпсон
источник
24

Если вы связываете одно и то же событие несколько раз, оно срабатывает несколько раз. Я обычно всегда иду, unbind('click').bind('click')чтобы быть в безопасности

Скотт Эверден
источник
2
Это не относится к jQuery, хотя важно помнить об этом.
SolutionYogi
11
Вы можете использовать живые события, чтобы не связывать одно и то же событие дважды.
Powerlord
В прямом эфире есть свои (проблемы с производительностью), если их использовать в избытке. Лучше в 1.3.3, где вы можете дать контекст.
красный квадрат
23

Не злоупотребляйте плагинами.

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

Плагины легко вставляются в ваш код, экономят ваше время, но когда вам понадобится что-то дополнительное, не рекомендуется изменять их, так как вы теряете возможные обновления. Время, которое вы сэкономите при запуске, вы потеряете позже, изменив устаревшие плагины.

Выберите плагины, которые вы используете с умом. Помимо библиотеки и пользовательского интерфейса, я постоянно использую $ .cookie , $ .form , $ .validate и Thickbox . В остальном я в основном разрабатываю свои собственные плагины.

Эльзо Валуги
источник
2
Как насчет сетки? Вы делаете свой собственный?
jmav
да. От проекта к проекту данные поступают различными способами. Я предпочитаю иметь полный контроль над тем, чтобы осознание того, что сетка помогает мне только в середине, а затем я должен импровизировать.
Эльзо Валуги
ЕСЛИ {учитывая достаточное количество времени, обычно я предпочитаю писать весь код, управляемый данными-dom-манипуляциями (css / html) напрямую. Другими словами - не передавайте данные в «плагин», а выводите его в формате HTML. Достаточно сложно оценить (середину) плагинов на предмет текущей совместимости с областью, забудьте о будущих требованиях. думаю ... дизайнеры, планировщики, менеджеры, менеджеры, менеджеры. ох и клиенты и пользователи. но если у вас есть все эти вещи, вам не хватит сказанного «времени». так что просто используйте jqgrid - вы тратите время на обдумывание. это уже сделано?}
user406905
22

Ловушка: использование петель вместо селекторов.

Если вы обнаружите, что пытаетесь перебрать элементы DOM методом jQuery '.each', спросите себя, можно ли использовать селектор для получения элементов.

Более подробная информация о селекторах jQuery:
http://docs.jquery.com/Selectors

Ловушка: НЕ использовать такой инструмент, как Firebug

Firebug был практически сделан для такой отладки. Если вы собираетесь копаться в DOM с Javascript, вам нужен хороший инструмент, такой как Firebug, чтобы сделать вас более наглядным.

Больше информации о Firebug: http://getfirebug.com/

Другие отличные идеи есть в этом эпизоде ​​Полиморфного подкаста: (jQuery Secrets with Dave Ward) http://polymorphicpodcast.com/shows/jquery/

Дэн Эспарза
источник
1
Я сделал первый много раз. Вам просто нужно помнить, что большинство функций jQuery будут работать со всеми элементами, возвращаемыми из селектора.
Рассерженная шлюха
Не нравится метод .each, если честно
Саймон Хейтер
14

Непонимание использования этого идентификатора в правильном контексте. Например:

$( "#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.
   })
});
Артем Баргер
источник
1
+1 Больше проблема с javascript, чем проблема с jquery, но меня это сильно смущало.
mmacaulay
13

Избегайте поиска по всему DOM несколько раз. Это то, что действительно может задержать ваш сценарий.

Плохой:

$(".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();
гуглторп
источник
2
$ ( "aclass") это () , что ()..; не хорошо! Селекторы только для класса работают медленно
redsquare
Это иллюстративный пример, демонстрирующий способность Jquery использовать несколько методов для одного выбора. Я сделал выбор простым (и, следовательно, медленным), чтобы уделить больше внимания этой технике.
googletorp
10
Хотя избегать повторного поиска в DOM - это хорошо, последний пример - это нечитаемый беспорядок, в котором я понятия не имею, что происходит. Если вы планируете использовать результат выборки несколько раз, сохраните его в переменной. Это делает код намного более понятным.
Квентин,
12

Всегда кэшируйте $ (this) в значимую переменную, особенно в .each ()

Как это

$(selector).each(function () {
    var eachOf_X_loop = $(this); 
})
adardesign
источник
12
Используйте $selfили, $thisесли вам лень думать о хорошем имени переменной.
gradbot
10

Подобно тому, что сказал Repo Man, но не совсем.

При разработке ASP.NET winforms я часто делаю

$('<%= Label1.ClientID %>');

забыв знак #. Правильная форма

$('#<%= Label1.ClientID %>');
Рон
источник
10

События

$("selector").html($("another-selector").html());

не клонирует ни одно из событий - вы должны привязать их все.

В соответствии с комментарием JP t - clone () перепривязывает события, если вы передаете true.

Chris S
источник
4
Clone () делает, если вы передаете true.
Джеймс
Что насчет live () в jQuery 1.3.2?
jmav
9

Избегайте многократного создания одних и тех же объектов jQuery

//Avoid
function someFunc(){
   $(this).fadeIn();
   $(this).fadeIn();
}

//Cache the obj
function someFunc(){
   var $this = $(this).fadeIn();
   $this.fadeIn();
}
красный квадрат
источник
var $ this = $ (this) .fadeIn () ;? вы кешируете эффект?
Джейсон
12
он возвращает элемент, его называют цепочкой!
красный квадрат
Вы можете установить переменную и одновременно выполнить над ней действие?
Джейсон
1
Действительно, но не верьте мне на слово. Попытайся. Как вы думаете, возможно ли следующее, если объект jquery, представляющий элемент, не возвращается? $ ('# divId'). hide (). show (). fadeIn () .... и т. д.
красный квадрат
14
Это работает, но я думаю, что это более читабельно иметь $this = $(this);в отдельной строке. Если вы можете (не создавая беспорядка), забудьте $thisи просто зацепите все:$(this).fadeIn().fadeIn();
Патрик МакЭлхани
8

Я говорю это и для JavaScript, но jQuery, JavaScript никогда не должен заменять CSS.

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

Martin
источник
6

Слишком много манипуляций с 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);
Алекс Хейд
источник
+1 ... Я использую .html () для нескольких элементов каждую секунду. Заметил, что все начинает тормозить!
Пользователь2
5

Использование ClientID для получения «реального» идентификатора элемента управления в проектах ASP.NET.

jQuery('#<%=myLabel.ClientID%>');

Кроме того, если вы используете jQuery внутри SharePoint, вы должны вызвать jQuery.noConflict ().

Jacobs Data Solutions
источник
11
? Как это ловушка? Это обходной путь для поведения ASP.NET.
SolutionYogi
1
Да. Это не проблема JQuery. Это ошибка веб-форм asp.net.
красный квадрат
3
Согласовано. Но об этом нужно знать при использовании jQuery в ASP.NET.
Jacobs Data Solutions
2
ОП не упомянул asp.net
красный квадрат
4

Передача идентификаторов вместо объектов jQuery в функции:

myFunc = function(id) { // wrong!
    var selector = $("#" + id);
    selector.doStuff();
}

myFunc("someId");

Передача упакованного набора гораздо более гибкая:

myFunc = function(elements) {
    elements.doStuff();
}

myFunc($("#someId")); // or myFunc($(".someClass")); etc.
Крейг Штунц
источник
3

Чрезмерное использование цепочки.

Посмотри это:

this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);

объяснение

SolutionYogi
источник
1
Это выглядит смешно, это своего рода запутывание.
Dykam
6
Сцепление (само по себе) сложно использовать «в избытке». Похоже, этот код чрезмерно использует тернарный оператор javascript. См. En.wikipedia.org/wiki/Ternary_operation#JavaScript для получения дополнительной информации.
Дэн Эспарза
3
Я рад, что мне не нужно поддерживать ваш код.
cdmckay
3

Использовать строки в стиле аккумулятора

Используя оператор +, в памяти создается новая строка и ей присваивается объединенное значение. Только после этого результат присваивается переменной. Чтобы избежать промежуточной переменной для результата конкатенации, вы можете напрямую присвоить результат с помощью оператора + =. Медленный:

a += 'x' + 'y';

Быстрее:

a += 'x';
a += 'y';

Примитивные операции могут быть быстрее, чем вызовы функций

Рассмотрите возможность использования альтернативных примитивных операций над вызовами функций в циклах и функциях, критичных к производительности. Медленный:

var min = Math.min(a, b);
arr.push(val);

Быстрее:

var min = a < b ? a : b;
arr[arr.length] = val;

Подробнее читайте в рекомендациях по производительности JavaScript

Пир Абдул
источник
1

Если вы хотите, чтобы пользователи видели html-объекты в своем браузере, используйте «html» вместо «text» для вставки строки Unicode, например:

$('p').html("Your Unicode string")
Патрик Дж. Андерсон
источник
1

мои два цента)

Обычно работа с 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(). На самом деле ничего страшного, но мы должны помнить об этом факте.

shabunc
источник
0

Если вы планируете использовать Ajax в большом количестве данных, например, в 1500 строках таблицы с 20 столбцами, даже не думайте использовать jQuery для вставки этих данных в ваш HTML. Используйте простой JavaScript. JQuery будет слишком медленным на медленных машинах.

Кроме того, половину времени jQuery будет выполнять вещи, которые будут замедлять его, например, пытаться анализировать теги скрипта во входящем HTML и справляться с особенностями браузера. Если вам нужна быстрая скорость вставки, придерживайтесь простого JavaScript.

mkoryak
источник
1
-1 Функция .html () работает так же быстро, как и нативный подход
cllpse
все, кто голосует против меня, очевидно, не пытались вставить тонну DOM в IE и смотреть, как все становится медленным. Причина, по которой jquery медленный, заключается в том, что он не просто вставляет dom, он делает несколько других вещей, например проверяет, есть ли у dom скрипты, и выполняет их, если он в IE, и некоторые другие вещи, которые вам не нужны, если вы точно знаете какие данные вы вставляете
mkoryak
1
До тех пор, пока вам не нужно беспокоиться об утечках из браузера и так далее, это .innerHTMLподойдет. Но если вы создаете что-то вроде Gmail, где пользователь держит вкладку открытой в течение нескольких часов, вам просто придется кусать пули и справляться с дополнительной медлительностью. Любопытно, что именно это и .html()делает jQuery : james.padolsey.com/jquery/#v=1.4&fn=jQuery.fn.html
adamJLev
-1

Использование jQuery в небольшом проекте, который может быть завершен всего несколькими строками обычного JavaScript.

тисков
источник
Я не возражаю против того, чтобы меня опускали, но, пожалуйста, аргументируйте свой выбор.
тиски
8
-1 jQuery абстрагирует сломанный API. Таким образом, вы всегда уверены, что ваш код работает. Допустим, вы написали некоторый код с использованием jQuery, и в новой версии появилась некоторая случайная ошибка браузера - все, что вам нужно сделать, это импортировать обновленную версию фреймворка jQuery. По сравнению с необходимостью выяснить, как решить проблему самостоятельно.
cllpse
+1 кажется разумным - если вы используете всего несколько строк, имеет смысл просто использовать vanilla JS.
Алекс
1
@roosteronacid, ваш аргумент не соответствует сути. Очень маловероятно, что браузер введет регрессию в сценарий меньшей сложности или решит проблемы кроссбраузера. Два года назад я работал с mootools, и при определенных обстоятельствах он не смог прочитать содержимое элементов в IE. После нескольких часов попыток выяснить проблему, я просто переписал эту часть с простым js. Таким образом, на самом деле более вероятно, что jQuery сломается, а не простой javascript, из-за обновления браузера. Я бы исправил ошибку самостоятельно в любой день, а не взламывал код библиотеки.
тиски
3
couple of lines of ordinary JavaScriptКонечно, нет проблем. Но когда это когда-нибудь? Люди, которые говорят "почему бы не использовать ванильный JavaScript ??" IE еще не был достаточно укушен ... и не говоря уже о том, сколько кода и шаблонов вы должны написать, чтобы делать простые вещи в простом старом JS.
adamJLev
-3

Не понимая привязка события. 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.

Джейсон
источник
5
Хотите разработать? Желательно пример?
SolutionYogi
7
Разве JavaScript не предоставляет addEventListener () и attachEvent () для этого?
Алекс
2
разделение интересов, человек. Держите ваш HTML и JS отдельно
Дон