Как стать автором
Обновить

Комментарии 158

Он на полную силу пользуется возможностями JavaScript 1.8, которые поддерживаются только современными браузерами, например Firefox 3.5+. Да, даже в третьем Фоксе часть не заработает. Я надеюсь, что такой шаг принесет в фреймворк изюминку и расширит круг возможностей.

1. Наверное Вы про Javascript 1.8.1?
2. Отсутствие возможности работать в большинстве браузеров навряд ли будет воспринято как изюминка.
1. Я про возможности, которые поддерживаются современными браузерами, но не поддерживаются ie6, например. Тут не только Js 1.8.1, 1.8, но и 1.7, 1.6
2. Это одна из причин создания этого фреймворка. Зачем мне, когда я пишу плагин для Файрфокса, Хрома и Оперы нужны все костыли, которые есть в стандартных фреймворках? или на сервере? у Nano другая целевая ниша и в ней остутствие поддержки старых браузеров — плюс.
Прошу прощения, проглядел соответствующий пункт в статье
как раз искал подобную штуку. а то у меня jQuery + пара плагинов весят 150кб при размере страницы в 45к. что как бы не очень правильно.
а 200кб в нынешнее время проблема?
Отличная штука!

А какая-нибудь удобная обертка над XHR планируется?
Возможно. Может будет как плагин.
Ой, только не отдельным файлом. Было бы замечательно если бы buider сделали и просто чудесно если бы в билдере можно было бы указать на какой браузер нацелен фреймворк, что бы костыли не включать в сборку.
Как-то я тоже запаривался над своим нано-фреймворком, только наоборот — основная его работа ajax. Такие фреймоврки весьма полезны.
Ну. Я костыли в любом случае писать не буду. А вот билдер — вполне возможно. Да вообще, я думаю, и в одном файле поместится.
Один я считаю, что это крохоборство, экономить 70кб?

А в гзипе jquery вообще 10кб весит.

Кроме того — все равно браузер кеширует библиотеку.

И еще — с каких пор третий фаерфокс — устаревший браузер.

Не хотел с утра ругаться матом, но, извините, разработчики этого немного охренели.
Я один разработчик) согласно википедии даже firefox 3.5 устаревший браузер.

кроме 70кб веса есть еще куча мертвого кода, который тормозит выполнение скрипта и фич, которые нельзя ввести из-за того, что библиотека должна поддерживать все браузеры.
НЛО прилетело и опубликовало эту надпись здесь
синтетические тесты устроят?
НЛО прилетело и опубликовало эту надпись здесь
Тесты:
nano(function () {
	var i;
	
	console.log(".title");
	
	console.time('Nano');
	for (i = 1000; i--;) nano('.title');
	console.timeEnd('Nano');
	
	console.time('Jquery');
	for (i = 1000; i--;) $('.title');
	console.timeEnd('Jquery');
	
	console.log("('[class=enabled]').find('.a .b')");
	
	console.time('Jquery');
	for (i = 1000; i--;) $('[class=enabled]').find('.a .b');
	console.timeEnd('Jquery');
	
	console.time('Nano');
	for (i = 1000; i--;) nano('[class=enabled]').find('.a .b');
	console.timeEnd('Nano');
	
	console.log(".a .b .c");
	
	console.time('Nano');
	for (i = 1000; i--;) nano('.a .b .c');
	console.timeEnd('Nano');
	
	console.time('Jquery');
	for (i = 1000; i--;) $('.a .b .c');
	console.timeEnd('Jquery');
	
	console.log("[class=id], .title");
	
	console.time('Jquery');
	for (i = 1000; i--;) $('[class=id], .title');
	console.timeEnd('Jquery');
	
	console.time('Nano');
	for (i = 1000; i--;) nano('[class=id], .title');
	console.timeEnd('Nano');
	
	console.log("span");
	
	console.time('Nano');
	for (i = 1000; i--;) nano('span');
	console.timeEnd('Nano');
	
	console.time('Jquery');
	for (i = 1000; i--;) $('span');
	console.timeEnd('Jquery');
	
	console.log("#her");
	
	console.time('Jquery');
	for (i = 1000; i--;) $('#her');
	console.timeEnd('Jquery');
	
	console.time('Nano');
	for (i = 1000; i--;) nano('#her');
	console.timeEnd('Nano');
});

Я специально сделал, чтобы один раз первым начинал Нано, второй раз — ДжиКвери.

Результат:
.title
Nano: 158ms
Jquery: 1014ms

('[class=enabled]').find('.a .b')
Nano: 939ms
Jquery: 2581ms

.a .b .c
Nano: 346ms
Jquery: 400ms

[class=id], .title
Nano: 1773ms
Jquery: 2323ms

span
Nano: 43ms
Jquery: 57ms

#her
Nano: 11ms
Jquery: 22ms


Сумма:
nano : 3270 = 100%
JQuery : 6397 = 195%


Разница — почти два раза. И дело тут не в хитрых оптимизациях, а в том числе в отказе от устаревших браузеров.
Да, это было в Фоксе 3.5. Теперь Хром 7.0.517.41 beta:
.title
Nano: 9ms
Jquery: 221ms

('[class=enabled]').find('.a .b')
Nano: 362ms
Jquery: 458ms

.a .b .c
Nano: 139ms
Jquery: 153ms

[class=id], .title
Nano: 360ms
Jquery: 441ms

span
Nano: 81ms
Jquery: 81ms

#her
Nano: 0ms
Jquery: 1ms


  nano :  951 = 100%
JQuery : 1355 = 142%

И учтите, JQuery оптимизируют годами, а я nano оптимизировал 2 часа.
Но у меня нету цели переплюнуть ДжиКвери по скорости. Как я уже сказал — у нас совершенно разные цели.
Так-так-так, а где тест для Ноды? ;-D
А Нода с селекторами не работает изкаробки)
Ага, сегодня же пятница, можно и пошутить :)
Так же ж querySelectorAll.
так я ж про это и говорю)
НЛО прилетело и опубликовало эту надпись здесь
А на повторных вызовах?
приблизительно одинаково: pastebin.com/2nVEvU0F
извините, что без форматирования, мне влом
Кеширование повторных вызовов не хотите сделать?
в моём фреймворке? думаете, стоит?
Я могу сказать про свою поделку. Даже при том, что она работала в 1..3 раза быстрее JQ на первом запросе, на последующих от 2 до 6 раз быстрее первого запроса. Потому что кеширование. Правда у меня это легко реализуется, в отличие от JQ.
применение очевидно — мобильные браузеры iphone/android.
там экономия в 70 кб вовсе не лишняя
В сжатом виде jquery весит 10кб. Даже если нано ужать так, то он будет весить 2 килобайта — экономия — всего 8 килобайт.

Кроме того, jquery агрессивно кешируют сервера google, их доступность и скорость во всех уголках мира — это факт.

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

Резюмируя, я хочу сказать, что данный фреймворк интересен лишь в академическом плане, посмотреть «что будет спустя лет 5», но не более, использовать его сегодня — это все равно что ставить современный реактивный двигатель на винтовой самолет 50-ти летней давности конструкции — взлетит и быстро, только в полете проведет недолго, потому что начнет разваливаться в самый неожиданный момент.

В выборе между скоростью и надежностью ПО, всегда выбирайте надежность.

иногда JQuery просто не нужен. Фанатам этого не понять. Для каждой задачи свой инструмент.
Трудно бороться с устоявшимся мнением.
вы высказались против моего мнения или за него?
За. Меня даже в блоге JQuery забанили за беспощадное надругательство над сутью данного фреймворка. :)
НЛО прилетело и опубликовало эту надпись здесь
да дело даже не в трафике.
вы представляете, сколько кода нужно перелопатить браузеру и сколько это занимает памяти в телефоне? и так каждый раз при загрузке каждой страницы.
Пропускаете строчки — «PRODUCTION (26KB, Minified and Gzipped)».
Недавно я делал сайт, оптимизированный под Opera Mobile. Хочу поделиться соображениями на основе полученного опыта.

Сейчас при загрузке первой страницы с моего сайта пользователь скачивает порядка 13Кб. Далее — по 1-2 килобайта на страницу. Файл jquery.min.js последней версии весит порядка 26Кб. При его подключении загрузки первой страницы увеличится в три раза. Оно того стоит? Да, после первого обращения к сайту Opera Mobile кэширует стили и скрипты. Но лишь до момента выхода из браузера. То есть загрузка первой страницы сайта будет подтормаживать всегда.

Надо ли говорить, что первичное впечатление о сайте пользователь получает уже при загрузке первой страницы и, возможно, дальше по сайту даже и не пойдет, если будет недоволен скоростью. Поэтому я отказался от JQuery и JQuery Mobile и считаю, что на 3G-каналах нужно считать каждый килобайт.
jQ делает слишком дофига действий. Я как человек делающий онлайн приложения для мобильников слежу за каждым лишним вызовом в коде, иначе юзеры будут не рады тормозне. Так что nano-фреймворки очень даже нужны. Пусть не всем, но аудитория есть и автор — молодец!
Как это 10 Кб? В самом-пресамом сжатом варианте jQuery весит около 25-27 Кб, если память не изменяет.
Согласен, что в большинстве «обычных» случаев это некритично. Но бывают ситуации, когда jQ все же тяжеловат — не только с точки зрения трафика, но и собственно объема кода. Какому-нибудь мобильному или старенькому браузеру незачем ворочать такой махиной, если реально используется 5-10% его возможностей (обычно, просто несколько селекторов).

А вот по поводу «устаревших» браузеров соглашусь — это сразу выкидывает сей фреймворк в область либо академического интереса, либо каких-то узких ниш.
Так! Если отказываемся от устаревших браузеров, то я предлагаю пикафреймворк (нано уже заняли):
var $ = window.document.querySelectorAll;
ну я как-то так и поступил)
Толя Чубайс одобряет наноназвание))
nano — это же консольный текстовый редактор, зачем повторяться и путать пользователей?
как то странно, не нажимая клавиши написать и прижав ctrl двигая мышой, собщение отправилось, и не дало добавить ссыль, а вот она: http://ru.wikipedia.org/wiki/Nano
создатели игры Prototype не подумали о JavaScript фрэймворке Prototype и всех запутали :)
а создатели многочисленных сфинксов, все знали и все равно пихали свои названия :)
Разрешаю вам называть его Nano.JS)
>>И в нём есть еще одно преимущество по сравнению со всеми современными фреймворками — полный отказ от устаревших браузеров
«Легким движением руки брюки превращаются… в шорты» +)
"вместилася"

Кто ж вас такому слову-то научил?
Что же вы все злые такие?
Они не злые, их заказчики замучили :-)
Кстати, действительно интересно было бы услышать грамотное сравнение с «зептой».

Как я вижу цели очень похожие — минималистичность и «заточка» только под новые броузера. Только у «зепты» явно видно основное применение — мобильные браузеры.

Размеры тоже впечатляют:
Original version: 5.7k
Minified: 3.7k
Minified and gzipped: 1.6k, compression factor 3.6

МИТ, на гитхабе и т.д… — может если общие интересы, может лучше просто объединить усилия и вместе с авторами «зепты» развивать?
Zepto, как и JQuery заточен исключительно под DOM, а у меня немного другие цели. Всё-таки DOM-составляющая у меня будет вынесена отдельным плагином. А смысл использовать Zepto на сервере я вообще не вижу.
У вас есть проверка в одном месте
else if (arg instanceof Array)

и есть лучший варинат проверки переменной
isArray : function(o) {
    return Object.prototype.toString.call(o) === '[object Array]';
}

есть куски вида
else return false;

однако false объявлена как переменная контекста вашего глобального замыкания

Чтобы ваш nano был ещё и fast постарайтесь избавляться от each внутри (будет и короче и быстрее) и длинных цепочек dom
return this.each(function (elem) {
    elem.parentNode.removeChild(elem);
});


точим точим :)
согласен, есть куда развиваться) спасибо)
Всё, кроме each, пофиксил.
Как можно избежать elem.parentNode.removeChild? =)
И почему все так боятся обычных циклов?
for (var elem, i = 0; elem = this.elems[i]; i++)
  elem.parentNode.removeChild(elem);
Потому что ваш код не удалит все ноды. Половина останется неудаленной.
Почему же?
this.elems это массив, а elem.parentNode.removeChild(elem) на него не влияет.
Если массив, то да.
что, если кто-то сделал this.elems[15] = myElem;, а до этого элементов было только 3. таким образом, получится такой результат:
return this.each(function (elem) {
	elem.parentNode.removeChild(elem);
});

// =>

var e = this.elems;
for (var i = 0, l = e.length; i < l; i++) if (i in e) {
	e[i].parentNode.removeChild(e[i]);
}
return this;
и тут уже страдает вес и читабельность.
Насколько можно судить по вашему коду, свойство elems приватное, и ситуация с this.elems[15] = myElem; крайне маловероятна.
Почему тогда не сделать
this.elems.forEach(function (elem) {
	elem.parentNode.removeChild(elem);
});
return this;

Немного больше кода, но без оберток и лишних вызовов ;)
ну… такого понятия как «приватное свойство» в ДжаваСкрипте нету)
а точно есть смысл в такой оптимизации? а если в методе .each будут какие-нибудь дополнительные вычисления? или this.elems лишится метода forEach (HTMLCollection)? или у меня будет два контейнера, this.elems1 и this.elems2, а each будет прозрачно обходить их оба? кажется, this.each очень хорошо абстрагирует все эти нюансы, при этом не особо сказывается на оптимизации.
Нашёл вот такое чудо: nanojs.org

Наверное стоит придумать другое название. ;)
Да, с названиями сейчас туго :-)
Обломс) Принимаю предложения)
Облоомс. Принимаю предложения.

Как на счет Freedom? С намёком на то, что свободный от всяких ослов.
Пико тоже занято. Может фемто? :)
Не боитесь, что наша власть возьмёт на заметку? ;)
кстати, есть еще вариант «Less Than» и сокращённо будет «lt()».
Можно назвать qui.js :)
А насчет идеи — просто отлично, в связи с выходом html 5, css 3 и иже с ними браузеров нужен фреймворк который не тащит за собой старое барахло и при этом безошибочно работает используя лишь новые функции.
Наверное имеет смысл заложить при проектировании минимальную поддержку браузеров на уровне Firefox 4, Chrome 10, IE 9, Opera 11, Safari? предположительно они выйдут в одно и то же время, кто-то раньше кто-то позже. Те кто говорят о необходимости поддержки старых браузеров лучше бы почаще предлагали пользователям сменить их на новые.

P.S. Как насчет UI? А то jQuery UI непомерно толст, при это реализовано там от силы 30-40% от планируемых.
ну по браузерам — я буду стараться поддерживать все более-менее молодые браузеры.

ui — возможно как плагин.
Когда физикам указывают на ошибочное использование термина фемтосекунда для длительности 100 фс они с радостью используют субпикосекунды :-D
Учитывая, что разница в размерах с jQuery составляет 1:20, предлагаю выбирать между «санти» и «деци».
наверное, мы таки решили уйти от названия-величины
Предлагаю назвать Ъ (твердый знак) заодним буржуйские программеры узнают какие мы суровые твердый знак :) И что у нас все жоско даже фрэймворки! Ъ это вам не какой-нибудь XUI!
var Ъ = {}; // это валидно!

Кроссбраузерный тест:
javascript:(function(){var Ъ = {a: 1};alert(Ъ.a);}());

Для проекта есть домен ъ-фрэймворк.ру ъ-framework.ru ъ-js.ru берем пока не заняли!
Ещё варианты: Ы-фрэймворк, Ё-фрэймворк (коротко и по-русски)
прикольно. надо будет добавить такой Алиас)
фреймворкЪ
Так вот они какие — нанотехнологии!
А какая основная цель написания данного фреймворка, и какую из задач кодера он решает?
в топике всё описано. и еще в первой ветке комментариев я отвечал
На первую часть кроме минимизации кода и желании написать что-то свое, есть еще варианты?
И все же я не получил ответ, какую из задач кодера будет решать новый фреймворк? Я не зря спрашиваю. У меня, допустим, в нескольких проектах используется свой фреймворк, цель которого была не «писать меньше», а расширять и видоизменять функционал быстрее и дешевле, учить людей быстрее, повторяемость использования кода улучшить.
много причин. JQuery не подходит к одним задачам, Мутулз — к другим. Они слишком привязаны к IE. Потому, например, сеттеры-геттеры реализовать отказалась. Когда я пишу плагины для браузера, или user-script я хочу использовать все возможности браузера, а не с оглядкой на ненужный мне ИЕ. а все современные фреймворки заставляют меня считаться с ним.
И опять же, на второй вопрос ответа нет. Повторю, какую глобальную задачу решает ваш фреймворк? Просто чтобы он был?
НЛО прилетело и опубликовало эту надпись здесь
Есть два типа людей. Те, кто изобретают велосипеды, и те, кто на них ездит. Первые умеют творить, вторые умеют только пользоваться готовым. Изобретать велосипеды более полезное занятие, чем простое их использование.
НЛО прилетело и опубликовало эту надпись здесь
Ресурсы бывают разными. Не забывайте про веб-ориентированные продукты. Они гораздо круче по функционалу, чем «примитивные» сайты. Посему отказ от старья может быть вполне оправданным.
НЛО прилетело и опубликовало эту надпись здесь
Потому что это общественный ресурс, а не корпоративное ПО.
А если сайт только под мобильные браузеры? Или только под один определённый браузер (для правительства сайт)?
gmail расчитан на всех. А данный фреймворк может спокойно использоваться только в узком кругу задач.
Автор же писал — цели фреймворков разные.
НЛО прилетело и опубликовало эту надпись здесь
У меня есть хорошо забытое старое «новое». Но оно вообще не попадает в общепринятые рамки, что вызывает мгновенное отторжение. Хотя эффективность проверена не на одном проекте.
НЛО прилетело и опубликовало эту надпись здесь
Демагогия. Подмена тезиса.
Вы начинаете приписывать вмне вещи, которых я не говорил. более того, я утверждал совершенно иное. это фреймворки разных весовых категорий.
вывод — вы просто троллите, а не ищите истину.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Еще как позволяет, Google же вроде отказались от поддержки IE6, как и многие другие гиганты Инета.
НЛО прилетело и опубликовало эту надпись здесь
это всеголишь инструмент. за 5000 лет молотки почти не изменились
НЛО прилетело и опубликовало эту надпись здесь
вы смотрите на мир через замочную скважину. вы понимаете, что иногда JQuery со своей философией не подходит под идею приложения. например, я использую html5 canvas api. вот нахрена мне здесь все костыли, которые рассчитаны на ie?
var ctx = $('#canvas').getContext('2d');

И зачем мне дальше ДжиКвери? И ради этой я подключал 100кб скриптов?
А я хочу расширить объект геттерами и сеттерами
extend(object, {
  get prop : function () {},
  set prop : function () {}
});

Облом, не работает в IE, потому ДжиКвери и Мутулз не введут такую пиздатую штуку.

Я очень люблю ДжиКвери и для обычных сайтов использую только его.

Но нельзя быть таким бездумным фанатом, который не принимает никаких альтернатив.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
И, тем не менее, новые велосипеды изобретаются. Тот, кто хоть раз обошел вокруг своего дома, уже знает больше, чем тот, кто никогда из него не выходил. В программировании изобретать велосипеды очень полезно. Знать как устроено гораздо важнее чем знать, как пользоваться.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
классный у меня велосипед получился. не зря делал. можно просто прокатится там, где хочу в своё удовольствие.
ато эти, с дизельными движками хотя и едут быстро, но воняют…
Эх, помню времена когда jQuery был «легковесным фреймворком»
Деньги разработчика, которые ему нужно будет потратить на поддержку, тоже настоящие.
Иногда бывает, что разработка проекта дороже самого проекта, да
Если вам нужны старые браузеры, следовательно вам нужен другой фреймворк)
А если вдруг они вам завтра понадобяться? )
значит завтра придётся всё переписывать))
НЛО прилетело и опубликовало эту надпись здесь
кстати, ссылка не открывается
Зачем нужен contains, если есть indexOf(x) != -1? Ну хотябы в реализации массив не перебирать.
А вобще ожидал нечто джедайского судя по вступлению, ну там чтобы лет скопинг сплошь и рядом, кортежи, генераторы ну или в этом духе, чего там в js нового накрутили
у нас в школе писали операционки от нечего делать, а сейчас — джаваскрипт-фреймворки
var tagNameRE = /^[a-z]+$/;
var classNameRE = /^\.[a-z]+$/;
var idRe = /^\#[a-z]+$/;

У вас идентификаторы и классы могут быть только из латинских букв?
И далее
e = arg.match(idRe) ? [In.getElementById(arg)] :
				toArray(
					arg.match(classNameRE) ? In.getElementsByClassName(arg) :
					arg.match(tagNameRE)   ? In.getElementsByTagName(arg) :
						In.querySelectorAll(arg)
				);

вот getElementById будет вызываться со значением "#id"
а getElementsByClassName со значением ".class"
идентификаторы могут быть из любых буквы. все «нестандартные ситуации» обрабатываются querySelectorAll.
да, был неправ. пофиксил и пушнул)
НЛО прилетело и опубликовало эту надпись здесь
будем развиваться. если будут фидбеки, то будет круто)
Внезапно меня посетила идея… sizzlejs.com весит 30кб (14кб после yui-compress'a)

GWT компилит разные версии библиотек для разных браузеров. Может сиззлер подпилить таким же образом?

Размер самой библиотеки уменьшится, скорость поднимется. А как разработчики -то будут благодарны! =)
Так, я немного гоню… размер библиотеки для индивидуального браузера уменьшится. Однако, придется динамически распознавать браузер либо джаваскриптом либо на стороне сервера. Загрузка усложнится и замедлится. Слегка.
Насколько я знаю, одно из активно-обсуждаемых направлений в развитии jquery — «Dynamic script loading and dependency management»

Кроме того, что это облегчит подключение модулей для плагинов, это возможно позволит разделить «заточки» для разных броузеров и загружать необходимую. Нечто вроде как делает GWT (но там просто создается полностью независимые версии для всех коомбинаций типа броузер/локаль)
Ну для сизлла плагины и зависимости не актуальны, это же движок селекторов.

Пробежался по архиву рассылки jQuery и Sizzle, нашел близкие по духу мысли, но вроде не то. Может у вас ссылка сохранилась?
Тут есть два но:
1. Для коммерческих сайтов отбрасывать старые броузеры нельзя. Нелепо выгляди «если Вы хотите заплатить нам — проапгрейдите броузер».

2. jq меня обленивил своим live/delegate/bind+trigger/… слишком удобно (особенно поддержка event namespaces)

Может оно и много занимает… но чертвозмьи удобно!
1. Для определенных целей можно. Очень сильно зависит от целей. Между прочим, некоммерческие сайты мы тоже делаем для людей ;)

2. delegate и bind у меня есть. live — штука удобная, но не очень нравится сам подход. имхо, правильнее такое реализовывать через delegate. может не так удобно, но зато лучше)

3. Не часто нужен столь мощный функционал. Имхо… )
К сожалению не хватает возможностей задать вопрос в профильном месте, поэтому интересуюсь здесь:
Есть два шаблона сайта «тяжелый» и «лёгкий». Вопрос: есть ли возможность производить переадресацию на одну из версий шаблонов, в зависимости от скорости интернета пользователя?
В подвале сайта на стороне сервера можно объявлять js переменную, в которую вносится timestamp (это будет метка времени, когда страница была сформирована)
В JS коде на функцию onload (ready и т.д.) вставляем определение timestamp и сравнение его с меткой времени в подвале.
У этого варианта есть недостаток: если у пользователя неправильно настроены часы, то значения будут абсурдными.

Модифицируем метод:
В шапку сайта вставляем что-то типа:

<script type="text/javascript">var startTimestamp = new Date();</script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(function() {
    var finishTimestamp = new Date();
    var loadingTime = startTimestamp.getTime() - finishTimestamp.getTime();
});
</script>


На основе loadingTime определяем время загрузки всех скриптов/стилей/изображений. Если заранее определить каким-то образом их размер, то с какой-то степенью точности можно вычислить скорость интернета.
Создал issue: github.com/theshock/nanojs/issues/issue/2
if (!arguments.length) {
	var e = [doc];
} else if (typeof arg == s_string) {
	e = arg.match(idRe) ? [In.getElementById(arg.substr(1))] :
		toArray(
			arg.match(classNameRE) ? In.getElementsByClassName(arg.substr(1)) :
			arg.match(tagNameRE)   ? In.getElementsByTagName(arg) :
				In.querySelectorAll(arg)
		);

Кратко поясню: в первом блоке if переменная e объявлена, как локальная, однако при ложности условия и попадании в любой из последующих блоков else if эта переменная уже будет трактоваться, как глобальная, что чревато коллизиями.
не будет.
Черт, и действительно. Посыпаю голову пеплом и впредь буду менее самонадеянным.
Баг закрыл.
Ничего) Для людей, которые не верят, пруф:
var foo = 'bar';

(function () {
	if (false) {
		var foo;
	} else {
		alert(foo); // undefined
	}
})();


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

Но все-равно спасибо)
НЛО прилетело и опубликовало эту надпись здесь
говорят, JQuery Mobile тащит за собой весь взрослый JQuery
НЛО прилетело и опубликовало эту надпись здесь
наверное, JQuery Mobile — это просто фронтенд для JQuery с функциями, специфичными для мобильного телефона
Да, по идее как раз все наоборот должно быть: телефонам — минимальный необходимый функционал, чтобы трафик сильно не есть, а на десктопе — какие-то дополнительные возможности. А то получается что-то совершенно несуразное — на мобильниках требуется два реквеста вместо одного, да еще и первым реквестом тянется вся телега jQuery со всем хозяйством (например, с воркэраундами для ие6 — зачем это на мобильниках?).

В общем, то, что сегодня называется jQuery Mobile лучше назвать jQuery UI Mobile — все равно там в основном компоненты для мобильного интерфейса и поддержка touch.
Скажите, а в сторону YUI3 не смотрели? У YUI есть билдер developer.yahoo.com/yui/3/configurator/ — можно собрать только ту функциональность, которая вам лично нужна. Грузится все через комбо-url с cdn Yahoo! — один реквест на JS и один — на CSS (если нужен). При переходе с ветки 2.х на 3.х одной из целей разработчиков как раз было разбиение крупных функциональных блоков на мелкие модули — чтобы грузить на страницу как можно меньше лишнего кода. Может быть результат получится не такой маленький, как ваш, но и далеко не 100 с лишним килобайт, как в jQuery. По характеру YUI 3 больше напоминает jQuery или MooTools.
как минимум хаки для ИЕ оно за собой тянет. а я хотел от них избавиться.
Вариант переписать

  var tagNameRE = /^[-_a-z0-9]+$/i;
  var classNameRE = /^\.[-_a-z0-9]+$/i;
  var idRe = /^\#[-_a-z0-9]+$/i;
  ...
 
  else if (typeof arg == s_string) {
			e = arg.match(idRe) ? [In.getElementById(arg.substr(1))] :
				toArray(
					arg.match(classNameRE) ? In.getElementsByClassName(arg.substr(1)) :
					arg.match(tagNameRE)   ? In.getElementsByTagName(arg) :
						In.querySelectorAll(arg)
				);
  }


  var rx = /^([#\.]?)([-_a-z0-9]+)$/i;
  ...

  else if (typeof arg == s_string) {
    var m = arg.match(rx);
    var selector = arg;

    if (m)
    {
      if (m[1] == '.')
        selector = { Class: m[2] };
      else
        if (m[1] == '#')
          selector = { id: m[2] }
        else
          selector = { tag: m[2] }
    }

    e = nano.find(In, selector);
  }


Кстати, вместо Class можно было бы использовать className.
наверное, имеет смысл, да.

Class можно было бы использовать className.

Я думал об этом. Не знаю, как лучше. Вообще я сомневаюсь в том, что этот способ будет вообще использоваться.
Просто сейчас получается похожий код используется в двух местах. Если сделать reuse кода, думаю это браготворно скажется на размере. К тому же нет смысла матчить строку на три разные регулярные выражения, если можно обойтись одним.
я про Class vs className)
1. Тащит за собой хаки для IE
2. DOM-only
1. Их все тащат… кроме RightJS, в котором они в отдельном файле и загружаются только в IE
2. А больше ничего и не надо
1. Сабж не тащит
2. Ну кому как
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации