Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.12.2011, 04:35
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Прототип библиотеки jNext
Мне нравится jQuery. Нравится из-за того, с ней я могу сделать почти всё, не прибегая к нативным средствам браузера, не трахаясь с кроссбраузерностью. Но мне не нравится одно: её пихают куда ни попадя, даже в мобильные сайты. Огромная куча кода для поддержки кроссбраузерности инициируется каждый раз, когда открываешь страничку на мобильном. Анимации в jQuery сделаны старым дедовским способом: с помощью свойства style. Кроме этого, я полностью уверен в том, что в недалеком будущем (лет 5—10) она будет казаться старым пердящим запорожцем. Даже сейчас, когда IE6 практически сдох, в коде библиотеки наблюдается его поддержка. Что будет потом, когда умрет IE8? Разработчики будут выковыривать ненужные вещи? Сомневаюсь.

Поэтому я рискнул начать делать библиотеку, очень похожую на jQuery, использующую встроенные фишки по максимуму. Вся выборка элементов происходит с помощью querySelectorAll и matchesSelector, анимации сделаны на CSS3, данные, данные присваиваются элементу с помощью dataset. В дальнейшем, будет реализована работа с классами через classList и т. д.

Почему я взял за пример jQuery? Потому что очень удобно было бы писать один код под те же мобилы, планшеты и полноценные компы, просто подключая ту или иную библиотеку. Скрипты на jNext будут совместимы с jQuery, но не наоборот. А потом, можно вообще забить на совместимость, предоставляя свои фишки с блекджеком и шлюхами. В будущем, если руки дойдут, напишу модуль, который определяет, может ли моя либа работать с данным браузером или нет и, исходя из этого, решать, какая библиотека будет задействована.

Для примера, приведу алгоритм работы одной из функци. Допустим это siblings.
1. Берем все элементы из текущей выборки и проделываем следующие вещи
2. Допустим node — текущий элемент
a) node.dataset.randomId = Math.random(); // допустим 0.1
б) node.parentNode.dataset.randomId = Math.random(); // допустим 0.2
3. Конструируем селектор, он у нас получится таким:
[data-random-id=0.2] > :not([data-random-id=0.1])
4. Применяем селектор к node.parentNode, конкатенируем полученный массив с массивом новой выборки
5. Удаляем .dataset.randomId из 2.а и 2.б
Так работает большинство функций выборок и, как показал один из холиваров, в которых я участвовал, достаточно быстро. По поводу сравнения скорости с выборкой на регулярках, думаю, спорить вообще смысла нет.

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

Чтоб не быть голословным, вот, очень простой пример: http://jsfiddle.net/finom/Yb2MH/
Вот код: http://dl.dropbox.com/u/13598455/jNext/jNext.js , в котором очень много не реализовано, что-то сделано не до конца (метод css вообще работает только на установку стилей). Это прототип, пользоваться нельзя ни в коем случае. Работает пока что только в хроме (может и в сафари) из-за вездесущих префиксов -webkit-.

На всякий случай: не нужно здесь писать, что jQuery — говно. Только по коду, пожалуйста. С холиварами в оффтоп и не забудьте дать ссылку.

Последний раз редактировалось FINoM, 10.01.2013 в 16:39.
Ответить с цитированием
  #2 (permalink)  
Старый 28.12.2011, 04:38
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Тут многие писали, что jQuery молчалива в плане вывода ошибок. Как лучше реализовать отлов и вывод ошибок?
Ответить с цитированием
  #3 (permalink)  
Старый 28.12.2011, 05:05
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

И еще, я тут видел замечания о том, что хотелось бы собирать библиотеку самому, выбирая только нужные функции.
Ответить с цитированием
  #4 (permalink)  
Старый 28.12.2011, 06:53
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от FINoM
Для примера, приведу алгоритм работы одной из функци. Допустим это siblings.
Только сейчас дорубил, что querySelectorAll можно использовать всего-лишь один раз и не задействуя конкатенаций. Просто нужно два раза пробежаться по элементам: сначала выставить рандомный айдишник, затем убрать. Просто непочатый край для оптимизаций.
Ответить с цитированием
  #5 (permalink)  
Старый 28.12.2011, 21:42
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Рискну спросить.
Никто не может поделиться советами? Может я чем-то задел в своём сообщении?
Ответить с цитированием
  #6 (permalink)  
Старый 28.12.2011, 22:07
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Да нет, молодец
Ответить с цитированием
  #7 (permalink)  
Старый 28.12.2011, 22:23
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от FINoM
Тут многие писали, что jQuery молчалива в плане вывода ошибок. Как лучше реализовать отлов и вывод ошибок?
Мне в jQuery не нравится, что она всегда работает с коллекцией элементов, даже если известно, что элемент один, например:
$("#btn").hide()

в случае отсутствия #btn, никакой ошибки не произойдет, а логичнее было бы получить в консоли сообщение о том, что какое-то внутреннее свойство null.

Я бы сделал 2 функции и 2 набора методов для работы с одним элементом и коллекцией.
$("#btn")  → {node: HTMLElement}
$$(".btn") → {list: Array}

Работа с одним элементом:
$("#btn").addClass("active")

тут мы получим сообщение «node is null», если #btn отсутствует

Работа c коллекцией:
$$(".btn").each("addClass", "active")
Ответить с цитированием
  #8 (permalink)  
Старый 28.12.2011, 22:59
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от Octane
в случае отсутствия #btn, никакой ошибки не произойдет, а логичнее было бы получить в консоли сообщение о том, что какое-то внутреннее свойство null.
Да, согласен.
Сообщение от Octane
Я бы сделал 2 функции и 2 набора методов для работы с одним элементом и коллекцией.
Тогда будет больше кода, а производительность не сильно изменится (при одном элементе будет одна итерация цикла).
Ответить с цитированием
  #9 (permalink)  
Старый 28.12.2011, 23:32
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Забыл сделать бекап предыдущей версии, поэтому пример временно не работает.
Ответить с цитированием
  #10 (permalink)  
Старый 29.12.2011, 00:12
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

FINoM, почему вы не используете github в таком интересном проекте? хотя бы из-за возможости откатиться или принять чужой фикс какой-нибудь ошибки


PS хм. трудновато понять код, когда он отдан plain'ом на маленький экранчик смартфона. больше всего не понял "класс" Selector.

Последний раз редактировалось melky, 29.12.2011 в 00:27.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как подключить две версии библиотеки jquey одновременно abuGabi jQuery 6 05.11.2011 07:45
Полный URL элемента библиотеки sharepoint yardie Общие вопросы Javascript 2 07.09.2011 14:45
Необходимы советы как убирать не нужное из библиотеки jquery. dr_gluk jQuery 13 18.07.2011 12:05
Ищу библиотеки для работы с 3D Бобр Общие вопросы Javascript 3 06.08.2010 17:02
Тестирование функции библиотеки AnimaJS Библиотеки/Тулкиты/Фреймворки 2 26.06.2008 22:45