Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   browser detect, DOM Templates, create SWF — немного моих плюшек для jQuery (https://javascript.ru/forum/project/10612-browser-detect-dom-templates-create-swf-%E2%80%94-nemnogo-moikh-plyushek-dlya-jquery.html)

vflash 12.07.2010 15:34

browser detect, DOM Templates, create SWF — немного моих плюшек для jQuery
 
чуть подробнее описал на хабре http://vflash.habrahabr.ru/blog/98849/

код — http://vflash.ru/rr2jquery/src/rr2jquery.js
пример — http://vflash.ru/rr2jquery/, http://vflash.ru/rr2jquery/demo_pager.html

интересно мнение тех кто пишет на js. может кто возмет на вооружение тогда и документацию не лень будет написать. также приветствуются баги и объективная критика.

Octane 12.07.2010 16:16

Однобуквенные переменные… Дальше даже смотреть не стал.

vflash 12.07.2010 16:30

Octane, и ?

Kolyaj 12.07.2010 16:31

Цитата:

особенность идеи в использовании NaN.
Что значит сия фраза?

vflash 12.07.2010 16:38

ну смотрите если у вас браузер на основе gecko то переменная $.IE будет равна NaN. и любые условия ($.IE<8 || $.IE || $.IE>8 итд) вернут false, если бы $.IE был равен просто false то $.IE<8 выдал бы true. те переменную $.IE можно использовать не просто как флаг (true|false) но и использовать в выражениях.

вообше про этот способ писал самой первой записью в блогах на javascript.ru , года 2 или 3 назад

Riim 12.07.2010 17:00

выражение - расшифровка (моя)
$.IE = undefined - браузер IE версию которого определить не удалось.
$.IE = NaN - браузер IE имеющий не числовую версию, например, alfa.
$.IE = null - свойство является пустотой, оно не существует. Оно и не может существовать, потому как не существует объект который должен его содержать (т. е. IE).

Логически правильный вариант именно null. Это, наверное, можно назвать семантикой в javascript-е.

vflash 12.07.2010 17:16

Riim, вы чегота не поняли. какая нафиг симантика.
что проше if($.browser.msie && $.browser.version<8) или if($.IE<8)
ито $.browser.version это строка, ее еше нужно преобразовать. а в других браузерах $.browser.version вообше бесполезна.

Riim 12.07.2010 17:46

Цитата:

Сообщение от vflash
какая нафиг симантика

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

Octane 12.07.2010 17:49

Цитата:

Сообщение от vflash
что проше if($.browser.msie && $.browser.version<8) или if($.IE<8)

А зачем такая проверка вообще нужна?

Riim 12.07.2010 17:56

К тому же первая проверка как раз проще для понимания. Просто символов больше.

vflash 12.07.2010 18:00

$.browser.msie это и IE6 и IE7 и IE8 и IE9 . каждый со своей прихотью. потому порой нужно знать и версию.
кроме IE есть такой браузер Opera и у него фокусов тоже хватает. с Gecko и WebKit както попроще и достаточно самого факта что это Gecko или WebKit, но тоже бывает полезно.

Riim, вы ведь поняли когда if($.IE<8) будет true.

Octane 12.07.2010 18:06

Ну приведите конкретный пример, где бы понадобилось знание версии IE.

vflash 12.07.2010 18:12

к примеру в IE<8 не работает white-space: pre-wrap; потому "\n" нужно заменить на <br> средством js
в IE<9 можно так createElement('<input>') в IE>8 уже как у всех

Octane 12.07.2010 18:53

Цитата:

Сообщение от vflash
к примеру в IE<8 не работает white-space: pre-wrap; потому "\n" нужно заменить на <br> средством js

Лучше проверить значение element.currentStyle.whiteSpace.

Цитата:

Сообщение от vflash
в IE<9 можно так createElement('<input>') в IE>8 уже как у всех

Во всех браузерах можно выполнить document.createElement("input"), только необходимо помнить, что type устанавливается до добавления в дерево, как, например, так же необходимо помнить, что обработчик события load нужно назначать перед изменением src, onreadystatechange — перед вызовом send. Просто используйте стандартный вариант document.createElement("input"), никакие проверки здесь не нужны.

x-yuri 12.07.2010 19:24

Цитата:

Сообщение от Octane
Однобуквенные переменные… Дальше даже смотреть не стал.

Цитата:

Сообщение от Riim
К тому же первая проверка как раз проще для понимания. Просто символов больше.

Цитата:

Сообщение от vflash
буду краток

я думаю, дело в том, что ТС очень краток
vflash, а собственно зачем однобуквенные переменные?

Цитата:

Сообщение от vflash
Riim, вы ведь поняли когда if($.IE<8) будет true.

когда прочитал в начале топика с объяснением понял, естественно. А уже когда читал это сообщение, начал сомневаться, что именно это значит

Цитата:

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

Riim, а можно подробнее? Я вижу лишь, что ТС решил, что if($.IE<8) короче, потому лучше. А дальше идет реализация этого "интерфейса".

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

vflash 12.07.2010 20:10

Octane, мне проше сделать проверку $.IE<8 чем проверять наличие каждого свойства style. вариантов проверки множество , мой короче и универсальный потому и удобнее. про createElement хз уже не помню почему так делаю (багов много всех не запомнишь), но тесты писать чтоб убедиться в вашей правоте как-то лень. вообше спасиб как нибуть всеже проверю.

x-yuri, одна буква потому что удобно, в коде видна логика а не названия переменных. a - это Array или argument, n - node, i - индекс итд. такие сокращения стандартны и не только я их использую. и потом короткие имена использую только во внутреннем коде, в интерфейсах использую человеко_понятные. По поводу шаблонизатора, интерфейс вылизывался больше года, подстраивался он под js потому как идея и была использовать js-синтаксис как шаблон, те да вы правы под реализацию.

e1f 12.07.2010 20:28

Цитата:

Сообщение от vflash (Сообщение 63372)
к примеру в IE<8 не работает white-space: pre-wrap; потому "\n" нужно заменить на <br> средством js
в IE<9 можно так createElement('<input>') в IE>8 уже как у всех

.foo {
  word-wrap: break-word; /* IE 5.5+ */
}

vflash 12.07.2010 20:53

e1f, word-wrap - это другое. переносы были но не отрабатывали '\n'.

e1f 12.07.2010 21:14

vflash, word-wrap: break-word дает тот же эффект, что и white-space: pre-wrap

vflash 12.07.2010 21:42

e1f, http://vflash.ru/work/pre_wrap.html - не совсем тот.

x-yuri 12.07.2010 22:18

Цитата:

Сообщение от vflash
одна буква потому что удобно, в коде видна логика а не названия переменных

аналогично разбивка на функции позволяет увидеть что происходит, а не как это реализовано. Я завидую вашему умению поддерживать такие больщие функции, да и такой код (неужели дело просто в привычке?) Из еще замеченного: куча кода в одной строке, повторное использование переменных (сначала i - элемент script, потом ключ "ассоциативного массива"). Наверное, цепочка такая: большие функции -> куча кода в одной строке -> использование однобуквенных переменных. Надо лишь избавиться от первого элемента и вся цепочка развалится...

Цитата:

Сообщение от vflash
такие сокращения стандартны и не только я их использую

по-моему как-то слишком много сокращений, чтобы они были стандартны

Цитата:

Сообщение от vflash
и потом короткие имена использую только во внутреннем коде, в интерфейсах использую человеко_понятные

я бы поспорил, cr_master, cr_swf...

p.s. меру надо знать, имхо. Я тоже как-то так думал когда-то, правда до такого количества сокращений у меня не дошло

vflash 12.07.2010 23:20

x-yuri, ваше право писать так как вам удобно. я бы рад разбивать на мелкие функции но тесты говорят что это стоит ресурсов особенно в IE. А порой в этом нет необходимости если логика линейна, след. и разбивать нет смысла. В функции выделять нужно те части которые повторяются, или уже когда совсем прижмет.
p.s. вы придираетесь

B~Vladi 12.07.2010 23:30

Цитата:

Сообщение от vflash
логика линейна

:blink:

vflash 12.07.2010 23:40

B~Vladi, a=2;b=4;c=a+b;

если говорить философски то я считаю что логика всегда линейна.

B~Vladi 12.07.2010 23:49

Цитата:

Сообщение от vflash
если говорить философски то я считаю что логика всегда линейна.

А я так не считаю.
Цитата:

Сообщение от vflash
a=2;b=4;c=a+b;

Далеко пойдешь.

x-yuri 13.07.2010 00:21

Цитата:

Сообщение от vflash
А порой в этом нет необходимости если логика линейна, след. и разбивать нет смысла.

это не единственная причина для разбиения на функции. Точнее я даже не знаю как линейность логики связана с разбиением на функции

Цитата:

Сообщение от vflash
если говорить философски то я считаю что логика всегда линейна.

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

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

что вообще такое линейная логика? Линейный алгоритм - алгоритм без циклов и ветвлений. И вот функции как раз могут скрыть нелинейность алгоритма, только нелинейность при чем...

e1f 13.07.2010 12:00

Цитата:

Сообщение от vflash (Сообщение 63409)
e1f, http://vflash.ru/work/pre_wrap.html - не совсем тот.

Пилять. Тогда я напишу так:
pre {
    white-space: -moz-pre-wrap; /* Mozilla, supported since 1999 */
    white-space: -pre-wrap; /* Opera 4 - 6 */
    white-space: -o-pre-wrap; /* Opera 7 */
    white-space: pre-wrap; /* CSS3 - Text module (Candidate Recommendation) [url]http://www.w3.org/TR/css3-text/#white-space[/url] */
    word-wrap: break-word; /* IE 5.5+ */
}


Я о том, что для IE тоже можно реализовать нормальный prewrap с помощью css, без идиотских танцев с n2br.

vflash 13.07.2010 13:16

e1f, еше рас посмотрите на тест, специально для вас добавил ваше правило. сравните как блок выглядит в FF и как в IE6.

e1f 13.07.2010 14:23

А теперь заверните вместо div'а в pre ;)

vflash 13.07.2010 15:04

чуда не произошло

e1f 13.07.2010 15:09

vflash, Вы уверены? В pre все отбражается именно так, как нужно -- с учетом форматирования. Чуду быть!

vflash 13.07.2010 15:22

в итоге весь фокус был в "\r" и след возвращаясь к сути для IE<8 осталось необходимость замена "\n" уж не на <br> а на "\r\n".

еше все что Opera<9 уже стоит забыть. а уж про Mozilla которая была до Firefox тем более

e1f 13.07.2010 15:53

Цитата:

Сообщение от vflash (Сообщение 63524)
в итоге весь фокус был в "\r" и след возвращаясь к сути для IE<8 осталось необходимость замена "\n" уж не на <br> а на "\r\n".

еше все что Opera<9 уже стоит забыть. а уж про Mozilla которая была до Firefox тем более

Хм. Ну объясните мне, нафига замена-то? Я не понимаю чего-то?
А что это за Mozilla такая, что до Firefox? Phoenix? Oo

x-yuri 13.07.2010 16:19

ну в общем-то, чем больше хочешь, тем больше нужно browser detection. Вопрос в том, стоит ли хотеть так много...

vflash 13.07.2010 21:28

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

---
Добавил и обновил букмарклет. можно как весь HTML(открытой страницы) преобразовать в js-код так и часть если указать hash url#id:ид_элемента
Обновил код и добавил _.html() , выложил в SVN http://code.google.com/p/rr2jquery/


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