jQuery从查找中获取原始上下文

时间:2011-05-24 21:06:31

标签: jquery jquery-selectors dom-traversal

如果我想获取一个表单,然后抓住一些按钮,然后将一些动作附加到提交我的表单的那个按钮,我现在正在这样做:

<form>
  <button>Some Button</button>
</form>

$('form').find('button').click(function(){
  $(this).closest('form').submit();  // is there a better way of getting the form?
});

我想知道在我的查找中是否有更高效的方法来选择原始表单元素。而不是必须遍历dom,有没有办法在其后代的click事件中获取对原始form对象的引用?

不幸的是.context在这种情况下会给我button元素,我能以任何方式获得原始上下文吗?或者我只需要遍历?

请注意,这是一个人为的例子,我实际上并没有使用按钮和表单,但我更感兴趣的是在find中获取原始上下文。

4 个答案:

答案 0 :(得分:1)

这取决于你要做的事情。如果您在事件回调中,不,则无法获得原始选择。您拥有的唯一数据是单击了哪个元素,以及有关单击事件本身的一些详细信息。不要忘记form可以匹配多个不同的元素,因此知道哪一个你应该匹配是不可能的。 (除非只有一个 - 但它仍然不是一种非常稳定的网站编码方式。)

如果您只是使用标准方法链接上下文,则可以使用end在搜索中返回一个阶段:

$('form').find('button').prop({name: 'foo', value: 'bar'}).end().submit();

答案 1 :(得分:1)

我认为重点是缓存第一个电话?只需通过each()运行它,这将允许您在该方法的参数中存储上下文。

$('form').each(function(idx,el){
   $(this).find('button').click(function(){
      $(el).submit();  
   });
});

答案 2 :(得分:0)

如果你只有一个表格,那么你可以这样做:

var $form = $('form');
$form.find('button').click(function() {
    $form.submit();
});

只需计算$('form')一次,然后根据需要使用它。

我怀疑$(this).closest('form')真的会变得那么贵。 OTOH,良好的习惯是良好的习惯,而不是一遍又一遍地计算同样的东西通常是一个好习惯。

答案 3 :(得分:0)

据我所知,无法从找到的对象中引用搜索对象。这是因为你只会获得找到的JQuery对象,而不是被调用来找到它的函数的信息:

var blah = $('blah');

//The following variable will have no direct reference to blah, but 
//blah can still be used if it stays in scope:
var thingWithNoReferenceToBlah = blah.find('thing');