Javascript: "onclick"循环中的 "for"函数无法解析变量

标签 javascript html events onclick html5-audio

我正在用 Javascript 编写一个例程,用于循环访问 HTML 页面中的所有音频元素。所有元素都标有“track_[nr]”形式的 ID,每个元素都有一个自定义按钮,用于切换标有 ID“control_[nr]”的播放/暂停。

现在我想通过迭代所有元素并分配 onclick 函数来自动执行每个控制元素上的 onclick 事件。

我想出了以下代码,但“for”循环的行为并不像我预期的那样。

“document.writeln(j)”总是打印 5(我当前有 5 个音频元素),无论我单击哪个控制元素。我希望当你点击“control_0”时它会写“0”,当你点击“control_1”时它会写“1”,等等。

非常感谢任何帮助!

<script type='text/javascript'>
    var audio = new Array();
    var ctrl = new Array();
    var i = 0;

    do {
        audio[i] = document.getElementById('track_'+i), ctrl[i] = document.getElementById('control_'+i);
        i++;
    } while(audio[i-1]);
    tracks=i-1;

    for (var j = 0; j < tracks; j++) {
        ctrl[j].onclick = function () {
            document.writeln(j);
        }
    }
</script>

问候

最佳答案

首先,JS 中使用的是“control_”而不是“ctrl_”! 但是,您的主要问题是 onclick 函数是一个闭包,这意味着它在其定义中不使用 j,它使用由 for 循环更改的实际变量j。您需要创建一个将 j 作为参数并返回处理程序的函数。这是有效的,因为 j 的被传递到函数中。

var audio = new Array();
    var ctrl = new Array();
    var i = 0;

    do {
      audio[i] = document.getElementById('track_' + i), ctrl[i] = document.getElementById('ctrl_' + i);
      i++;
    } while (audio[i - 1]);
    tracks = i - 1;

    function makeHandler(j) {
      return function() {
        alert(j);
      };
    }
    for (var j = 0; j < tracks; j++) {
      ctrl[j].onclick = makeHandler(j);
    }
button {
  display: block;
}
<button id="ctrl_0">Button 0</button>
<button id="ctrl_1">Button 1</button>
<button id="ctrl_2">Button 2</button>
<button id="ctrl_3">Button 3</button>
<button id="ctrl_4">Button 4</button>
<button id="ctrl_5">Button 5</button>

<div id="track_0">placeholder 0</div>
<div id="track_1">placeholder 1</div>
<div id="track_2">placeholder 2</div>
<div id="track_3">placeholder 3</div>
<div id="track_4">placeholder 4</div>
<div id="track_5">placeholder 5</div>

关于Javascript: "onclick"循环中的 "for"函数无法解析变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29208746/

相关文章:

javascript - 如何使用CSS更改自定义光标的选择提示

html - 声明 HTML5 Doctype 的正确方法是什么。

c#如何获取添加的事件?

asp.net - ASP.NET 是否使用反射来检查事件处理程序是否存在?

android - Android 中的事件处理(setOnClickListener)

javascript - ajax 调用后保留 JavaScript 变量

javascript - 绑定(bind) popstate 事件的不同方法

html - 第一行 3 个图像,然后第二行下面 2 个图像

javascript - React-router 和 iframe,浏览器历史记录

javascript - 使用 javascript 选择等于 php 变量的下拉值