Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问具有公共类名的元素数组中元素的索引_Javascript - Fatal编程技术网

Javascript 访问具有公共类名的元素数组中元素的索引

Javascript 访问具有公共类名的元素数组中元素的索引,javascript,Javascript,正如我在主题中所说的,当我试图查找数组中某个元素的索引时,该数组是由代码为document.getELementsByClassName(“blabla”)的具有公共类名的元素创建的 var a、b、pe; a=document.getElementById(“a”); b=document.getElementById(“b”); pe=document.getElementsByClassName(“o”); var k=指数(b); 警报(k) 正如许多人所指出的文档返回节点列表而不是

正如我在主题中所说的,当我试图查找数组中某个元素的索引时,该数组是由代码为document.getELementsByClassName(“blabla”)的具有公共类名的元素创建的

var a、b、pe;
a=document.getElementById(“a”);
b=document.getElementById(“b”);
pe=document.getElementsByClassName(“o”);
var k=指数(b);
警报(k)


正如许多人所指出的
文档返回节点列表而不是数组。因此,您不能利用本机数组方法,如
indexOf
forEach
。从:

NodeList的使用非常类似于数组,在其上使用Array.prototype方法很有诱惑力,但是它们没有这些方法。JavaScript有一种基于内置对象(如数组)和宿主对象(如NodeLists)原型的继承机制。数组实例继承数组方法(如forEach或map),因为它们的原型链如下所示:

var k = Array.prototype.indexOf.call(pe,b);
也就是说,您基本上希望将节点列表转换为数组。你可以这样做:

var turnObjToArray = function(obj) {
  return [].map.call(obj, function(element) {
   return element;
 })
};

var a=document.getElementById("a");    
var b=document.getElementById("b");
var pe=document.getElementsByClassName("o");
var listBox = turnObjToArray(pe);
console.log(listBox);
alert(listBox.indexOf(a)); //Normal array methods can be used here.


希望它能让您从正确的方向开始。

这个过程可以通过多种方式完成,但根据我的说法,您也可以按照以下方式完成,但我仍然建议使用jquery。 我只是写了一些你能理解的代码

我使用querySelectorAll,它返回所有包含类o的元素。 因为并非所有浏览器都支持getElementByClass名称:请检查此链接:

循环遍历所有对象并匹配对象

var a=document.getElementById(“a”);
var b=document.getElementById(“b”);
var v=document.getElementById(“v”);
var pe=document.querySelectorAll('.o');
(我在体育课)
{
如果(v==pe[i])
{
警报(“发现索引”+i);
}
}


由于从getElementsByClassName返回的对象是“类似数组的”,因此可以执行以下操作:

var k = Array.prototype.indexOf.call(pe,b);
因为pe是“类似于数组的”,indexOf可以工作,但您必须直接从array.prototype调用,然后使用设置调用对象(
this

从GetElementsByCassName返回的对象是HTMLCollection。要查看如何使用此对象,可以查看

未来提示:在Chrome中按F12键或右键单击任何元素并选择“检查元素”。这将打开开发工具,在console选项卡中,您将看到错误

您会看到pe没有名为indexOf的函数,因为它不是Array的实例,而indexOf位于Array.prototype上


有关原型和构造函数的详细信息(数组是本机构造函数)。

HTMLCollections没有
indexOf
方法。另外,在问题中张贴代码。如果你不能发布链接是有原因的。请将相关代码粘贴到你的问题中。外部引用可能会有所帮助,但不能成为问题代码的唯一来源。为什么不使用jquery?似乎有点冗长,我会使用
toArray=Array.call.bind([].slice)