gpt4 book ai didi

javascript - 递归函数和removeEventListener

转载 作者:行者123 更新时间:2023-12-03 07:09:50 24 4
gpt4 key购买 nike

我想编写一个动态按钮创建器。所以我有 html 文件

<body>
<button id="0" type="button" onclick="create_button(0)">Create button 1</button>
</body>

js文件“模拟”正确的操作

var counter = 0;

function create_button(n) {

/*Shift up*/
for (i=counter; i>n; i--) {
document.getElementById(i).id = i+1;
document.getElementById(i+1).innerHTML = i+1;
};

/*Create new button*/
var new_button = document.createElement("Button");
new_button.innerHTML = n+1;
new_button.type = "button";
new_button.id = n+1;
function helper() {
create_button(n+1);
};
new_button.addEventListener('click', helper );

document.body.insertBefore(new_button,document.getElementById(n).nextSibling);

counter++;
};

但是/*Shift up*/部分仅更改按钮的idinnerHTML而不是click的操作>。因此,为了解决这个问题,我需要在 /*Shift up*/ 中添加两行,它们应该作为

document.getElementById(i+1).addEventListener('click', helper(i+1) );
document.getElementById(i+1).removeEventListener('click', helper(i) );

显然这是行不通的。由于 create_button 函数的递归性质,我认为 helper 应该移到 create_button 之外。但我不知道该怎么做。

一些附加信息 我简化了代码,但实际上按钮有一些依赖于 n 的附加功能。假设我们还想提醒按钮的位置。所以我们将助手更改为

function helper() {
create_button(n+1);
alert(n+1);
};

参见https://jsfiddle.net/o3Lsttyq/3/警报说什么。单击示例 1,1,3。

最佳答案

由于您正在调整 id 以便它始终与当前索引匹配,并且您的函数 helper 需要相同的索引,因此您似乎所需要做的就是移动您的helper 函数并将其更改为如下内容:

function helper(){
var n1 = this.id; // effectively "n+1"
alert(n1);
}

您也不需要使用该参数调用 create_button,因为您想要的数据可以从 this 中提取。

(此外,您不应该将 id 属性用于此类事情。您应该使用 data- 前缀属性,如 here 中所述。另外,使用 this 而不是使用 getElementById() 进行重构意味着您可以不再需要跟踪元素的索引。)

重构的乐趣:

<body>
<button type="button">Create button 1</button>
</body>
function create_button(){
var index = (this.innerHTML|0) + 1;
var new_button = document.createElement("button");
new_button.type = "button";
new_button.addEventListener('click',create_button);
document.body.insertBefore(new_button,this.nextSibling);

var target = new_button;
while(target) {
target.innerHtml = index;
target = target.nextSibling;
index += 1;
}
}
document.body.getElementsByTagName("button")[0].addEventListener('click',create_button);

关于javascript - 递归函数和removeEventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36655963/

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