【问题标题】:Hiding element in loop based on event [duplicate]基于事件在循环中隐藏元素[重复]
【发布时间】:2015-03-25 00:09:27
【问题描述】:

在我的表格中,我有五个这样的广播组:

<label class="radio-inline"><input type="radio" name="persontype1" value="fo" checked="checked">FO</label>
<label class="radio-inline"><input type="radio" name="persontype1" value="po">PO</label>

然后我有一个循环来隐藏/显示其他元素,基于这些单选按钮的更改事件:

for (i = 1; i <= 5; i++) {
    $("input[type=radio][name=persontype" + i + "]").change(function() {
        if (this.value == 'fo') {
            $("#person-name" + i).removeClass('hidden');
        }
        else if (this.value == 'po') {
            $("#person-name" + i).addClass('hidden');
        }
    });
}

问题是它不能以这种方式工作。当我在选择器中使用绝对 ID 值名称时,它可以工作:

$("#person-name1").addClass('hidden');

我尝试使用一些全局变量,但它也不起作用。有没有办法将变量 i 传递给该函数?

提前致谢,JiKra

【问题讨论】:

  • 不要认为“我需要五个事件处理程序”。想想“我需要一个能够识别其上下文的事件处理程序。”。从技术上讲,“关闭”副本是对您的麻烦的解释,但它仍然是一个红鲱鱼。看pastebin.com/HYX1bz93
  • 好主意,但不能正常工作。第一个 radio-change 什么都不做,其他的则以相反的方式切换可见性。
  • 这并不是一个复制粘贴代码示例。它旨在作为一个理解概念的代码示例。它是四行。我相信您可以进行必要的更改。
  • ID 像#person-name" + i 这样的元素在哪里?您的示例中的标签和输入都没有 ID。

标签: javascript jquery jquery-selectors


【解决方案1】:

将代码包装在一个封闭的 IIFE(立即调用的函数表达式)中:

for (i = 1; i <= 5; i++) {
    (function(i){
        $("input[type=radio][name=persontype" + i + "]").change(function() {
            if (this.value == 'fo') {
                $("#person-name" + i).removeClass('hidden');
            }
            else if (this.value == 'po') {
                $("#person-name" + i).addClass('hidden');
            }
        });
    })(i);
}

这将为内部i(函数的参数)提供函数范围。

虽然使用单个事件处理程序并具有确定哪个是哪个的属性会更有意义:)

 // Match on starts-with "persontype" using ^=
 $("input[type=radio][name^=persontype]").change(function() {
     var target = $(this).data('target');
     // Do something to the target
 });

【讨论】:

  • 这太复杂了。不要使用循环。 pastebin.com/HYX1bz93
  • @Tomalak:已经在上面了......(如前所述)评论:)
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2019-12-27
相关资源
最近更新 更多