Какие неприятности jQuery я должен знать как пользователь Prototype? - PullRequest
6 голосов
/ 03 февраля 2009

Мы рассматриваем возможность переключения нашего сайта с Prototype на jQuery. Будучи слишком знакомым с Prototype, я хорошо осведомлен о вещах, касающихся Prototype, которые я нахожу ограничивающими или раздражающими.

Мой вопрос для пользователей jQuery: после некоторой работы с jQuery что вас расстраивает? Есть ли в jQuery что-то, что заставляет задуматься о переключении (назад) на Prototype?

Ответы [ 8 ]

6 голосов
/ 03 февраля 2009

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

3 голосов
/ 03 февраля 2009

Вероятно, единственная реальная проблема, с которой я когда-либо сталкивался, это проблемы $ (this) области видимости. Например, если вы делаете вложенные элементы цикла над элементами и подэлементами, используя встроенную функцию JQuery .each (), на что ссылается $ (this)? В этом случае он относится к самой внутренней области, как и должно быть, но это не всегда ожидается.

Простое решение состоит в том, чтобы просто кэшировать переменную $ (this) перед углублением в цепочку:

$("li").each(function() {
    // cache this
    var list_item = $(this);
    // get all child a tags
    list_item.find("a").each(function() {
        // scope of this now relates to a tags
        $(this).hide("slow");
    });
});
2 голосов
/ 04 февраля 2009

Я не думаю, что есть какие-то настоящие ошибки или даже какие-то неприятности. Другие ответы здесь, кажется, подтверждают это - проблемы вызваны просто немного другим API и другим стилем кодирования JavaScript, который поощряет jQuery.

Я начал использовать Prototype пару лет назад и нашел это откровением. Такой мощный, такой элегантный. Через несколько месяцев я опробовал jQuery и обнаружил, что такое сила и элегантность. Я не помню никаких раздражений. Сейчас я снова работаю над проектом с использованием Prototype, и это похоже на шаг назад (честно говоря, мы используем Prototype 1.5.1).

Если вы поменяли вопрос - «О каких раздражениях прототипа я должен знать как пользователь jQuery?» - вы получите гораздо больше ответов.

2 голосов
/ 03 февраля 2009

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

$('.myDiv').append($('<ul />').append($('<li />').text('content')));

Моя другая распространенная проблема связана с использованием JSON в jQuery, я всегда пропускаю последнюю запятую,

$('.myDiv').tabs({ option1:true, options2:false(, woops)});

Наконец, я использую jQuery уже около 6 месяцев и не думаю, что когда-нибудь вернусь к прототипам. Я очень люблю jQuery, и многие трюки, которые они используют, помогли мне многому научиться. один крутой трюк, который мне нравится, это использование строковых литералов для вызовов методов, я никогда не делал этого слишком много с прототипами.

$('.myDiv')[(add ? 'add' : 'remove') + 'Class']('redText');
2 голосов
/ 03 февраля 2009

(Единственное, о чем я могу думать, это то, что это элемент вместо объекта jQuery в $("...").each(function) -коллсах, так как $(element) чаще используется, чем просто элемент. И эта крайне незначительная вещь о это.

Пример вышеизложенного (упрощенно, и я знаю, что есть и другие, гораздо лучшие способы сделать это, я просто сейчас не могу придумать лучшего примера):

// Make all divs that has foo=bar pink.
$("div").each(function(){
  if($(this).attr("foo") == "bar"){
    $(this).css("background", "pink");
  }
});

each - это функция, которая принимает функцию в качестве параметра, эта функция вызывается один раз для каждого соответствующего элемента. В переданной функции this относится к фактическому DOM-элементу браузера, но я обнаружил, что вам часто захочется использовать некоторую функцию jQuery для каждого элемента, поэтому приходится использовать $(this). Если бы для этого значения было установлено значение $(this), вы получили бы более короткий код и все равно могли бы получить доступ к объекту элемента DOM, используя this.get(0). Теперь я вижу причину того, что все так, как есть, а именно, что написание $(this) вместо этого вряд ли так громоздко, и в случае, если вы можете делать то, что вы хотите, с элементом DOM, то, как он быстрее, чем так, как могло бы быть, и другой путь не был бы быстрее, если вы хотите $(this).)

1 голос
/ 03 февраля 2009

Неа. Нада. Nyet.

0 голосов
/ 04 февраля 2009

Это действительно только раздражение, если вы делаете много манипуляций с DOM. PrototypeJs автоматически добавляет свой API в DOM Elements, так что это работает в prototypejs (jQuery, конечно, этого не делает):

var el = document.createElement("div");
el.addClassName("hello"); // addClassName is a prototypejs method implemented on the native HTMLElement

Даже без запуска собственного элемента через функцию $ ().

PS: следует помнить, что в IE это не работает.

0 голосов
/ 03 февраля 2009

.each:

jQuery (вам нужен индекс, даже если вы его не используете):

$.each(collection, function(index, item) {
  item.hide();
});

Прототип (вы обычно используете элемент, поэтому вы можете опустить индекс):

collection.each(function(item) {
  item.hide();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...