【问题标题】:Get index of class获取类索引
【发布时间】:2016-01-20 20:38:55
【问题描述】:

我正在尝试获取类中元素的索引。例如,如果我有一个名为 myClass 的类,它有 5 个元素,并且第四个元素的 id 为 fourth,我想从该类中获取 #fourth 的索引号。

我尝试像这样使用indexOf

var myClass = document.getElementsByClassName('myClass');
var fourth = document.getElementById('fourth');

console.log(myClass.indexOf(fourth));

但我收到一条错误消息:

未捕获的类型错误:myClass.indexOf 不是函数

JSFiddle

代码片段

var myClass = document.getElementsByClassName('myClass');
var fourth = document.getElementById('fourth');

console.log(myClass.indexOf(fourth));
<div class="myClass"></div>
<div class="myClass"></div>
<div class="myClass"></div>
<div class="myClass" id="fourth"></div>
<div class="myClass"></div>

然后我尝试创建自己的函数来从类中获取索引:

function indexInClass(node) {
    var className = node.className;
    var num = 0;
    for (var i = 0; i < className.length; i++) {
        if (className[i] === node) {
            return num;
        }
        num++;
    }
    return -1;
}

但是当我使用它时我会变得不确定。

如何获取类的索引?

JSFiddle

代码片段

var myClass = document.getElementsByClassName('myClass');
var fourth = document.getElementById('fourth');

function indexInClass(node) {
  var className = node.className;
  var num = 0;
  for (var i = 0; i < className.length; i++) {
    if (className[i] === node) {
      return num;
    }
    num++;
  }
  return -1;
}

console.log(myClass[indexInClass(fourth)]);
<div class="myClass"></div>
<div class="myClass"></div>
<div class="myClass"></div>
<div class="myClass" id="fourth"></div>
<div class="myClass"></div>

【问题讨论】:

  • “索引号”是什么意思?您在 DOM 节点上使用 indexOf...
  • @Raffaele, myClass 是 DOM 节点的集合,而不是单个 DOM 节点。
  • 不确定,但您可能需要遍历 myClass 并使用 .getattribute() 来检查当前元素是否具有“id”属性
  • 我知道这是一个 Javascript 问题,但以防万一有人感兴趣,您可以使用 CSS 使用计数器 (Codepen demo) 执行类似的操作。当然,您只能显示结果,而不能在 javascript 中访问它。 (在this post 中,我展示了一个概念证明示例)
  • @Danield 哇!我不知道! CSS 比我想象的更强大! Ani rotzeh lishol otcha shala. Ata yachol 给我发电子邮件?我的电子邮件在我的 stackoverflow 个人资料中。

标签: javascript


【解决方案1】:

getElementsByClassName 返回一个HTMLCollection,它没有indexOf 数组方法。

如果你可以访问Array.from,那么简单的解决方案是使用它将集合转换为数组并调用indexOf

Array.from(document.getElementsByClassName('myClass'))
    .indexOf(fourth); //3

如果你不能使用Array.from,那么Array.prototype.slice.call 应该可以工作:

Array.prototype.slice.call(document.getElementsByClassName('myClass'))
    .indexOf(fourth); //3

【讨论】:

    【解决方案2】:

    getElementsByClassName 返回一个 HTML 集合,而不是一个数组,因此您不能在其上使用 indexOf

    迭代元素是要走的路,但你的自定义函数的问题是这样的:

    for (var i = 0; i < className.length; i++) {
    

    您正在迭代 className,这是一个包含 node 的类名的字符串,而您应该迭代您的元素集合 myClass

    这是您的自定义函数已修复:

    var myClass = document.getElementsByClassName('myClass');
    var fourth = document.getElementById('fourth');
    
    function indexInClass(node) {
      var className = node.className;
      var num = 0;
      for (var i = 0; i < myClass.length; i++) {
        if (myClass[i] === node) {
          return num;
        }
        num++;
      }
      return -1;
    }
    
    console.log(myClass[indexInClass(fourth)]);
    <div class="myClass"></div>
    <div class="myClass"></div>
    <div class="myClass"></div>
    <div class="myClass" id="fourth"></div>
    <div class="myClass"></div>

    更新

    感谢您的回答!我想创建一个可以在任何地方使用的函数,意思是,不特定于 myClass。我怎样才能做到这一点?

    这是你的函数的一个稍微优化的版本:

    function indexInClass(collection, node) {
      for (var i = 0; i < collection.length; i++) {
        if (collection[i] === node)
          return i;
      }
      return -1;
    }
    
    var myClass = document.getElementsByClassName('myClass');
    var fourth = document.getElementById('fourth');
    
    alert("The ID is: " + indexInClass(myClass, fourth));
    <div class="myClass"></div>
    <div class="myClass"></div>
    <div class="myClass"></div>
    <div class="myClass" id="fourth"></div>
    <div class="myClass"></div>

    更新 2

    有没有办法在没有集合参数的情况下做到这一点?例如,有没有办法从 id 中获取类?

    function indexInClass(node) {
      var collection = document.getElementsByClassName(node.className);
      for (var i = 0; i < collection.length; i++) {
        if (collection[i] === node)
          return i;
      }
      return -1;
    }
    
    var fourth = document.getElementById('fourth');
    
    alert("The ID is: " + indexInClass(fourth));
    <div class="myClass"></div>
    <div class="myClass"></div>
    <div class="myClass"></div>
    <div class="myClass" id="fourth"></div>
    <div class="myClass"></div>

    小心.className,因为如果节点有一个类,它会正常工作。如果您期望更多,则需要从classNameclassList 中提取共同的。

    【讨论】:

    • 感谢您的回答!我想创建一个可以在任何地方使用的函数,这意味着,不是特定于myClass。我怎样才能做到这一点?
    • 不客气!好吧,您可以通过向其添加一个参数来扩展它 - 类名或 HTML 集合,以便您可以像这样调用您的函数,例如:indexInClass('myClassName', element); 这有意义吗?
    • 我会用什么替换 myClass.lenghtmyclass[i]
    • 您可以将其替换为正确的函数参数。看看我的更新是否有帮助。
    • @Jessica,这有意义吗?我们基本上只是传入元素集合和我们在该集合中寻找的特定元素,然后函数返回它的索引。
    【解决方案3】:

    您的自定义函数有正确的想法,您只是在迭代错误的变量。 Fiddle

    var myClass = document.getElementsByClassName('myClass');
    var fourth = document.getElementById('fourth');
    
    function indexInClass(node) {
        var className = node.className;
        var num = 0;
        for (var i = 0; i < myClass.length; i++) {
            if (myClass[i] === node) {
                return num;
            }
            num++;
        }
        return -1;
    }
    
    console.log(indexInClass(fourth));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多