jQuery - родитель "это" - PullRequest
       3

jQuery - родитель "это"

8 голосов
/ 09 июня 2011
$('form').each(function(){
  var form = this;
  $('a', this).click(function(){ form.submit(); });
});

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

В функции $ .ajax есть параметры context, которые позволяют вам делать что-то подобное.

Ответы [ 5 ]

7 голосов
/ 09 июня 2011

Нет, вы сделали это наилучшим образом.Конвенция предлагает использовать это:

var that = this;
$('a', this).click(function(){ that.submit(); });
2 голосов
/ 09 июня 2011

Во-первых, ваш пример верен, а во-вторых, так будет делать большинство людей. Здесь нет ключевого слова, просто поменять направление и пройти DOM для наиболее вероятного родителя (что глупо, так как вы его уже нашли, верно?). В таком случае я бы порекомендовал промежуточную переменную, даже если другие ответчики правильно показали, как использовать closest. (Кроме того, он опирается на некоторую техническую специфику, что <form> внутри <form> является недопустимым HTML. Для таких вещей, как <div>, нет гарантии, что он не пересекает ни одного дочернего элемента <div>, который ищет следующий <a>.)

В jQuery вы видите много таких вещей:

$("#parent").something(function() {

   var _this = this;
// var self = this;
// var that = this;
// var someMoreMeaningfulName = this;

   $("#child", this).somethingElse(function() {
      $(_this).somethingEvenElser();
      ...
   });
});

Это не самая красивая вещь для чтения, но шаблон встречается достаточно часто, чтобы его можно было легко узнать. Я несколько рекомендую то, что вы делаете (var form) вместо таких вещей, как _this (подчеркивание может подразумевать закрытые переменные), self (на самом деле это не так) и т. Д.

2 голосов
/ 09 июня 2011

Конечно - используйте закрытие.

$('form').each(function() {
  $('a', this).click((function(x) { return function() { x.submit(); })(this));
});

Если у вас есть функция curry (аналогичная той, что в Prototype, но вы не уверены, встроена ли она в jQuery), вы можете немного упростить эту среднюю строку:

$('a', this).click(curry(function(x) { x.submit(); }, this));
2 голосов
/ 09 июня 2011

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

$('a', this).click(function(){ $(this).closest('form').submit(); });

Другой вариант - proxy:

$('a', this).click($.proxy(function(){ this.submit(); }, this));
1 голос
/ 09 июня 2011

Вы должны иметь возможность ссылаться на него с помощью селектора родителя jquery (или родителей в зависимости от того, как вложен тег)

Так что-то вроде этого должно работать:

$('form').each(function(){
  $('a', $(this)).click(function(){ $(this).parent('form').submit(); });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...