2012-03-09 2 views
1

В этой функции

template.find('.userPhoto img').error(function() { 
    $(this)[0].src = '/images/default.png'; 
}).attr('src', image); 

Я ожидал $ (это) для обозначения отдельного элемента, но это не так; вместо этого это относится к завернутому набору ... можете ли вы понять, почему?

Спасибо!

+2

Потому что это то, что означает $ (...). – asawyer

+7

FWIW, '$ (this) [0] === this' – Alnitak

+1

Откуда вы знаете, что это набор? «[0]» обращается к элементу DOM объекта jQuery, а не к первому элементу –

ответ

3

Почему $(this) имеет в виду обернутый набор вместо отдельного элемента?

Потому что кто-то не знал ничего лучшего.

В этом контексте, если вы хотите оригинальный DOM элемент, просто использовать this

С другой стороны, если вы хотите, чтобы вызвать методы JQuery на этом элементе, используйте $(this).

Поскольку все, что вы делаете, устанавливая свойство DOM элемента, вы должны использовать прежний:

template.find('.userPhoto img').error(function() { 
    this.src = '/images/default.png'; 
}).attr('src', image); 
0

Я думаю, это потому, что так что вы можете применить метод выбора и есть унифицированная API

$("a").each(function(){ 
    $(this).each(...).click(...); 
}); 
$("a").click(...); 
0

Вот как работает JQuery, это ожидаемое поведение.

$() превращает элемент DOM в объект jQuery (который претендует на массив), который представляет собой набор элементов (элементов) DOM.

В вашем ответе вам не нужно использовать $().

Поскольку this является элемент, который вы хотите, вы можете просто сделать:

template.find('.userPhoto img').error(function() { 
    this.src = '/images/default.png'; 
}).attr('src', image); 

Или вы можете сделать это:

template.find('.userPhoto img').error(function() { 
    $(this).attr('src', '/images/default.png';); 
}).attr('src', image); 

$(this).attr('src' изменит атрибут всех элементов (в вашем случае , один) в множестве.

Смежные вопросы