检查'this'是$(this)还是普通的'this'

3

我有一个函数:

function myFunction(){
var id = $(this).attr('id');
}

现在有时候,myFunction 会以 $(this) 作为上下文被调用,但有时候上下文只是 'this'。

如何一行代码实现类似以下效果:

if(this == $(this)){
var e = $(this);
}

这是一个测试,用于确定“this”是jQuery的“this”还是JS的“this”。

可行吗?


1
无论如何,如果你执行 $(this),它可能不会崩溃。 - Kos
1
不过这没关系。$($($($($($($(this))))))) 是有效的代码。我99% 确信 jQuery 会检查它是否已经是 jQuery 对象,如果是,就不会多做无用功。 - CaffGeek
考虑对函数的上下文类型进行约定。如果您有一个jQuery对象,可以使用[0]访问DOM元素。 - Šime Vidas
重复的问题:https://dev59.com/p3I-5IYBdhLWcg3wcn3m - BradBrening
顺便说一句,你说的话是错误的:“基本上是一个测试,看看'this'是jQuery的'this'还是JS的'this'”……这是概念上的错误,或者你可能想用另一种方式表达它。 - Parth Thakkar
4个回答

12
if (this.jquery) { // refers to jQuery version
  // jQuery object
}

或者:

if (this instanceof jQuery) { // prototype chain
  // jQuery object
}

然而,正如其他人所说,这并不重要,$(this)会在this已经是jQuery对象或DOM元素的情况下工作。


然而,我认为如果你只是将它传递给 $(),那么检查它是否值得是没有意义的,因为 $() 会为你进行检查。 - CaffGeek
1
var obj = {jquery:1}; 哈哈哈哈... :P - Šime Vidas
在执行João版本和仅仅将'this'上下文包装在jQuery中($thisContext = $(this);)之间,性能差异会显著吗?除了明确想要或不想要一个jQuery对象之外,是否有任何其他原因使人更喜欢一种方法而不是另一种方法? - Paul Richter
@Teeg 评估表达式 $(this) 的性能惩罚只有几微秒(百万分之一秒),这意味着它是可以忽略不计的。您可以在一个函数调用中安全地拥有几十个 $(this)$(window) 等表达式,而不会影响性能。 - Šime Vidas
@Sime Vidas 我就有这种感觉。Joao的回答很有道理,也很好,但在我遇到的大多数情况下,我倾向于只是包装$(this)。 - Paul Richter
1
@Teeg:我同意你的观点,实际上我已经在我的答案中加入了这个建议,尽管问题明确要求检测一个jQuery对象的方法。 - João Silva

3

this 是一个jQuery对象或者不是时,你也可以只使用 var e = $(this)


2

一种处理它的方法就是始终将其包装在$(...)中。像这样包装一个jQuery对象会创建一个克隆(参见jQuery文档),因此这个HTML代码:

<a href="test" id="​​​​​​​​​​​​​​​​​​​​​​​​​test-link">Test Link</a>​​​​​​​​​​​​​​​​​​​​​​​

使用以下JS代码:
​var link = $('#test-link');
var doubleWrappedLink = $(link);

alert(doubleWrappedLink.attr('href'));​​​​​​​

将正确弹出“test”。


0

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