$ (This) в jQuery не является переменной цикла? - PullRequest
4 голосов
/ 21 июня 2010

Следующее поместит id имя каждого div внутри div в качестве содержимого:

        <div id="divDiv">

        </div>

        <div id="divLink">

        </div>
[...]

$('div').each(function() { $(this).prepend($(this).attr('id')) })

будет работать, но

$('#divStatus div').prepend($(this).attr('id'))

не будет. Это почему? Я думал, $ (это) переменная цикла? Есть ли способ сделать выше, не используя each()?

Ответы [ 6 ]

3 голосов
/ 21 июня 2010

Хорошо, подумайте об этом с точки зрения обычного языка программирования (который есть, потому что это JavaScript).Вы вызываете метод "prepend" для объекта some_object_here.

Какие параметры вы говорите механизму JavaScript для передачи в метод ДО ЗАПУСКА ЭТОГО ?Ответ прост: вы говорите JavaScript немедленно оцените значение "$ (this) .attr ('id')" и затем передайте это в метод.

Причина, по которой вы получаете желаемый результат с «каждым», заключается в том, что вы передаете функцию, которая будет оценена позже, когда контекст сообщает движку JavaScript, что «это» означает текущий объект (который при этомвремя - это фактическое деление).

2 голосов
/ 21 июня 2010

при использовании .each вы передаете функцию в качестве аргумента.jQuery проверяет правильность this в своем контексте.

При вызове .prepend($(this).attr('id')) JavaScript оценивает идентификатор перед вызовом prepend .Если вы находитесь в $(document).ready, и у документа нет идентификатора, это то же самое, что и вызов .prepend("");.

1 голос
/ 21 июня 2010

$(this) - это просто оболочка jquery для текущего используемого объекта.

И в первом примере вы перебираете объекты и можете получить доступ к this, , но во втором примере вы получите коллекцию объектов, и вы не можете использовать this непосредственно вих.

См. Это ключевое слово

0 голосов
/ 21 июня 2010

Это называется замыканием , к сожалению, другие ответы не содержат этого очень важного ключевого слова.Я рекомендую прочитать этот вопрос: Как работает закрытие javascript? и эта статья .

.each() создает закрытие, .prepend(), если вы не передаете функцию, нет, , хотя для решения вашей текущей проблемы может потребоваться функция , например:

$('#divStatus div').prepend(function() {
  return $(this).attr('id'); //or this.id if you're sure it has one
});

Внутри этих замыканий this относится к элементу в массиве, в котором вы находитесь , вне их - к любому контексту, в котором вы находитесь, например:

$(function() { //short for $(document).ready(function() {
  $('#divStatus div').prepend($(this).attr('id')) //this refers to document
});

AОбъект jQuery является массивом внутри, массивом ссылок на элементы DOM, независимо от того, находит ли их селектор, добавляет вручную и т. д. Функции, выполняющие эти циклы, либо .each()или передача функции различным другим, .prepend(), .attr(), .css() и т. д. - все они создают замыкания, в которых this относится кэлемент в массиве, в котором вы находитесь в данный момент при циклическом просмотре.

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

0 голосов
/ 21 июня 2010

В тот момент, когда вы используете 'this', 'this', это группа элементов как массив / объект, поэтому вам действительно нужно использовать:

$('#divStatus div')[0]

или

$('#divStatus div').get(0)

чтобы получить первый элемент в массиве. Вы должны увидеть, что это такое, используя console.log (this) в firebug.

0 голосов
/ 21 июня 2010

Try:

.prepend(function(idx, element){


})

.prepend (function (index, html)) function (index, html) Функция, которая возвращает строку HTML для вставки в начале каждого элемента внабор согласованных элементов.Получает позицию индекса элемента в наборе и старое значение HTML этого элемента в качестве аргументов.

Кроме этого, я не вижу, как можно перебирать элементы, используя $ (this) объект без фактического источника итерации.

...