$(this +"selector")?$("img",this) 可行吗?

35

我想在$(this)选择器内“选择”一张图片。我知道可以使用.find('img')来找到它,但是这个写法可行吗:

$("img",this)

什么是最优的方法呢?

原始代码如下:

<a class="picture" href="test.html">
    <img src="picture.jpg" alt="awesome">
</a>

两种方法都可以达到相同的效果。我认为称其中任何一种为“最优”的意义不大。 - Jon
1
顺便说一句,你总是可以使用这个科学方法:http://jsperf.com/jqslctrtst - KARASZI István
没错,它们是相同的,但是.find()比.context()稍微快一点。 http://jsperf.com/jquery-context-find-and-children-selectors/6 http://jsperf.com/jquery-find-vs-context-2/2 - rucsi
6个回答

73
这样做最优的方法是什么? $(this).find('img')$('img', this) 是等效的。
从文档中可以得知:
内部实现选择器上下文使用了 .find() 方法,所以 $('span', this) 等价于 $(this).find('span') 。
参考链接:http://api.jquery.com/jQuery/

6
那是很合理的做法。因此,您可以像这样做:

所以您可以这样操作:

$('a').click( function() {
   //if the element dosent change you can use this
   //var src = $('img', this).attr('src');
   //else use $(this)
   var src = $('img', $(this)).attr('src');
   alert(src);
   return false;
});

查看: http://jsfiddle.net/xYmwV/

两种方式实际上没有区别,因为它们都加载dom元素并进行搜索。您的方法当然更加 "干净" 和简单,但可能更加令人困惑 :)

一种更快的方法是使用 $(this).children(),因为它不必搜索元素,而是直接向下搜索 DOM。但这将削弱脚本的灵活性。


有时候你需要添加 $(this) 而不是 this,但基本上这就是做这件事的方法。+1 :) - Phoenix
@Phoenix 是的,当你搜索元素时调用它是有意义的。我从来没有真正理解为什么通常不需要调用它? :/ - Marco Johannesen
似乎如果您移动进入/离开DOM,this可能会改变,而$('this')则不会。http://remysharp.com/2007/04/12/jquerys-this-demystified/ - Marco Johannesen
没错。我也喜欢给我的对象一个自己的变量,比如:img_var = $(this); 只是为了确保。有时在 $.foreach() 这样的函数内部,$(this) 也会发生变化。 - Phoenix

4

是的,您可以这样做...无论如何,它们是等效的,所以只是关于您的“语法品味”:

在内部,选择器上下文是使用.find()方法实现的,因此$('span', this)等同于$(this).find('span')。

http://api.jquery.com/jQuery/


2

无论选择哪种方式都没有太大关系,这主要是一种风格选择。

jQuery通过在内部执行$(context).find(selector)或(如果context已经是jQuery实例)context.find(selector)来处理表单$(selector, context),因此从理论上讲,find形式稍微更有效,但这并不重要。


0

0
我正在尝试在$(this)选择器中"选择"一个img。
var myImg = $(this).find("img");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接