Какая разница между:
$(this.el).html
и
this.$el.html
Считывание нескольких примеров магистра, а некоторые делают это одним и тем же способом.
Какая разница между:
$(this.el).html
и
this.$el.html
Считывание нескольких примеров магистра, а некоторые делают это одним и тем же способом.
$(this.el)
обертывает элемент с помощью jQuery (или Zepto). Итак, если ваш HTML-код выглядит следующим образом:
<div id="myViewElement"></div>
... и this.el
ссылаются на div, тогда $(this.el)
будет эквивалентом получения его непосредственно через jQuery: $('#myViewElement')
.
this.$el
- это кешированная ссылка на объект jQuery (или Zepto), поэтому копия того, что вы получили бы от вызова $(this.el)
. Цель состоит в том, чтобы избавить вас от необходимости называть $(this.el)
, что может иметь некоторые накладные расходы и, следовательно, проблемы с производительностью.
Обратите внимание: оба не эквивалентны. this.el
только является ссылкой на объект-объект HTMLElement - не задействованы библиотеки. Это возврат document.getElementById
. $(this.el)
создает новый экземпляр объекта jQuery/Zepto. this.$el
ссылается на один экземпляр первого объекта. Нельзя использовать какой-либо из них, если вы понимаете стоимость нескольких вызовов $(this.el)
.
В коде:
this.ele = document.getElementById('myViewElement');
this.$ele = $('#myViewElement');
$('#myViewElement') == $(this.ele);
Кроме того, стоит упомянуть, что jQuery и Zepto имеют частичные внутренние кеши, поэтому дополнительные вызовы $(this.el)
могут в конечном итоге вернуть кешированный результат, и поэтому я говорю "может иметь проблемы с производительностью". Это также не может быть.
Documentation
view.$el
- http://backbonejs.org/#View-$el$
в магистрали - http://backbonejs.org/#View-dollarЭти два существенно эквивалентны, причем $el
является кэшированной версией объектов jQuery или Zepto el
, причина почему вы видите примеры с использованием $(this.el)
, потому что он был добавлен только в более поздний выпуск backbone.js(0.9.0).
* Технически, как Chris Baker указывает, что $(this.el)
будет (возможно) создавать новый объект jQuery/Zepto каждый раз, когда вы его вызываете, пока this.$el
будет ссылаться на один и тот же каждый раз.
Если $el
существует в this
и является объектом jQuery, вы не должны использовать $(this.el)
, потому что он будет инициализировать новый объект jQuery, если он уже существует.
Они дают точно то же самое; то есть ссылку на элемент вида. $el - это просто оболочка jquery для $(this.el). Посмотрите на эту ссылку: http://documentcloud.github.com/backbone/#View- $el
Я обычно вижу это:
var markup = $(this).html();
$(this).html('<strong>whoo hoo</strong>');
Я согласен с Раминоном. Ваши примеры, которые вы видели, выглядят неправильно.
Этот код обычно отображается в цикле jquery, например, каждый() или обработчик событий. Внутри цикла переменная 'el' указывает на чистый элемент, а не на объект jQuery. То же самое верно для 'this' внутри обработчика событий.
Когда вы видите следующее: $(el) или $(this), автор получает ссылку jQuery на объект dom.
Вот пример, который я использовал для преобразования чисел в римские числа: (Заметьте, я всегда использую jQuery вместо $- слишком много коллизий с mootools...)
jQuery(document).ready(function(){
jQuery('.rom_num').each(function(idx,el){
var span = jQuery(el);
span.html(toRoman(span.text()));
});
});
Обтекание элемента в $() добавляет расширения jQuery к прототипу объекта. После этого это не нужно делать снова, хотя нет никакого вреда, кроме производительности, делая это несколько раз.