gpt4 book ai didi

javascript - 使用 jQuery 将单击事件抽象添加到类选择的元素

转载 作者:行者123 更新时间:2023-11-28 10:31:42 25 4
gpt4 key购买 nike

我正在慢慢跟上 jQuery 的步伐,并开始想要抽象我的代码。我在尝试定义页面加载时的点击事件时遇到了问题。

在下面的代码中,我尝试使用“block”类运行每个 div,并通过按类选择事件将事件添加到其某些子元素:

<script language="javascript" type="text/javascript">
$(document).ready(function (){

$('HTML').addClass('JS'); // if JS enabled, hide answers

$(".block").each(function() {
problem = $(this).children('.problem');
button = $(this).children('.showButton');

problem.data('currentState', 'off');

button.click(function() {
if ((problem.data('currentState')) == 'off'){
button.children('.btn').html('Hide');
problem.data('currentState', 'on');
problem.fadeIn('slow');
} else if ((problem.data('currentState')) == 'on'){
button.children('.btn').html('Solve');
problem.data('currentState', 'off');
problem.fadeOut('fast');
}
return false;

});
});
});
</script>

<style media="all" type="text/css">
.JS div.problem{display:none;}
</style>


<div class="block">
<div class="showButton">
<a href="#" title="Show solution" class="btn">Solve</a>
</div>

<div class="problem">
<p>Answer 1</p>
</div>
</div>

<div class="block">
<div class="showButton">
<a href="#" title="Show solution" class="btn">Solve</a>
</div>

<div class="problem">
<p>Answer 2</p>
</div>
</div>

不幸的是,使用这个时,只有最后一个 div 按钮真正起作用。该事件不是“本地化”的(如果这是正确的词?),即该事件仅应用于每个方法中的最后一个 $(".block")。

所以我必须费力地为每个元素添加id并一一定义我的点击事件。当然还有更好的方法!谁能告诉我我做错了什么?以及我如何摆脱对这些 ID 的需要(我希望它能够在动态生成的页面上工作,我可能不知道有多少“ block ”...)

<script language="javascript" type="text/javascript">
$(document).ready(function (){

$('HTML').addClass('JS'); // if JS enabled, hide answers

// Preferred version DOESN'T' WORK
// So have to add ids to each element and laboriously set-up each one in turn...

$('#problem1').data('currentState', 'off');

$('#showButton1').click(function() {
if (($('#problem1').data('currentState')) == 'off'){
$('#showButton1 > a').html('Hide');
$('#problem1').data('currentState', 'on');
$('#problem1').fadeIn('slow');
} else if (($('#problem1').data('currentState')) == 'on'){
$('#showButton1 > a').html('Solve');
$('#problem1').data('currentState', 'off');
$('#problem1').fadeOut('fast');
}
return false;

});


$('#problem2').data('currentState', 'off');

$('#showButton2').click(function() {
if (($('#problem2').data('currentState')) == 'off'){
$('#showButton2 > a').html('Hide');
$('#problem2').data('currentState', 'on');
$('#problem2').fadeIn('slow');
} else if (($('#problem2').data('currentState')) == 'on'){
$('#showButton2 > a').html('Solve');
$('#problem2').data('currentState', 'off');
$('#problem2').fadeOut('fast');
}
return false;

});

});
</script>

<style media="all" type="text/css">
.JS div.problem{display:none;}
</style>



<div class="block">
<div class="showButton" id="showButton1">
<a href="#" title="Show solution" class="btn">Solve</a>
</div>

<div class="problem" id="problem1">
<p>Answer 1</p>
</div>
</div>

<div class="block">
<div class="showButton" id="showButton2">
<a href="#" title="Show solution" class="btn">Solve</a>
</div>

<div class="problem" id="problem2">
<p>Answer 2</p>
</div>
</div>

最佳答案

已编辑,因为我找到了 HTML :)

首先:您需要使用 var 声明“按钮”和“问题”关键字。

接下来,将在目标元素的上下文中调用单击处理程序,因此您不应在其中引用“button”,而应引用“$(this)”。

接下来,您需要想出一种方法将每个按钮与其相应的“问题”元素相关联。处理程序可以使用 jQuery DOM 遍历例程找到伴随的“问题”:

button.click(function() {
var $button = $(this), $problem = $button.closest('div.block').find('.problem');
if (($problem.data('currentState')) == 'off'){
$button.children('.btn').html('Hide');
$problem.data('currentState', 'on');
$problem.fadeIn('slow');
} else if (($problem.data('currentState')) == 'on'){
$button.children('.btn').html('Solve');
$problem.data('currentState', 'off');
$problem.fadeOut('fast');
}
return false;
});

现在另一种选择是使用 live机制,它允许您只创建一个处理函数。它与此非常相似,但不是将处理程序绑定(bind)到每个“按钮”<div>您只需设置它并引用选择器:

$('.button').live('click', function() {
// as above
});

关于javascript - 使用 jQuery 将单击事件抽象添加到类选择的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2882861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com