我有以下jQuery代码
$(document).ready(function() {
for(var i=1;i<4;i++) {
var img= ".img"+i;
var p= ".p"+i;
$(img).on("click", function(){
$(p).hide();
});
}
});
应用于以下html:
<div>
<article>
<h1>Over mezelf <img src='images/plus.png' class='img1'/></h1>
<p class='p1'>Test</p>
</article>
<article>
<h1>Contact <img src='images/plus.png' class='img2'/></h1>
<p class='p2'>Test</p>
</article>
<article>
<h1>Website <img src='images/plus.png' class='img3'/></h1>
<p class='p3'>Test</p>
</article>
</div>
当我点击图片时,最后一个<p>
消失,它不会对其他图像起作用。
答案 0 :(得分:4)
问题是由于p
的范围。当它运行事件处理程序代码时,它将始终使用最新的&#39; p&#39;,在这种情况下将是".p3"
(see here for more information)
快速修复
您可以改为使用闭包:
$(document).ready(function() {
for(var i = 1; i < 4; i++) {
var img= ".img" + i;
var p = ".p" + i;
(function(p){
$(img).on("click", function(){
$(p).hide();
});
})(p);
}
});
<强>推荐强>
我个人更喜欢将HTML改为使用公共类,这样就不需要循环了。然后,您可以导航到正确的p
代码...
HTML:
<div>
<article>
<h1>Over mezelf <img src='images/plus.png' class='img'/></h1>
<p class='p1'>Test</p>
</article>
<article>
<h1>Contact <img src='images/plus.png' class='img'/></h1>
<p class='p2'>Test</p>
</article>
<article>
<h1>Website <img src='images/plus.png' class='img'/></h1>
<p class='p3'>Test</p>
</article>
</div>
(请注意,如果您仍然需要编号的类,您可以拥有多个类。例如:"img img1"
)
使用Javascript:
$(document).ready(function() {
$(".img").on("click", function () {
$(this).closest("article").find("p").hide();
});
});
答案 1 :(得分:4)
你只需要这个
$(img).on("click", function(){
$(this).closest('article').find('p').hide();
});
<强>文档强>
closest()
find()
答案 2 :(得分:1)
您可以简单地使用:
$('img').on("click", function(){
$(this).parent().next().hide();
});
答案 3 :(得分:1)
Milind Anantwar的答案肯定是要走的路,但这里还有一些注意事项:
您可能需要更具体的选择器,因此它们对布局更改的依赖性较小:
$(function () {
$('article h1 img').on('click', function(){
$(this).closest('article').find('p').last().hide();
});
});
这会找到最接近的article
祖先,然后找到最后一个段落(.children('p').last()
执行相同的操作的速度只比find
快,因为它只搜索一个级别)
*注意:$(function(){YOUR CODE HERE});
只是$(document).ready(function(){YOUR CODE HERE});
您不应该拥有唯一的类名,除非您实际上是要专门为每个元素设置样式。唯一标识符属于id=
,共享类属于class=
。
如果您引入的动态加载元素与您显示的类型相同,则可以轻松地将其更改为使用on()
的委托版本:
$(function () {
$(document).on('click', 'article h1 img', function(){
$(this).closest('article').find('p').last().hide();
});
});
委托事件在祖先监听,然后应用选择器,然后将该函数应用于生成事件的任何匹配元素。
首选是在DOM中使用第一个不变的祖先。如果失败(你没有显示页面的其余部分),你可以使用接收页面上所有冒泡事件的文档。