简体   繁体   English

Javascript - for 循环内函数内的函数

[英]Javascript - Function inside function inside for loop

I'm new to Javascript and I'm trying to call a function inside another function inside a for loop in Javascript.我是 Javascript 的新手,我试图在 Javascript 的 for 循环内的另一个函数中调用一个函数。 I read all the answers about closures and scope in JS loops but still can't manage to make it work.我阅读了有关 JS 循环中的闭包和作用域的所有答案,但仍然无法使其工作。 Basically what I'm trying to do is attach an event listener to every element of an array.基本上我想要做的是将一个事件侦听器附加到数组的每个元素。

Here's my code:这是我的代码:

HTML: HTML:

    <div class="todo-item">
       To Do item #1
       <button class="btn btn-success btn_task" data-name="data1">Done</button>
    </div>

    <div class="todo-item">
       To Do item #2
       <button class="btn btn-success btn_task" data-name="data2">Done</button>
    </div>

    <div class="todo-item">
       To Do item #3
       <button class="btn btn-success btn_task" data-name="data3">Done</button>
    </div>

JS function that updates HTML through AJAX:通过 AJAX 更新 HTML 的 JS 函数:

    function showTodo(str, label) {

        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() {

            if (this.readyState == 4 && this.status == 200) {
                document.getElementById("todo").innerHTML = this.responseText;
            }

        };
        xmlhttp.open("GET", "../datasource.php?lang=" + label + "&data=" + str, true);
        xmlhttp.send();

}

The part that doesn't work:不起作用的部分:

var todoElements = document.getElementsByClassName("btn_task");

for (var i = 0; i < todoElements.length; i++) {

        (function(index) {
                todoElements[index].addEventListener("click", function(){
                var attribute = todoElements[index].getAttribute('data-name');
                showTodo(attribute, "Spanish");
            })
        })(i);

    }

There is no reason to use a IIFE here.没有理由在这里使用IIFE To bind to all the buttons, you just need a simple for loop.要绑定到所有按钮,您只需要一个简单的for循环。

Inside the event handler, you can use this to get the element you clicked on.在事件处理程序中,您可以使用this来获取您单击的元素。

var todoElements = document.getElementsByClassName("btn_task");

for (var i = 0; i < todoElements.length; i++) {
    todoElements[i].addEventListener('click', function(){
        showTodo(this.getAttribute('data-name'), "Spanish");
    });
}

try this instead (ES6):试试这个(ES6):

function getAttr(e){
    const name = this.dataset.name;
    showTodo(name, "Spanish");
}

const buttons = document.querySelectorAll('.btn_task');

buttons.forEach(button => button.addEventListener('click', getAttr));

What we do here is get all the buttons, assign each button a click handler called getAttr.我们在这里所做的是获取所有按钮,为每个按钮分配一个名为 getAttr 的点击处理程序。 getAttr is passed the button elment that was clicked, it looks at the dataset (all the properies of the element that have the "data-') and selects the data-name property. It passes this to your function. getAttr 被传递给被点击的按钮元素,它查看数据集(具有“data-”的元素的所有属性)并选择 data-name 属性。它将它传递给您的函数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM