之前的答案都没有解释问题以及为什么他们的解决方案有效,甚至包括那个 被连续点赞 的答案 ;)
问题在于内联的 onclick
处理程序没有传递它的当前上下文。在 onclick=""
JavaScript 代码中,this
是被点击的元素。一旦你调用全局函数(例如你的 toggleTip
),这个上下文就丢失了。函数接收到的 this
是 window
而不是元素。
通常的快速修复方法,对于原始的 JavaScript 代码,是将 this
作为参数传递给全局函数。
例如:
onclick="toggleTip(this)"
并在函数中像这样接收参数:
function toggleTip(element) {
$(element).siblings(".tip-content").toggleClass("hidden");
}
然而,由于您正在使用jQuery,内联事件处理程序实际上是一个不好的主意。它们没有理由将事件注册与事件处理程序代码分开,并且不允许在同一元素上有多个相同类型的事件处理程序。它们还绕过了jQuery使用的非常酷的事件冒泡系统。
在jQuery中,首选的替代方法是使用jQuery选择元素并使用jQuery在一步中连接事件。
jQuery(function($){
$('.tip-title').click(function(){
$(this).siblings(".tip-content").toggleClass("hidden");
});
});
如果你只想获取其后的元素,并且可能会添加更多的对,更好的选择是使用nextAll
和first()
,并与相同的jQuery过滤器一起使用,而不是使用siblings
:
例如:
jQuery(function($){
$('.tip-title').click(function(){
$(this).nextAll(".tip-content").first().toggleClass("hidden");
});
});
或者,如果你能保证它是下一个元素,就像@Tim Vermaelen一样使用next
(无论是否带有选择器都没有区别,所以可以省略):
jQuery(function($){
$('.tip-title').click(function(){
$(this).next().toggleClass("hidden");
});
});
注意:在这个例子中,
jQuery(function($){
是一个
DOM就绪事件处理程序,它是
$(document).ready(function(){YOUR CODE});
的非常方便的快捷方式,它还传递了一个本地作用域的
$
值。对于那些将此代码误认为是不正确的
IIFE的人,这里有一个可工作的示例:
http://jsfiddle.net/TrueBlueAussie/az4r27uz/。
this
不是你所期望的。 - nnnnnn.tip-content
的兄弟或兄弟吗? - Suman Bogati