Что такое jQuery наиболее важные проблемы, и что, как разработчик, я могу сделать с ними?
У меня есть проект для создания интерфейса, который позволяет пользователю создавать контент с заранее определенными шаблонами и фрагментами кода.
Мы уже решили использовать интерфейсы jQuery и jQuery UI, чтобы помочь нам с компонентами перетаскивания/удаления/сортировки. Там также должно быть какое-то редактирование на месте, и я собираюсь использовать contenteditable
в сочетании с функциями jQuery CSS.
У меня уже есть довольно много опыта работы с обоими фреймворками (и люблю их), но мой типичный проект до сих пор продлился до 50 строк, тогда как этот будет работать намного больше, чем с помощью большего количества функций и написав мои собственные плагины.
Прежде чем приступить к работе над проектом, мне интересно, есть ли какие-то общие проблемы с jQuery - вроде как jQuery - Bad Parts. Есть ли функции, которые лучше всего избегать? Существуют ли функции, которые необходимо обойти?
Я читал эту ссылку, но теперь ему 2 года, и с тех пор многое изменилось в jQuery (и браузерах).
Любые ответы "Использовать эту инфраструктуру вместо" или "Не использовать фреймворк" будут проигнорированы - мне нужно использовать jQuery. Любые "jQuery - это мусор", которые не предоставляют решений, также будут игнорироваться. Конструктивные комментарии только пожалуйста. Если бы я знал, как делать лучше в JavaScript, что делает jQuery, я бы не использовал jQuery.
Ответы
Ответ 1
Я отвечу на половину вашего вопроса. Здесь есть список ошибок, основанных на болезненном опыте, не все из которых у меня есть решения.
- Искушение сильно использовать длинные цепочки селекторов ( "ul # leftnav li p a.current" ) делает ваш код хрупким. Он может чувствовать себя умным ( "Эй, я мастер CSS!" ), Но он легко ломается, когда макет изменяется каким-либо нетривиальным способом.
- Использование DOM в качестве базы данных. Похоже, это простая идея использовать .data() для прикрепления данных к вашим элементам DOM, для отслеживания состояния вашей страницы и для связывания элементов DOM вместе, но если вы перейдете за борт, вы начнете терять следы, что именно.
- Вложение слишком много материала в $(document).ready(). И снова, естественно, чтобы инициализировать все ваши события и данные здесь, но вы скоро столкнетесь с проблемами организации и упорядочения. Посмотрите на MVC-подобные решения, чтобы все было организовано.
- Не совсем кросс-браузер. Тест во всех целевых браузерах рано и часто! jQuery, хотя и замечательная абстракция, по-прежнему непроходим. События и атрибуты не всегда ведут себя одинаково в разных JS-машинах.
Ответ 2
Держите клей минимальным
Вещи, которые я сделал в jQuery, которые я научился избегать:
- Использование больших, умных плагинов. Держите его просто или не используйте.
- Большие, сложные файлы. Храните файлы небольшими и описательными.
- Загрязнение глобального пространства имен. Используйте затворы для каждого файла. Экспортировать в пространство имен.
- Построение разметки с помощью
$()
. Шаблон с использованием магистрали/усов, чтобы сохранить js в чистоте.
- Хрупкие селектора CSS. Выберите по ID, где это возможно, используя иерархию, вызывает проблемы.
Хранить в рабочем состоянии
Вещи, которые я сделал в jQuery, которые я научился делать каждый раз:
- Определенно использовать автоматическое тестирование. Поддерживает структуру кода и спокойствие.
- Сохранять информацию состояния из DOM в модели.
- Выберите сохранение функций обратного вызова и ссылайтесь на них по имени var над сумасшедшим вложением функции.
- Используйте минимальную структуру для раннего создания соглашений.
Это последнее обязательное. Существует множество способов организации JS-проекта. Выберите что-то вроде ember.js, чтобы дать вам набор условных обозначений, а затем придерживаться их!
Ответ 3
Одна из самых важных проблем, независимо от того, использует ли проект jQuery, - это организация кода.
С jQuery очень легко написать такой код:
$.get('/data', function (data) {
// process data, then
alertThing.fadeIn(function () {
// when the alert is visible, handle clicks
alertButton.click(function () {
// the user confirmed, so post
$.post('/data', function () {
// ... and on and on
});
});
});
});
В итоге вы получаете длинные цепочки и/или глубоко вложенные функции, которые трудно читать и отлаживать. Использование Deferred объектов может помочь, но было бы лучше разделить ваше приложение на слабосвязанные компоненты. Вы даже можете упаковать повторно используемый (презентационный, связанный с DOM) код в plugins.
Сила jQuery - кросс-браузерная манипуляция DOM; когда дело доходит до организации программной/бизнес-логики, jQuery - не самый подходящий инструмент. (Хранение не-презентационных данных на DOM в основном является костылем для этого.)
Рамки вроде Backbone или JavaScriptMVC помогите, предоставив структуру для вашего кода. Это "еще одна основа для изучения", но без этого вы в конечном итоге написали свой собственный MVC-подобный код.
Ответ 4
Одна из самых больших ошибок - IE6. Я постоянно нахожусь в работе, чтобы заставить jqueryUI работать в IE6 и забыть о попытке заставить его работать в IE 5.5
Ответ 5
Ну, я N00B, но большинство проблем, с которыми я столкнулся с функциями JQuery, не работает
в методе $( "div > label" ).
Несколько раз он не работал в IE (я думаю, 7), и я должен был бы явно указать
Это.
Кроме того, функция Document.Ready не работает для меня, когда у меня загружается загрузка скриптов в IE7.
В целом Несмотря на то, что вышеупомянутые вещи могли быть вызваны ошибкой с моей стороны
Я считаю, что лучше избегать использования ELE.children("#id")
вместо предпочтительного ELE.find(".class")
, поскольку это даст немного гибкости над макетом и потому что u будет делать множество вещей на аналогичных элементах (например, копировать несколько div)
Мое единственное предложение - использовать классы вместо идентификаторов и использовать Find вместо Children. То, что я пытаюсь сказать здесь, заключается в том, что если вы используете Find вместо детей, вы получите независимость от изменения компоновки отдельного элемента, если они находятся в разных контейнерах (надеюсь, это полезно).
Ответ 6
Одна неудачная ловушка для избежания ошибок - это много генерации HTML из вашего javascript. Например, я так много вижу:
$('<a href="'+url+'">'+text+'</a>').appendTo('#container');
Осторожно! В 90% случаев этот тип кода генерирует аналогичную разметку, которая уже поступает с сервера. Другими словами, как только разметка для ваших ссылок изменится, вам также придется выслеживать строку javascript и обновлять ее.
Я настоятельно рекомендую использовать официальный jQuery templates, как только вы почувствуете, что сначала захотите создать HTML-код в своем javascript!
Ответ 7
Я лично много работал с jQuery, и я могу сказать, что проблемы, с которыми вы столкнетесь, - это не с jQuery, а с характером самого javascript. Вы должны сохранить свой код организованным и хорошо документированным. Попробуйте выполнить какой-то mvc (backbonejs, javascript mvc или что-то в этом роде).
ИЗБЕГАЙТЕ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ.
Используйте пространства имен для объектов, которые вы используете.
Используйте document.ready как можно меньше событий. В противном случае вы перейдете к загрязнению и снова... это становится грязным.
Сохраняйте javascript характер вещей, как при использовании закрытий, объектов и методов.
Осторожно за добавление строк в dom.
Убедитесь, что вы используете .load() или .clone(), чтобы получить html из вашего файла шаблона. Если вы используете магистраль или javascriptmvc, это будет происходить по своей сути.
Надеюсь, это поможет и удачи!