当前位置: 首页 > 面试题库 >

使用循环和传递值的addEventListener [重复]

凌俊名
2023-03-14
问题内容

我试图使用for循环将事件侦听器添加到多个对象,但最终所有侦听器都针对同一对象->最后一个对象。

如果我通过为每个实例定义boxa和boxb手动添加侦听器,则它将起作用。我猜这是addEvent
for循环无法按我期望的方式工作。也许我完全使用了错误的方法

在容器4上使用class =“ container”触发器4的示例按预期方式工作。在容器4上的容器1,2,3触发事件上触发,但仅当触发器已被激活时。

// Function to run on click:

function makeItHappen(elem, elem2) {

  var el = document.getElementById(elem);

  el.style.backgroundColor = "red";

  var el2 = document.getElementById(elem2);

  el2.style.backgroundColor = "blue";

}



// Autoloading function to add the listeners:

var elem = document.getElementsByClassName("triggerClass");



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

  var k = i + 1;

  var boxa = elem[i].parentNode.id;

  var boxb = elem[k].parentNode.id;



  elem[i].addEventListener("click", function() {

    makeItHappen(boxa, boxb);

  }, false);

  elem[k].addEventListener("click", function() {

    makeItHappen(boxb, boxa);

  }, false);

}


<div class="container">

  <div class="one" id="box1">

    <p class="triggerClass">some text</p>

  </div>

  <div class="two" id="box2">

    <p class="triggerClass">some text</p>

  </div>

</div>



<div class="container">

  <div class="one" id="box3">

    <p class="triggerClass">some text</p>

  </div>

  <div class="two" id="box4">

    <p class="triggerClass">some text</p>

  </div>

</div>

问题答案:

关闭!:D

此固定代码按预期工作:

// Function to run on click:

function makeItHappen(elem, elem2) {

    var el = document.getElementById(elem);

    el.style.backgroundColor = "red";

    var el2 = document.getElementById(elem2);

    el2.style.backgroundColor = "blue";

}



// Autoloading function to add the listeners:

var elem = document.getElementsByClassName("triggerClass");



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

    (function () {

        var k = i + 1;

        var boxa = elem[i].parentNode.id;

        var boxb = elem[k].parentNode.id;

        elem[i].addEventListener("click", function() { makeItHappen(boxa,boxb); }, false);

        elem[k].addEventListener("click", function() { makeItHappen(boxb,boxa); }, false);

    }()); // immediate invocation

}


<div class="container">

  <div class="one" id="box1">

    <p class="triggerClass">some text</p>

  </div>

  <div class="two" id="box2">

    <p class="triggerClass">some text</p>

  </div>

</div>



<div class="container">

  <div class="one" id="box3">

    <p class="triggerClass">some text</p>

  </div>

  <div class="two" id="box4">

    <p class="triggerClass">some text</p>

  </div>

</div>

为什么可以解决此问题?

for(var i=0; i < elem.length; i+=2){
    var k = i + 1;
    var boxa = elem[i].parentNode.id;
    var boxb = elem[k].parentNode.id;

    elem[i].addEventListener("click", function(){makeItHappen(boxa,boxb);}, false);
    elem[k].addEventListener("click", function(){makeItHappen(boxb,boxa);}, false);
}

实际上是非严格的JavaScript。解释如下:

var i, k, boxa, boxb;
for(i=0; i < elem.length; i+=2){
    k = i + 1;
    boxa = elem[i].parentNode.id;
    boxb = elem[k].parentNode.id;

    elem[i].addEventListener("click", function(){makeItHappen(boxa,boxb);}, false);
    elem[k].addEventListener("click", function(){makeItHappen(boxb,boxa);}, false);
}

由于变量提升,因此var声明将移动到作用域的顶部。由于JavaScript没有块作用域(forifwhile等),他们无法移动到函数的顶部。
更新:
从ES6开始,您可以let用来获取块范围的变量。

当您的代码运行时,会发生以下情况:在for循环中添加click回调并分配boxa,但是其值在下一次迭代中将被覆盖。当点击事件触发回调运行和的值boxa是始终在列表的最后一个元素。

使用闭包(关闭的值boxaboxb等等),将值绑定到点击处理程序的作用域。



 类似资料:
  • 问题内容: 我正在定义JSON文件中的项目列表,并将该列表显示在网页上。目的是让用户单击该列表中的任何项目以显示有关该项目的更多信息(保存在同一JSON文件中的信息)。 该列表的所有项目都是同一类的成员,并且每个项目都有一个从JSON文件定义的唯一ID。HTML看起来像这样: 我打算使用一些类似的方法 与 但我不确定如何将ID从事件侦听器传递到打印功能,以确定要打印的详细信息。 我在HTML /

  • 我需要修改下面的代码,以使用循环与常规foreach循环。 我遇到的问题是将对象传递给foreach循环。我刚开始使用循环-有没有人对此有一些信息? 当前代码 问题是列表将包含3000+项,循环将循环每一项,我需要并行地运行它们。 因此,我想使用函数,但我无法通过传递对象来使其工作。

  • Go 语言中 值类型 有:int 系列、float 系列、bool、string、数组、结构体 值类型通常在栈中分配存储空间 值类型作为函数参数传递,是拷贝传递 在函数体内修改值类型参数,不会影响到函数外的值 package main import "fmt" func main() { num := 10 change(num) fmt.Println(num) // 10 }

  • 问题内容: 以传统方式添加事件侦听器: 但是我想适应addEventListener的方式: 它不起作用,因为我无法将getSelection()中的任何参数作为addEventListener方法中的第二个参数传递?据我所知,我只能使用没有括号的函数名。 任何的想法? 问题答案: 无需传递任何内容。用于的函数将自动绑定到当前元素。只需在您的函数中使用: 如果要将任意数据传递给函数,请将其包装在您

  • 问题内容: 我一直在努力,我碰到了一个我不知道该怎么办的地步。我想做的是使用一个类下载文件并将其解析为字符串,然后将该字符串发送给另一个类以解析JSON内容。所有部分都可以正常工作,我已经分别测试了所有内容。我只是不知道如何将值发送到Json解析器以开始解析。 这是我的filedownloader类。 } 这个工作正常,我已经反复测试了,没有错误。接下来是这样的Json解析器。 现在我知道问题出在

  • 问题内容: 这应该是一个非常简单的问题,但是我发现的所有解决方法都很复杂。我在模板中使用ng-repeat遍历对象数组,如下所示: 由于ng-repeat创建了新作用域,因此控制器中的“广告系列”对象似乎不可访问。除了将活动对象添加到数组中的每个项目之外,还有什么方法可以获取该价值? 提前致谢。 问题答案: 您可以使用$ parent访问父范围