【问题标题】:JavaScript loop to generate JavaScript functions with different values [duplicate]JavaScript循环生成具有不同值的JavaScript函数[重复]
【发布时间】:2016-01-26 07:20:14
【问题描述】:

我的 DOM 上有单独的元素,ID 为“inner_1”到“inner_20” 例如inner_1、inner_2、inner_3 等。

我创建了一个 javascript 循环,它将创建单独的事件侦听器函数来定位每个元素,但它为每个函数分配了错误的值。

我的 .js 文件中的循环

for (section = 1; section < 21; section++) {
  $('#inner_'+section).click(function(event) {
    alert('Hooray!'+section);
    event.preventDefault();
  });
};

输出

=> "Hooray!21"

对于我点击的每个元素,无论是“inner_1”还是“inner_15”。

如何让它为每个功能显示正确的数字,例如“inner_14”将有“14”的警报

谢谢!

【问题讨论】:

  • 除了答案之外,考虑一个真正简单的解决方案,即for (let section= 然而,更基本的是,使用构造的 ID 作为解决 DOM 元素的一种方式是一种反模式。您将花费一生的时间进行字符串算术以创建 ID,然后在 DOM 中跟踪它们,然后在某些情况下再次将 ID 重新分开。更好的是,例如,用一个类来识别inner 元素,然后用getElementsByClassNamequerySelectorAll 将它们全部抓取,然后循环遍历结果以添加事件监听器。
  • 哇,这项技术对我来说将是无价之宝!这种想法将有助于我成为一个更好的开发者!!感谢您的提示和指导 torazaburo!

标签: javascript ruby-on-rails-4 dom for-loop


【解决方案1】:

输出将始终是“万岁!21”,因为这是调用点击处理程序时section 的值。 for 循环将已经完成迭代,导致 section 在 21 中“修复”。改为尝试这个

for (section = 1; section < 21; section++) {
  (function(s) { 
      $('#inner_'+s).click(function(event) {
        alert('Hooray!'+s);
        event.preventDefault();
      });
  })(section);
};

【讨论】:

  • 不需要创建新范围,只需将数据传递给事件:$("#inner_" + s).on("click", { index: s }, function(e) { alert(e.data.index); })
【解决方案2】:

循环似乎没有必要。尝试使用以选择器开头的属性

$("[id^=inner]").click(function(e) {
  e.preventDefault()
  alert("Hooray!" + this.id.split("_")[1])
})

【讨论】:

  • 非常干净。这将优于以编程方式生成 21 个匿名函数。
  • 哇,这太神奇了!我选择了 Griffith 的答案,因为它定义了为什么我的循环不起作用,但我将使用这段代码!惊人的!谢谢!
  • 是的,这绝对是一个改进的代码。
【解决方案3】:

考虑重构代码,如果您使用的是 jQuery,那么只需为所有元素委托一个 事件处理程序,因此,您可以避免创建大量执行相同操作的事件处理程序。

考虑以下结构:

<section class="parent-section">
    <div id="inner_1">1</div>
    <div id="inner_2">2</div>
    <div id="inner_3">3</div>
</section>

现在我们要将事件处理程序委托给父元素,这样只会创建一个事件处理程序:

$(".parent-section").on("click", "[id^='inner_']", function(e) {
    e.preventDefault();
    var item = this.id.match(/\d+$/);
    if (!item) { return; }
    alert(item[0]);
});

这样您将在内存优化方面得到改进,因为只有一个事件处理程序会处理所有子元素中的点击事件。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-07-31
  • 2014-10-15
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多