Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Библиотечка . (https://javascript.ru/forum/project/6025-bibliotechka.html)

x-yuri 30.01.2010 10:38

или получить в глаз ;)

e1f 30.01.2010 11:16

:) Вариант, но не факт, что от этого перепишутся готовые либы ;)

PeaceCoder 30.01.2010 20:56

Цитата:

Сообщение от e1f
Вы еще маме того стороннего разработчика пойдите нажалуйтесь. Ну как ребенок, честно

причем тут ребенок? мне вообще чхать на того кто так пишет. я лично если вижу такой код, то с таким сайтом дело не имею. раз.
Цитата:

Сообщение от e1f
как на уже готовый сайт добавить новый функционал, не переделывая старый под угрозой получения в глаз.

Если сайт написан так как описал Колай, в глаз вы получите полюбому как не крути. два.

или ТРИ. Выловить начало перекрытия стандартных методов и занести их в переменнные свои. Но это как говорится будет каша в коде и с каждым новым изменением сайт будет... короче сайтом должен заниматься Первый разработчик.

Kolyaj 30.01.2010 21:42

Цитата:

Сообщение от PeaceCoder
Если сайт написан так как описал Колай, в глаз вы получите полюбому как не крути. два.

Ну почему же. У меня на решение вышеописанной проблемы ушло полторы минуты после того, как нашёл за полтора часа :) Потому что у меня в данном скрипте свои функции, которые я знаю, каким образом можно переписывать. Если бы использовалась jQuery, то она бы покрылась слоем костылей.

Цитата:

Сообщение от PeaceCoder
Выловить начало перекрытия стандартных методов и занести их в переменнные свои.

Невозможно.

Но ещё раз повторю, данная библиотечка к тому скрипту отношения не имеет, там весь код заточен под конкретную задачу.

P.S. Коляй, кстати )))

PeaceCoder 30.01.2010 21:54

Цитата:

Сообщение от Kolyaj
ушло полторы минуты после того, как нашёл за полтора часа

в этом и проблема. это одна "фича" сайта. а если пол сайта? сколько времени вы убьете что бы исправить за пару минут одну из "фич" ?

П.С. к библитечке не имею притензий.

Kolyaj 30.01.2010 22:11

Цитата:

Сообщение от PeaceCoder
в этом и проблема. это одна "фича" сайта. а если пол сайта? сколько времени вы убьете что бы исправить за пару минут одну из "фич" ?

Мне за это деньги платят, чтобы мой скрипт работал на таких вот кривых сайтах, владельцы которых платят деньги за использование этого скрипта. Так что лично у меня претензий нет :) В конце концов это, как минимум, интересно: найти баг на сайте, который сам по себе работает нормально, но твой скрипт на нем не работает, при этом доступа к сайту ты не имеешь.

x-yuri 04.02.2010 03:34

function $$(selector, options) {
...
var value = typeof options.map == 'function' ? options.map.call(options.scope, el, [B]j++[/B]) : el;
...
reduceValue = reduceInitialized ? options.reduce.call(options.scope, reduceValue, value, [B]j++[/B]) : value;

а это так и надо?

UPD: и почему такой странное поведение с options.reduce: "Если параметр reduceInit не указан, то для первого найденного элемента reduce не вызывается." Можно какие-нибудь примеры использования?

UPD 2: по поводу более важных замечаний... вынес в отдельную тему

Kolyaj 04.02.2010 13:00

Цитата:

Сообщение от x-yuri
а это так и надо?

Это баг, спасибо.

Цитата:

Сообщение от x-yuri
"Если параметр reduceInit не указан, то для первого найденного элемента reduce не вызывается."

Если reduceInit не указан, то им становится первый элемент. Это стандартное поведение.

Цитата:

Сообщение от x-yuri
Можно какие-нибудь примеры использования?

Использования reduce? Искусственный пример: сумма значений всех input[type=text] на странице (не запускал)
alert($$('input', {
    filter: function(el) {
        return el.type == 'text';
    },
    map: function(el) {
        return parseInt(el.value) || 0;
    },
    reduce: function(sum, value) {
        return sum + value;
    }
}));


Читабельность данной функции меня самого не радует, но пока не придумал, как лучше переписать.

x-yuri 04.02.2010 15:36

Цитата:

Сообщение от Kolyaj
Использования reduce? Искусственный пример: сумма значений всех input[type=text] на странице (не запускал)

а, т.е. сначала мэппим элементы в значения... Имхо, лучше всегда вызывать для каждого элемента, т.е. что-то типа
alert($$('input', {
    filter: function(el) {
        return el.type == 'text';
    },
    reduce: function(sum, el) {
        return sum + parseInt(el.value) || 0;
    }
}));

может и реализация проще станет

Цитата:

Сообщение от Kolyaj
Читабельность данной функции меня самого не радует, но пока не придумал, как лучше переписать

а идеи из соседней темы тебе не нравятся?

Kolyaj 04.02.2010 16:08

Цитата:

Сообщение от x-yuri
Имхо, лучше всегда вызывать для каждого элемента, т.е. что-то типа

Для такого случая как раз нужно указывать reduceInit: 0, т.к. иначе в первой итерации sum будет равна ссылке на элемент. По сути можно и условие из filter туда же засунуть, это на любителя, я предпочитаю разбивать задачи на более мелкие более простые подзадачи.

Цитата:

Сообщение от x-yuri
а идеи из соседней темы тебе не нравятся?

Это библиотечка, т.е. код с высокой реюзабельностью, поэтому для данного кода я ищу компромисс "эффективность кода -- максимально малый размер -- приемлемая читабельность" (в порядке убывания важности). Твой первый вариант без документации больше, чем мой с документацией. Со вторым вариантом проблема другая: там нужно сначала преобразовать NodeList в массив (раз проход), применить filter (два проход), применить map (три проход), reduce (четыре проход). (Хотя от первого прохода можно избавиться.) А эта функция для того и писалась, чтобы можно было выдернуть любую (почти) информацию из DOM-дерева за один проход.

x-yuri 04.02.2010 17:25

Цитата:

Сообщение от Kolyaj
Для такого случая как раз нужно указывать reduceInit: 0, т.к. иначе в первой итерации sum будет равна ссылке на элемент. По сути можно и условие из filter туда же засунуть, это на любителя, я предпочитаю разбивать задачи на более мелкие более простые подзадачи.

подожди, я имел в виду с другой реализацией
var reduceValue = options.reduceInit;
for( var i=0, j=0; i<els.length; i++ ) { 
...
        if( options.reduce ) 
            reduceValue = options.reduce.call( options.scope, reduceValue, el, j );

и реализация стала проще. Можно добавить еще значение по умолчанию 0/пустая строка/whatever

Цитата:

Сообщение от Kolyaj
Это библиотечка, т.е. код с высокой реюзабельностью, поэтому для данного кода я ищу компромисс "эффективность кода -- максимально малый размер -- приемлемая читабельность"

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

Ну и я не говорил, что нужно воспринимать тот код, как готовые решения. Можно, например, просто парсинг селекторов вынести

Kolyaj 04.02.2010 17:33

Цитата:

Сообщение от x-yuri
я имел в виду с другой реализацией

Все-таки лучше оставить стандартное для reduce поведение, чтобы не путаться.

Цитата:

Сообщение от x-yuri
а размер зачем?

Хм, ну чтоб меньше был.

Цитата:

Сообщение от x-yuri
А как ты решения принимаешь? На глаз?

Разумеется всё сугубо субъективно и по настроению. Наутро встану -- перепишу :) Обсудить-то мне это не с кем :)

x-yuri 05.02.2010 08:36

Цитата:

Сообщение от Kolyaj
Разумеется всё сугубо субъективно и по настроению. Наутро встану -- перепишу

вот это мне и не нравиться. Ты ставишь читабельность на третье место, не зная, что это тебе дает на практике

Kolyaj 05.02.2010 08:55

Цитата:

Сообщение от x-yuri
вот это мне и не нравиться.

Ну для себя-то у меня всё обосновано, а больше мне некому обосновывать. Если хочешь, можешь форк сделать, а там и смержим что-нибудь :)

Цитата:

Сообщение от x-yuri
Ты ставишь читабельность на третье место

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

Цитата:

Сообщение от x-yuri
не зная, что это тебе дает на практике

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

x-yuri 05.02.2010 16:30

Цитата:

Сообщение от Kolyaj
Если хочешь, можешь форк сделать, а там и смержим что-нибудь

да я уже немного попробовал, пока что ты смержил только баг ;) Ну понятно, в общем-то, проиритеты разные. А вообще, хочу позже что-нибудь выложить. Пока рано

Octane 18.04.2010 18:35

Метод clone в http://alljs.ru/crossjs/source/lang/Array.js правильно работает только с одномерными массивами. Так и задумано?
var array1 = [[]];
var array2 = array1.slice(0);
alert([
    array1 === array2,
    array1[0] === array2[0]
]);

Kolyaj 18.04.2010 20:33

Цитата:

Сообщение от Octane
Так и задумано?

Да я, честно говоря, и не задумывался об этом ))

stopkran 10.09.2010 18:34

В файле Element.js в функции M.removeClass используется регэксп:

new RegExp('($|\\s)' + cl + '(?=\\s|$)', 'g')

Вероятно, в первой скобке вместо доллара должна быть крышка (^)?

Kolyaj 10.09.2010 21:39

stopkran,
спасибо, поправил. Неприятный баг.

stopkran 12.09.2010 07:43

А вот и небольшая критика M.addClass: http://ir2.ru/show-hide-toggle.aspx (там больше критики obj.style.display = "none", поэтому отдельная статья)

Kolyaj 12.09.2010 22:34

Про критику addClass понял, у меня получается лицемерно: при removeClass проверка на reflow есть, при addClass -- нет :)

tenshi 13.09.2010 00:13

лучше распарсить строку во множество, отредактировать и потом сериализовать

stopkran 13.09.2010 10:28

Следующий вопрос: почему нельзя просто проверять
obj instanceof Array

(почему используете
Object.prototype.toString.call(obj) == '[object Array]') ?

Riim 13.09.2010 11:23

Цитата:

Сообщение от stopkran
почему нельзя просто проверять

можно, если рассчитываете, что не будете использовать iframe и window.open (или будете использовать редко и обдумано).

Kolyaj 13.09.2010 11:48

Цитата:

Сообщение от tenshi
лучше распарсить строку во множество, отредактировать и потом сериализовать

Лучше == быстрее?

Цитата:

Сообщение от stopkran
почему нельзя просто проверять
obj instanceof Array

http://alljs.ru/articles/array/noarray.html

tenshi 14.09.2010 00:31

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

рони 14.09.2010 04:20

на тему добавить удалить класс )))
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
<style type="text/css">
.Green{
  color: #FF0000;
}
.green{
   background-color: #008000;
}
</style>
</head>
<body>  <div   class="Green"  onclick="addclass(this,'green');addclass(this,'Green');addclass(this,'green');alert(this.className+' '+this.className.length);">12345</div>
<script language="JavaScript" type="text/javascript">
function delclass(obj, c) { obj.className = obj.className.replace(RegExp('(\\s+|^)' + c + '(\\s+|$)', 'g'), " ").replace(/^\s+|\s+$/,'')}
function addclass(obj, c) { delclass(obj, c); obj.className += " " + c}
</script>
</body>
</html>

Kolyaj 14.09.2010 09:09

рони,
а это о чём?

рони 14.09.2010 12:12

Kolyaj,
о примере удаления добавления класса расположенного http://ir2.ru/show-hide-toggle.aspx
наверно нужно было там и писать.
основной момент это использование в проверке там флага i что приведёт к недобавлению скажем класса Green при наличии класса green.
И ещё почему бы при добавлении класса не тестировать его наличие а просто удалять если он есть. ну и немного с пробелами чтоб они не копились
replace(/^\s+|\s+$/, '');

Kolyaj 14.09.2010 12:17

Цитата:

Сообщение от рони
И ещё почему бы при добавлении класса не тестировать его наличие а просто удалять если он есть.

Так будет лишняя перерисовка страницы.

рони 14.09.2010 13:32

Kolyaj, тогда такой момент - приоритет имеет последний добавленный класс и если я какой либо класс уже использовал, мне его наверно нужно перенести в конец чтоб он точно сработал, а не был затёрт другими классами.то есть я опять же должен в начале удалить а потом добавить или как?

Kolyaj 14.09.2010 13:54

Цитата:

Сообщение от рони
приоритет имеет последний добавленный класс

<style>
.red { color: red; }
.green { color: green; }
</style> 
<div class="green red">asldkfjalkdfjdasklfj akljsd flkajdflkajdf</div>


Порядок классов не имеет значения.

рони 14.09.2010 17:35

Kolyaj,
ок)

with-love-from-siberia 26.09.2010 13:36

http://github.com/Kolyaj/CrossJS/blo...rce/Element.js
.addClass() намеренно не проверяет существование класса у объекта?

Там же. .addClass() и .removeClass () как-бы несимметричны:
а) первая может вернуть как строковое значение, так и DOM-объект
б) вторая всегда возвращает объект

Kolyaj 26.09.2010 15:33

Цитата:

Сообщение от with-love-from-siberia
.addClass() намеренно не проверяет существование класса у объекта?

http://javascript.ru/forum/70600-post61.html. Руки не доходят просто.

Цитата:

Сообщение от with-love-from-siberia
Там же. .addClass() и .removeClass () как-бы несимметричны:

Это баг, спасибо.

x-yuri 27.09.2010 16:07

Цитата:

Сообщение от tenshi
когда потребуется сделать циклическую смену классов или по хешу или ещё как-нибудь

tenshi, а что такое циклическая смена классов? И по хэшу - это как? Хотя код рискует получится проще, понятнее в результате...

Riim 27.09.2010 16:20

Цитата:

if (document.cookie.match(new RegExp('(?:^|;\\s*)' + name + '=([^;]*)(?=;|$)'))) {
кусок `(?=;|$)` выглядит явно лишним. И test вместо match напрашивается.

Kolyaj 27.09.2010 16:43

Цитата:

Сообщение от Riim
кусок `(?=;|$)` выглядит явно лишним.

И правда лишний.

Цитата:

Сообщение от Riim
И test вместо match напрашивается.

А match нужен для следующей строчки.

Riim 27.09.2010 18:25

Цитата:

Сообщение от Kolyaj
А match нужен для следующей строчки

RegExp.$1 вроде и при test заполняется:
/(\w+)/.test('++text++');
alert(RegExp.$1);

tenshi 28.09.2010 00:47

циклическая мена:

foded -> snippet -> opened -> folded -> ...

по хэшу:

var stepMap= { home: 'contacts', contacts: 'home', support: 'home' }
var nextStep= stepMap[ currentStep ]


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