【问题标题】:Creating a For loop to create multiple 'Click' events in JavaScript/JQuery创建一个 For 循环以在 JavaScript/JQuery 中创建多个“单击”事件
【发布时间】:2013-09-20 02:40:22
【问题描述】:

我想为我的页面上的一系列“点击”事件创建一个 For 循环。我正在创建一个时间表,单击 Day 按钮将在 div 框中显示分配给该天的事件。
HTML

<div class="cwt-buttons">
<a id="cwt-button1">Monday</a>
<a id="cwt-button2">Tuesday</a>
<a id="cwt-button3">Wednesday</a>
<a id="cwt-button4">Thursday</a>
<a id="cwt-button5">Friday</a>
<a id="cwt-button6">Saturday</a>
<a id="cwt-button7">Sunday</a>
</div>

<div id="cwt-timetable">
<div class="current">Housework</div>
<div class="cwt-Day1">Kickboxing</div>
<div class="cwt-Day2">Homework</div>
<div class="cwt-Day3">Yoga</div>
<div class="cwt-Day4">Eating</div>
<div class="cwt-Day5">Fasting</div>
<div class="cwt-Day6">Running</div>
<div class="cwt-Day7">Funeral</div>
</div>

JS

$(function() {
    for ( var i = 1; i < 8; i++ ) {
        var clickedButton = $("#cwt-button"+i);
        $(clickedButton).click(function() {
        var currentDay = $('#cwt-timetable div.current');
        var selectedDay = $('#cwt-timetable div.cwt-Day'+i);
        currentDay.removeClass('current').addClass('previous');
        (selectedDay).css({ opacity: 0.0 }).addClass('current').animate({ opacity: 1.0 }, 1000,
        function() {
            currentDay.removeClass('previous');
        });     
    })
    }
});

当我有确切的值时,JavaScript 可以正常工作,例如"#cwt-button1"
当我在循环中连接“i”计数器时,它就不起作用了。

谁能看出我哪里出错了?还是我做了一些 JavaScript 无法处理的事情?

【问题讨论】:

  • 你不应该这样做。只需使用 $('cwt-buttons a').click(...) 并使您的事件处理程序足够通用,以适用于任何链接。
  • 您还使用了两次$(...);实际上你在写$($('#cwt-button1')),这不是问题,只是没必要。
  • 试试这个:var clickedButton = "#cwt-button"+i;,只是猜测。
  • 大家好,删除变量中的 $() 会导致错误,这是我这样做的唯一原因。

标签: javascript jquery


【解决方案1】:

这只是每天被多次询问的老问题。您在循环中创建的所有函数都在同一个变量范围内创建,因此它们共享同一个 i 变量。

要确定一个变量的范围,您需要一个函数调用。 jQuery 的$.each() 是一种方便的方法:

$(function () { // -----------v-----scoped to the function
    $.each(Array(7), function(i) {
        var clickedButton = $('#cwt-button' + (++i));

        $(clickedButton).click(function () {
            var currentDay = $('#cwt-timetable div.current');

            // --------using scoped `i`------------------------v
            var selectedDay = $('#cwt-timetable div.cwt-Day' + i);
            currentDay.removeClass('current').addClass('previous');
            (selectedDay).css({
                opacity: 0.0
            }).addClass('current').animate({
                opacity: 1.0
            }, 1000, function () {
                currentDay.removeClass('previous');
            });
        });
    });
});

【讨论】:

  • 这是一个丑陋的黑客。每个人都不打算这样做。改用匿名函数
  • @mkoryak:这很愚蠢。首先,我使用的是匿名函数。其次,这正是使用函数式迭代器的好处。这不是黑客攻击。它的使用完全符合预期。
  • 您不是在迭代您创建的数组,而是将它用作一种让每个数组工作的黑客方式。我应该说,在 for 循环中创建一个匿名函数并称之为一天
  • @mkoryak:定义迭代次数的内容无关紧要。我们需要的是一个作用域变量,这是函数调用提供的。
  • @mkoryak:如果您指的是 IIFE,那是一种效率较低的方法,因为循环的每次迭代都会创建一个新的函数对象。这样,只创建了一个函数。与 IIFE 相比,它的语法也不那么神秘,这让很多人感到困惑,尤其是在循环内联时。
猜你喜欢
  • 2017-08-02
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多