【问题标题】:Using arrays to store multiple IDs or classes, and then manipulating them in functions使用数组存储多个 ID 或类,然后在函数中对其进行操作
【发布时间】:2014-07-05 19:41:37
【问题描述】:

我有一组类存储在一个名为“targets”的 JavaScript 数组中,如下所示:

HTML

<div id="one">1</div>
<div id="two">2</div>
<div id="three">3</div>
<div id="four">4</div>
<div id="five">5</div>
<div id="six">6</div>
<div id="seven">7</div>
<div id="eight">8</div>
<div id="nine">9</div>
<div id="ten">10</div>

JavaScript — 数组

var targets = ["#one", "#two", "#three", "#four", "#five", "#six", "#seven", "#eight", "#nine", "#ten"];

然后我想操纵它们以在函数中使用。根据我的情况,我要么想定位数组中的一个特定 ID,要么一次定位数组中的所有条目。我知道数组中的每个条目都有一个唯一的索引号,从 0 开始。因此,#one 是索引 0,#ten 是索引 9。

我也知道我可以将for 循环与数组一起使用,这将循环遍历每个条目。我的问题是,当从点击事件(在 input type="button" 元素上)调用我的函数时,我似乎无法正常工作。

这是我的代码的两个示例。一个针对一个特定条目,另一个针对所有条目。或者至少,这是它应该做的。 Chrome 的控制台显示我的代码没有错误,而且我从未真正使用过数组,所以这对我来说是第一次。

JavaScript — 尝试定位单个条目(工作)

$(targets[0]).addClass('hide').removeClass('show');

JavaScript - 尝试定位所有条目 I

$(targets).each(function() {
    $(this).addClass('hide').removeClass('show');
});

JavaScript - 尝试定位所有条目 II

targets.forEach(function() {
    $(targets).addClass('hide').removeClass('show');
});

JavaScript - 尝试定位所有条目 III

var i;
for ( i = 0; i < targets.length; ++i ) {
    $(targets).addClass('hide').removeClass('show');
}

另外,我知道 jQuery 允许您通过代码的 $() 部分传递多个值来一次操作多个类和/或 ID,但我处于数组条目将是的困境不同,取决于用户输入,我觉得我总共将操作超过 250 个不同的 ID 和类。我只是省略了前 10 个元素的 HTML 代码。

250 个 ID/类中的大多数位于 &lt;option&gt; 元素上。代码中使用的.show.hide 类并不直接应用于&lt;option&gt; 元素本身,而是应用于包含这些选项的&lt;select&gt; 元素。每个&lt;select&gt; 元素都有一个唯一的ID。

如果我能弄清楚如何用数组做到这一点,一切都会好起来的。

谢谢。

【问题讨论】:

  • 过多地使用 each 。可以对整个集合执行大多数 jQuery 方法。 $(selector) 在 jQuery 对象中创建一个元素数组
  • 总的来说,我会说你的方法比它需要的更复杂

标签: javascript jquery arrays function


【解决方案1】:

您必须将数组加入到一个有效的 jQuery 选择器的字符串中

$(targets.join(', ')).addClass('hide').removeClass('show');

这会给你

$("#one, #two, #three ...")

这是有效的,ID 数组不是有效的选择器

另请注意,显示和隐藏选项元素不是跨浏览器

【讨论】:

  • 关于显示/隐藏,我使用单独的&lt;select&gt; 元素对选项进行分类。这些类被提供给这些&lt;select&gt; 元素,而不是&lt;option&gt; 元素本身。我之前曾尝试使用&lt;option&gt; 元素进行一些显示/隐藏技巧,并发现会出现问题。这就是为什么我现在改用单独的、分类的&lt;select&gt; 方法。很抱歉造成混乱。
  • 有了选择应该不会有问题,我只是注意到你写了选项元素,并且这些类有像“隐藏”和“显示”这样的名称,我想我应该提到有有问题。
  • 我已经编辑了最后一段,试图更清楚地解释用法。再次抱歉。
【解决方案2】:

按顺序评论您的方法:

JavaScript — 尝试定位单个条目(工作)

这个正在工作(如你所说)。您可以使用类似的技术来获取 id-s 数组中的所有元素:

$(targets[0]).addClass('hide').removeClass('show');
$(targets.join(",")).addClass('hide').removeClass('show');

然而常见的方法是添加class属性而不是id。毕竟——记住——这就是课程的用途。任何 DOM 元素都可以(而且通常确实)有多个类。

<div id="one" class="number">1</div>
<div id="two" class="number">2</div>
<!-- ... and so on -->

上面两行变成等价于:

// These two lines are each equivalent to $(target[0])
$(".number").eq(0).addClass('hide').removeClass('show'); // or even...
$(".number")[0].addClass('hide').removeClass('show');

// This is equivalent to $(target.join(","))
$(".number").addClass('hide').removeClass('show');

JavaScript - 尝试定位所有条目我

.each 函数只能在 jQuery 对象上调用。您不能在数组上使用它,但可以使用 $.each 代替:

$.each(targets, function(idx, obj) {
    $(obj).addClass('hide').removeClass('show');
});

JavaScript - 尝试定位所有条目 II

当使用forEach 时,您需要(好吧,不是需要,但至少应该)使用传递给回调的参数:

targets.forEach(function(elt, idx, arr) {
    $(elt).addClass('hide').removeClass('show');
    // ... OR ...
    $(arr[idx]).addClass('hide').removeClass('show');
    // ... OR ...
    $(targets[idx]).addClass('hide').removeClass('show');
});

JavaScript - 尝试定位所有条目 III

$(targets) 不选择任何内容。它不会抛出错误(尽管它可能应该)。您可以使用 [index] 表示法访问数组元素:

for (var i = 0; i < targets.length; ++i ) {
    $(targets[i]).addClass('hide').removeClass('show');
}

【讨论】:

  • 哇,非常感谢。尝试 III 是我目前仍在使用的。您添加i 的简单修复就成功了。我的印象是targets 会选择所有内容,而不是什么都不选。我想这是一个使用数组的菜鸟的陷阱。另外,感谢@AlexandruSeverin 提供相同的答案。然而,@blgt 确实在数组 noob 的更清晰的上下文中解释了它!
  • Np,(III) 中的要点是 selector 必须是 string 类型;而在您的情况下,targets 的类型为object,这是所有数组的类型(字符串数组仍然不是string):)
【解决方案3】:

在您的 for 循环中,您每次都在查询整个列表,而不是特定元素,(将 [i] 添加到目标)

var i;
for ( i = 0; i < targets.length; ++i ) {
    $(targets[i]).addClass('hide').removeClass('show');
}

【讨论】:

    猜你喜欢
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    相关资源
    最近更新 更多