Показать сообщение отдельно
  #34 (permalink)  
Старый 30.12.2011, 17:41
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от 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")
Ответить с цитированием