Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Bala.js - функция для выборки элементов на странице в 408 символах (https://javascript.ru/forum/project/60330-bala-js-funkciya-dlya-vyborki-ehlementov-na-stranice-v-408-simvolakh.html)

FINoM 22.12.2015 23:25

Bala.js - функция для выборки элементов на странице в 408 символах
 
Репка

Псто (очень быстро набирает плюсики)

(function(win, $) {
    // your code starts here
    $(function() {
        alert($('div').length);
    });
  // your code ends here
})(window, function(d,e,c,f,g){c=function(a,b){return new f(a,b)};f=function(a,b){e.push.apply(this,a?a.nodeType||a==window?[a]:""+a===a?/</.test(a)?((g=d.createElement(b||"q")).innerHTML=a,g.children):(b&&c(b)[0]||d).querySelectorAll(a):/f/.test(typeof a)?/c/.test(d.readyState)?a():d.addEventListener("DOMContentLoaded",a):a:e)};c.fn=f.prototype=e;c.one=function(a,b){return c(a,b)[0]||null};return c}(document,[]));


Что добавить, не знаю. Может, Максимаксимаксимус заюзает в ui.js.

kobezzza 22.12.2015 23:54

Я юзаю https://github.com/bendc/sprint

FINoM 22.12.2015 23:58

kobezzza, но зачем? Вопрос отпадает если работаешь с коллекциями элементов.

kobezzza 23.12.2015 00:05

Цитата:

Сообщение от FINoM (Сообщение 400973)
kobezzza, но зачем? Вопрос отпадает если работаешь с коллекциями элементов.

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

FINoM 23.12.2015 00:17

kobezzza, по поводу скорости я согласен, по поводу методов... О каких методах речь? Может, я слишком хорошо знаю VanillaJS и слишком быстро печатаю, чтоб понять, нафига юзать DOM библиотеки.

kobezzza 23.12.2015 00:22

Цитата:

Сообщение от FINoM (Сообщение 400977)
kobezzza, по поводу скорости я согласен, по поводу методов... О каких методах речь? Может, я слишком хорошо знаю VanillaJS и слишком быстро печатаю, чтоб понять, нафига юзать DOM библиотеки.

$, hasClass, attr, width / height, on /off иногда. Бывает юзаю всякие next/prev/closest/find.

Конечно сейчас при работе в рамках фреймворков это редко нужно, но мне удобно что тут привычно jQ API, которое я в своё время выучил наизусть, а 5кб мне не жалко :)

FINoM 23.12.2015 00:23

Кто-то крадет мои поюсики на Хабре. Джон Резиг, наверное.

kobezzza 23.12.2015 00:24

Цитата:

Сообщение от FINoM (Сообщение 400979)
Кто-то крадет мои поюсики на Хабре. Джон Резиг, наверное.

ахаха, не иначе :)

FINoM 23.12.2015 00:37

Цитата:

Сообщение от kobezzza
hasClass

node.classList.contains
Цитата:

Сообщение от kobezzza
attr

node.getAttribute/node.setAttribute
Цитата:

Сообщение от kobezzza
width / height

node.offsetWidth/node.offsetHeight
Цитата:

Сообщение от kobezzza
next/prev/closest/find

node.nextElementSibling/node.prevElementSibling/closest/querySelector

Может это я один такой упоротый и кайфую от того, что пишу код, скорость которого зависит только от уровня кривизны моих рук?

kobezzza 23.12.2015 00:39

FINoM, я всё это знаю, но мне привычнее jQ :)

Цитата:

Может это я один такой упоротый и кайфую от того, что пишу код, скорость которого зависит только от уровня кривизны моих рук?
В тот день, когда такая хрень станет для меня узким местом - я брошу программировать :)

FINoM 23.12.2015 00:42

Цитата:

Сообщение от kobezzza
В тот день, когда такая хрень станет для меня узким местом - я брошу программировать

Я сонный, наверное, не пониимаю твоего сообщения.

kobezzza 23.12.2015 00:44

Цитата:

Сообщение от FINoM (Сообщение 400985)
Я сонный, наверное, не пониимаю твоего сообщения.

Я к тому оптимизация таких спичек никогда не станет узким местом в моих приложениях.

Мне приятнее писать append, а не insertAjasentHTML (даже без ошибок написать не могу:)).

PS: Я уже давно отказался от jQ, ввиду её не нужности, но для простейших операций с DOM мне приятнее её API, а не vanilla, поэтому я рад, что нашёл такую библиотеку. А то что я юзаю там 20-30%, меня не напрягает, ибо это опять таки оптимизация на спичках.

FINoM 23.12.2015 00:50

Цитата:

Сообщение от kobezzza
даже без ошибок написать не могу

А автодополнение?
Цитата:

Сообщение от kobezzza
Я к тому оптимизация таких спичек никогда не станет узким местом в моих приложениях.

Это не оптимизация. Я сам говнокожу порой (на Матрешку посмотри :D). Просто между VanillaJS и какой-нибудь библиотекой не вижу разницы. Если разницы нет, то логично выбрать то, что работает быстрее и зависит только от меня.

kobezzza 23.12.2015 00:53

Цитата:

А автодополнение?
jQ API я печатаю быстрее :)

Цитата:

Просто между VanillaJS и какой-нибудь библиотекой не вижу разницы.
Ну разница в сахаре. Сахар - это конечно условность. Тебе нравиться native, а мне native завёрнутый в привычный jQ API - не вижу ничего криминального в этой схеме.

Rise 23.12.2015 01:24

FINoM, а как минимизировать подобные нативные конструкции как classList.contains? Попробуй... аля jq и получишь... при том получится что-то типа elem.has('class'), видишь как красиво))

А ты предлагаешь так извращаться да?
var classList = 'classList', contains = 'contains';
elem[classList][contains]('class');

kobezzza 23.12.2015 01:40

Глянул DOM level 4 спеку - а симпатично уже выходит :)

FINoM 23.12.2015 12:25

Rise, жми код как хочешь. В маленьких проектах синтаксис DOM API не сильно повлияет на результирующий код. В больших - юзай фреймворки.
Цитата:

Сообщение от kobezzza
Глянул DOM level 4 спеку - а симпатично уже выходит

Вот вот.

FINoM 23.12.2015 14:59

Не ожидал такого срача на Хабре :)

FINoM 29.12.2015 03:24

Багфикс заставил распухнуть функцию до 415 символов. Вчера удалось вернуть прежний размер (408), но не понятно, как жать дальше. У меня создаётся впечатление, что жать уже некуда (без eval, конечно же). Вот, финальный, неминифицированный вариант: https://github.com/finom/bala/blob/master/bala.js

Жму вот этой штукой, вручную: http://closure-compiler.appspot.com/

Есть идеи, как еще можно уменьшить количество символов?

Понятно, что плюс-минус пара байт ничего не решат. У меня чисто спортивный интерес.

FINoM 29.12.2015 04:09

Сразу после предыдущего сообщения пришли две идеи:
1. В парсере заменить document.createElement('q') на document.createElement(s_addEventListener) (где s_addEventListener - это 'addEventListener'). Разница только в том, что вместо валидного элемента создается HTMLUnknownElement.
2. /f/.test(typeof s) (является ли переменная функцией) заменил на это: (typeof s)[7] (мы заранее знаем, что переменная не undefined).

И небольшой чит: я убрал запятую после объявления функции в примерах, сохранив 1 байт. Теперь "убийца" занимает 400 символов.

Опять сижу и думаю, что жать некуда, не пожертвовав функциональностью.

Rise 29.12.2015 06:08

FINoM, , $, Bala убрать из параметров и объявить как function declaration, тогда ; станет не нужен после них, даст -6.

Deff 29.12.2015 10:46

Цитата:

Сообщение от FINoM
Может это я один такой упоротый и кайфую от того, что пишу код, скорость которого зависит только от уровня кривизны моих рук?

Цитата:

Сообщение от kobezzza
В тот день, когда такая хрень станет для меня узким местом - я брошу программировать

Если не брать в расчёт шаблонизаторы, а ваяние скриптов под запрос, зачастую интерес отнюдь не в скорости, а в алгоритме.
====================
Цитата:

Сообщение от FINoM
Кто-то крадет мои поюсики на Хабре. Джон Резиг, наверное.

На Хабре, главное тактика ответов на первые два вопроса,
Если начинаешь оспаривать наезды, особенно на фичах-альтернативных популярным фреймворкам, получаешь кучу минусов.
Хитрый ход, сделать упор в первых двух комментах, что востребовано в проектах где
a) Политикой руководства запрещены тяжёлые фреймворки.
b) Разработка приложений с быстрой реакцией

nerv_ 29.12.2015 10:56

Цитата:

Сообщение от kobezzza
В тот день, когда такая хрень станет для меня узким местом - я брошу программировать

хорошо сказано :)

Цитата:

Сообщение от FINoM
Кто-то крадет мои поюсики на Хабре.

Не в плюсиках счастье и не в их колличестве. Плюсы всего лишь отражают популярность. О качестве кода (решения) они ничего не говорят.

Гозар уже делал нечто подобное

Deff 29.12.2015 11:18

Цитата:

Сообщение от nerv_
Плюсы всего лишь отражают популярность.

На Хабре, минусы отражают популярность. Общий порыв: заклевать автора при малейшем колебании.

FINoM 29.12.2015 13:10

Цитата:

Сообщение от Rise
FINoM, , $, Bala убрать из параметров и объявить как function declaration, тогда ; станет не нужен после них, даст -6.

Гениально, спасибо!
(Хотя, может, не так и гениально, просто я - тормоз).

По поводу поста на Хабре, тут виден серьезный прогресс. Все посты несколькогодичной давности, где автор предлагал отказаться от jQuery были адски заминусованы. Меня интересует не карма-рейтинг-дрочерство, а реакция людей. Тут мнения разделились на ~60/40, Vanilla побеждает.

FINoM 29.12.2015 13:19

Теперь 394 символов :)

Deff 29.12.2015 13:50

Цитата:

Сообщение от FINoM
По поводу поста на Хабре, тут виден серьезный прогресс. Все посты несколькогодичной давности, где автор предлагал отказаться от jQuery были адски заминусованы.

FINoM, Ибо как не верти, нативный js по удобству функционала движется к jQuery (грил более 4-лет назад) Ибо автор JQ здорово уловил потребность, да пока наибольший функционал удобств реализован в JQ, но натив движется к задумкам автора
=====================
Цитата:

Сообщение от FINoM
Меня интересует не карма-рейтинг-дрочерство

Ну противопоставлять Bala - jQ для данной аудитории, даж подспудно - ну откровенно нарываться, ибо многие так натив до конца не знают, и оно им не нужно, для правки пары селекторов
По-моему благоразумно было сразу обращаться к js аудитории нативщиков и желающих быстрых и минималистических библиотечек.
Цитата:

Сообщение от FINoM
Тут мнения разделились на ~60/40, Vanilla побеждает.

90% просто не нужны были в теме, отсеки их изначально обращением к нужной части
Цитата:

Сообщение от kobezzza
бывает юзаю всякие /prev/closest/find.

Эти добавки бы убили большинство контрпротивостояния джикверистов

FINoM 29.12.2015 15:26

Следующая цель - сделать функцию компактнее кода Google Analytics. Нужно совсем немного: дойти до 386 символов, т. е. убрать 8 символов.

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-12418613-4', 'auto');
  ga('send', 'pageview');
(пробелы и переносы тоже учитываются, этот код предоставляет Гугл)


UPD
Можно упростить задачу и сравнивать этот код:
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-12418613-4', 'auto');
  ga('send', 'pageview');

</script>


С этим (предварительно убрав все пробелы)
<script>$=function(d,e,f){function c(a,b){return new g(a,b)}function g(a,b){a&&[].push.apply(this,a[e]?[a]:""+a===a?/</.test(a)?((b=d.createElement(b||e)).innerHTML=a,b.children):b?(b=c(b)[0])?b[f](a):[]:d[f](a):(typeof a)[7]?"c"==d.readyState[0]?a():d[e]("DOMContentLoaded",a):a)}c.fn=g.prototype=[];c.one=function(a,b){return c(a,b)[0]||null};return c}(document,"addEventListener","querySelectorAll")</script>


Разница в 3 символа.

FINoM 01.01.2016 22:24

С Новым Годом! Bala.js похудела на 18 символов (минус точка с запятой, которую я вернул на бочку). Это сделано благодаря отказу от конструктора в пользу Object.create.

$=function(e,f,g){function c(a,b,d){d=Object.create(c.fn);a&&d.push.apply(d,a[f]?[a]:""+a===a?/</.test(a)?((b=e.createElement(b||f)).innerHTML=a,b.children):b?(b=c(b)[0])?b[g](a):d:e[g](a):(typeof a)[7]?"c"==e.readyState[0]?a():e[f]("DOMContentLoaded",a):a);return d}c.fn=[];c.one=function(a,b){return c(a,b)[0]||null};return c}(document,"addEventListener","querySelectorAll");

Deff 01.01.2016 22:55

Цитата:

Сообщение от Deff
Цитата:

Сообщение от kobezzza
бывает юзаю всякие /prev/next/closest/find.

Эти добавки увеличили бы востребованность в N раз, несмотря на увеличение кол-ва символов от минималки

.
Ну реально на микрозадачах, решаемых на коленке все с удовольствием откажутся от jQ или собственных библиотечек, если будет текущая Bala.js с такой добавкой . Назови её Bibizyan2016 (или Bibi2016), если жаль трогать Bala.js

Выложи, в том жа Хабре, если за неделю 40 плюсов не будет - я съем галстук :D
======================
/Ну а по серьёзному, имхо будет востребовано/

Deff 01.01.2016 23:14

FINoM,
Ксать есть практически незадействованный символ вместо $ => µ
И имя соответствует микробиблиотеке
-------------------------------
Новое имя позволило бы использовать библу и наряду с неизвестными версиями jQ
К примеру: Постепенная замена (возможных для замены библой) кодов на jQ.
-------------------------------
И, имхо, название бы статьи менее вызывающее(зачем дразнить ?), ну типо:

« Бла-Бла.js - микробиблиотека для микрозадач »

callbackhell 02.01.2016 22:57

Цитата:

Сообщение от Deff
Ксать есть практически незадействованный символ вместо

Кстати, пользуют подобную обфускацию только мартышки. Это экономия на спичках.

ruslan_mart 03.01.2016 06:52

Deff, и как этот символ печатать при написании кода? У кого-то есть отдельная клавиша для этого символа? Копировать/вставить и альт кодами, ИМХО, неудобно будет.

FINoM 03.01.2016 13:17

Цитата:

Сообщение от Deff
И, имхо, название бы статьи менее вызывающее(зачем дразнить ?)

Не считаю название вызывающим. Программирование - это не религия.

FINoM 03.01.2016 14:08

Сохранил еще 5 символов. Не спрашивайте, как.

FINoM 03.01.2016 15:03

Вернул 7 символов :(
Детектирование функции таким способом:
(typeof s)[7]
вызовет проблемы с передачей SIMD.

Deff 03.01.2016 16:21

Ruslan_xDD,
В нормальном редакторе есть вставка символа, тьву не все равно где кликать ? (или автозамена клика кнопки, у меня к примеру F12)
Ксать для $ нун еще шифт переключать, а тут одним кликом

FINoM 03.01.2016 16:23

Deff, т. е. нужен редактор? А если я хочу jsbin заюзать?

Deff 03.01.2016 16:28

FINoM,
С новым годом! (Ну на вкус и цвет, тогарищей нет, - забудь)
Мну говорил за то, что будет интересно джукверистам, ибо зачастую нужен быстрый парсер по DOM без наворотов, я бы использовал Bala, но из-за отсутствия next, prev и find - отпадает. Причем я не хочу нарягаться с разбором конфликтности с $

FINoM 03.01.2016 16:38

Цитата:

Сообщение от Deff
но из-за отсутствия next, prev и find - отпадает

Vanilla
var next = $.one('xxx').nextElementSibling;
var prev = $.one('xxx').previousElementSibling;
var found = $.one('yyy', xxx);

Цитата:

Сообщение от Deff
Причем я не хочу нарягаться с разбором конфликтности с $

Так назови как захочешь. Просто замени доллар в начале скрипта на что угодно: https://github.com/finom/bala/blob/master/bala.min.js


Часовой пояс GMT +3, время: 06:15.