jQuery - 父母“这个”

时间:2011-06-08 22:25:07

标签: jquery jquery-plugins jquery-selectors

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

有没有办法在不使用中间变量的情况下获取该click函数内的父(this)元素?我在想,也许有一个我不知道的关键字让你这么做。

在$ .ajax函数中有一个context参数,允许你做这样的事情。

5 个答案:

答案 0 :(得分:7)

不,你已经做到了最好的方式。公约建议使用:

var that = this;
$('a', this).click(function(){ that.submit(); });

答案 1 :(得分:2)

由于aform的孩子,您可以使用closest

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

另一个选项是proxy

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

答案 2 :(得分:2)

当然 - 使用封闭装置。

$('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));

答案 3 :(得分:2)

首先,你的榜样是正确的,其次,这是大多数人都会这样做的。没有关键字,只是为最可能的父级转换方向并遍历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(实际上不是)等等。

答案 4 :(得分:1)

您应该可以使用jquery的父级(或父级,具体取决于标记的嵌套方式)选择器

所以这样的事情应该有效:

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