我的代码只需单击一个按钮即可生成不同的元素。生成的元素之一是按钮,我想打开和关闭生成的文本部分。 jQuery .toggle() 函数适用于生成的第一个元素。然后,它仅适用于生成的最新元素以及在此之前的所有其他元素(例如,生成了 5 个元素,它将适用于 5、3、1,但不适用于 2 和 4)。我认为这似乎是该类的问题,因为我可以从 Firefox 的 Web 控制台使用 .toggle() 命令手动删除它。我想这意味着按钮没有触发。我很茫然。
这是一个显示行为的 jsFiddle http://jsfiddle.net/JaLBR/1/ 这是代码:
recursionCounter = 0
$(document).ready(function(){
$("#compute").click(function(){
//add the toggle data
$("#buttons").append("<input type=button value=\"Toggle\" class=\"removeBtn\" id=\"recursion" + recursionCounter + "\">")
//add the recursion counter to the div element
$("#recursion" + recursionCounter).data("recurs", recursionCounter)
//make a new section for toggling purposed
$("#results").append("<o" + (recursionCounter) + ">")
//This code write the results to screen
$("o" + (recursionCounter)).append("<br><br> <b>Recursion " + (recursionCounter) + "</b>")
$("o" + (recursionCounter)).append("<br> Symmetric")
//toggles the recursion info
$(".removeBtn").on("click", function() {
var count = $(this).data("recurs")
$("o" + count).toggle()
})
recursionCounter = recursionCounter + 1
})
})
在 html 上使用适当的 ',如 fiddle 中所示。
我认为这可能是由于将单击的调用嵌套在另一个单击中?我尝试将其移出“计算”单击,但它根本不会切换(可能是因为范围?)但是,问题仅在切换时显示出来。如果将 .toggle() 改为 .hide(),则所有按钮都可以工作。如果我单独显示/隐藏按钮,那么它就可以正常工作。如果我编写执行切换行为的 if..else 语句(使用 .is(:visible)),它也不起作用。
最佳答案
jQuery 不会取代事件处理程序。如果您附加两个事件处理程序:
$('#foo').click(function() {
console.log('a');
});
$('#foo').click(function() {
console.log('a');
});
然后点击#foo
,它们都会触发。
每次添加新元素时,每个 .removeBtn
元素都会获取另一个 事件处理程序,用于切换其各自元素的可见性。当您最终单击该按钮时,所有事件处理程序都会相继触发,并且该元素会切换偶数或奇数次,具体取决于您添加的按钮数量。
要修复此问题,请从 .click()
回调中删除该事件处理程序,然后将其附加到事件委托(delegate)中:
$('#buttons').on("click", ".removeBtn", function () {
var count = $(this).data("recurs");
$("o" + count).toggle()
});
事件委托(delegate)将事件处理程序附加到#buttons
,然后将事件委托(delegate)给被单击的元素。这将考虑与您的选择器匹配的所有元素,即使它们是稍后添加的。
关于jQuery .toggle() 按钮仅切换所有其他元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16371230/