#jquery
#jquery
Вопрос:
Я работаю над руководством по jQuery, и есть кое-что, чего я не совсем понимаю, почему. Ниже приведен раздел, который я вырезал из руководства. Предложение, выделенное жирным шрифтом, — это та часть, которую я не понимаю и хотел бы, чтобы какой-нибудь эксперт объяснил мне это. Очень признателен!
«Очень распространенная проблема, возникающая при загрузке содержимого с помощью Ajax, заключается в следующем: при добавлении обработчиков событий в ваш документ, которые также должны применяться к загруженному содержимому, вы должны применять эти обработчики после загрузки содержимого. Чтобы предотвратить дублирование кода, вы можете делегировать функции. Пример:
function addClickHandlers() {
$("a.remote", this).click(function() {
$("#target").load(this.href, addClickHandlers);
});
}
$(документ).готово (addClickHandlers);
Теперь addClickHandlers вызывается один раз, когда DOM готов, а затем каждый раз, когда пользователь нажимает на ссылку с помощью class remote и загрузка содержимого завершается.
Обратите внимание на запрос $(«a.remote», this), он передается как контекст: для события document ready это относится к документу, и поэтому он выполняет поиск по всему документу на предмет привязок с классом remote. Когда addClickHandlers используется в качестве обратного вызова для load(), это относится к другому элементу: в примере, элементу с id target.Это предотвращает повторное применение события click к одним и тем же ссылкам, что в конечном итоге приводит к сбою.»
Ответ №1:
function addClickHandlers() {
// this is window
$("a.remote", this).click(function() {
// this is a <a class="remote">
$("#target").load(this.href, addClickHandlers);
});
}
В общем случае this
контекстом в функции является window
, если только она не вызывается с new
ключевым словом или если она вызывается как obj.method()
(в этом случае это obj
так).
Потому что вызов функции addClickHandlers()
фактически вызывает window.addClickHandlers()
, что означает, что this
значение является областью действия window
.
Где, поскольку сам jQuery будет иметь область this
, чтобы быть элементом, который вы используете внутри функций обратного вызова.
В .click(function() { ... })
this
будет ссылаться на объект, на который был нажат.
Комментарии:
1. Raynos — Спасибо за ваш ответ. Итак, когда addClickHandlers используется в качестве обратного вызова для load(), это относится к элементу с id=»target». Означает ли это, что селектор, к которому привязывается событие click, становится $(«a.remote», «#target»)?
2. @ahmoo да, это так. Он также будет повторяться вечно 😉
3. Это было то, о чем я думал изначально, но тогда я не мог сказать, чего пытается достичь фрагмент, поэтому я подумал, что, должно быть, упустил какую-то концепцию. Можете ли вы сказать, делает ли этот фрагмент что-нибудь полезное? Или это бессмысленный пример?
4. спасибо, что подтвердили это. Хороший пример действительно имеет значение. Это меня полностью смутило.
Ответ №2:
Почему вы не можете просто выполнить live()
привязку обработчика, вот так:
$('#target .elements').live('click', function() {
...
});
Комментарии:
1. потому что
live
злой и ленивый.