Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Прототип библиотеки jNext (https://javascript.ru/forum/project/24387-prototip-biblioteki-jnext.html)

FINoM 30.12.2011 15:40

Цитата:

Сообщение от devote
неужели так сложно понять что дело не в скорости.

Ок. Прочесть то что чуть ниже никак?

x-yuri 30.12.2011 16:06

Цитата:

Сообщение от FINoM
Нравится из-за того, с ней я могу сделать почти всё, не прибегая к нативным средствам браузера, не трахаясь с кроссбраузерностью.

очень распространенное заблуждение, либо у тебя задачи такие, подходящие

Цитата:

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

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

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

Цитата:

Сообщение от FiNOM
Тогда будет больше кода, а производительность не сильно изменится (при одном элементе будет одна итерация цикла).

насколько больше?

FINoM 30.12.2011 16:32

Цитата:

Сообщение от x-yuri
насколько больше?

На одну проверку больше: один элемент, делаем это, больше — делаем то.
Цитата:

Сообщение от x-yuri
не вижу в этом необходимости

Ну вот человек ошибся в селекторе, срипт выдал экзепшн "синтакс эррор" и фиг поймешь, в какой строке и к чему относится этот экзепшн. Так ему просто в консоли сообщать: с селектором трабл. Или другая ситуация: селектор вернул 0 элементов, человек применяет цепочку методов, но ничего не происходит. Что делать? Мне кажется вполне логичным написать в консоли, что элементов ноль, и что ничего происходить не должно.

Octane 30.12.2011 17:41

Цитата:

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

Ну как же, когда мы пишем на чистом JS:
document.querySelector("#btn").className += "active";

то получим
Цитата:

TypeError: document.querySelector("#btn") is null
фреймворк просто сокращает запись:
$("#btn").addClass("active");

почему мы не должны ждать такой же ошибки?

а вот, когда работаем с коллекцией, то отсутствие ошибок вполне логично:
var list = document.querySelectorAll(".btn"), i = list.length;
while (i--) {
    …
}

или
$(".btn").addClass("active")

тут программист берет в расчет, что элементов в коллекции может и не быть, и никакие действия не выполнятся, что на чистом JS, что с помощью jQuery.

Чтобы избежать этой проблемы, предлагаю не страдать фигней в погоне за совместимостью с jQuery, а сделать, как мне кажется, более удобно:

function $(selector) {
    return new $Node(document.querySelector(selector));
}

function $$(selector) {
   return new $NodeList(document.querySelectorAll(selector));
}

function $Node(node) {
   this.node = node;
}

$Node.prototype = {
   addClass: …,
   …
   remove: …,
   …
   parent: …,
   …
};

function $NodeList(list) {
   this.list = list;
}

$NodeList.prototype = {
   first: …,
   …
   last: …,
   …
   each: …,
   …
};

никакого дублирования методов не нужно:
$$("selector").each("method", arguments)

и в коде будет наглядно:
$(selector).remove();
$$(selector).each("remove")

float 30.12.2011 18:00

Цитата:

то получим
Цитата:

почему мы не должны ждать такой же ошибки?
потому, что имхо это чуть разные вещи.
в случае с querySelector это лишь возврат функции которая может возвращать объекты разных типов(что в общем-то наверное не совсем правильно).
когда мы работаем с выборкой, то хочется единого АПИ в независимости есть в выборке элементы или нет(в конце концов это просто состояние объекта)
на практике позволяет в клиентском коде избегать ненужных if-в.

ЗЫ про style сенкс. не догадывался что есть такая особенность.

float 30.12.2011 18:19

а вообще тс странный. и вступительная речь тоже.
мне например чтобы перевести своё детище на поддержку только "правильных" браузеров понадобиться ну час мб. jquery ну пускай день два.
Лично мне видится её главным недостатком(ну по крайней мере сейчас, когда я не спал сколько там... 22 часа) - сверх универсальность. Под конкретные задачи можно сделать лучше. Иногода это критично.
Посему к тсу - чтобы делать свой ворк/библиотеку нужен какой-то мотиватор, какая-то задача. Без этого быстро надоест.

FINoM 30.12.2011 18:21

float, чем не задача сделать либу быстрее, чем jQuery, но с совместимостью кода?

FINoM 30.12.2011 18:31

В общем эта тема превращается в срач, один предлагает поддерживать старые версии ИЕ и критикует сообщения прочитав только половину, другой говорит, что нужно создать отдельные методы для одиночиых элементов, по сути отдельную библиотеку, третий обзывает меня странным, при этом сказав, что за пару часов перепишет jQuery, сделав то же самое что и я. Остальным спасибо за помощь. Если что-то будет готово, сообщу. В срачах учавствовать не буду. На всякий случай, по совету melky запилю на гитхаб после нормальной реализации метода animate.

devote 30.12.2011 18:37

Цитата:

Сообщение от FINoM
Ок. Прочесть то что чуть ниже никак?

И что мне твое ниже даст?

пример:
<style>
div {
    width: 200px;
    height: 200px;
}
</style>
<div id="owner">
    <div id="child"></div>
</div>
 
<script>

function yourStyle( elem, prop ) {
    return elem.style[prop] ||
                    elem.ownerDocument.defaultView.getComputedStyle( elem, null ).getPropertyValue( prop );
}
 
function style( elem ) {
    if ( elem.ownerDocument && elem.ownerDocument.defaultView ) {
        return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
    } else if ( elem.currentStyle ) {
        return elem.currentStyle;
    }
    return null;
}

var elem = document.getElementById('owner');

// проверяем твоей:
alert( [ yourStyle( elem, 'width' ), yourStyle( elem, 'height' ) ] );
// проверяем моей:
alert([ style( elem ).width , style( elem ).height ]);


// меняем ширину у элементов:
document.getElementById( 'owner' ).style.width = "auto";
document.getElementById( 'child' ).style.width = "300px";


// снова проверяем родителя:

// проверяем твоей:
alert( [ yourStyle( elem, 'width' ), yourStyle( elem, 'height' ) ] );
// проверяем моей:
alert([ style( elem ).width , style( elem ).height ]);


</script>

x-yuri 30.12.2011 18:56

Цитата:

Сообщение от FINoM
На одну проверку больше: один элемент, делаем это, больше — делаем то.

выводы о значительности каждый делает сам... учитывая то, что "один элемент, делаем это" - это частный случай "больше — делаем то"

Цитата:

Сообщение от FINoM
Ну вот человек ошибся в селекторе, срипт выдал экзепшн "синтакс эррор" и фиг поймешь, в какой строке и к чему относится этот экзепшн. Так ему просто в консоли сообщать: с селектором трабл. Или другая ситуация: селектор вернул 0 элементов, человек применяет цепочку методов, но ничего не происходит. Что делать? Мне кажется вполне логичным написать в консоли, что элементов ноль, и что ничего происходить не должно.

опять абстрактные примеры? Обычно ты делаешь и проверяешь по ходу. И даже потом не сложно найти ошибку. Если сложно, тогда да, надо ее выдавать.

Цитата:

Сообщение от Octane
почему мы не должны ждать такой же ошибки?

вопрос не в последовательности а в том, будет ли это заметной помощью

Цитата:

Сообщение от Octane
Чтобы избежать этой проблемы, предлагаю не страдать фигней в погоне за совместимостью с jQuery, а сделать, как мне кажется, более удобно:

недостаток этого метода в том, что надо проверять существует ли объект: [jQuery] $('#id').addClass(...), [твой вариант] $('#id') && $('#id').addClass(...) ну или $$('#id').addClass(...), но тогда мы используем $$, несмотря на то, что нас интересует один элемент. Недостаток jQuery в том, что если надо получить доступ к этому одному элементу, надо писать $('#id')[0], вместо $('#id'). Может что-то забыл.

Цитата:

Сообщение от float
Посему к тсу - чтобы делать свой ворк/библиотеку нужен какой-то мотиватор, какая-то задача. Без этого быстро надоест.

хуже, я бы сказал, что библиотеки должны получаться в результате решения задач, а не наоборот ;)

Цитата:

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

"Вы мне, пожалуйста, все тут давайте советы, но если они мне не понравяться, я вас слушать не буду, так что не обижайтесь..."


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