Javascript document.GetElementsByCassName返回未定义

Javascript document.GetElementsByCassName返回未定义,javascript,html,Javascript,Html,我有一个函数,它应该非常简单,应该在加载后完成,以减少初始加载时间 基本上,我使用这段代码来获取类为“prefImg”的所有元素,并对它们执行一些操作。但是在firebug中调试时,它会说var divsList未定义 function populatePrefsList() { var divsList = new Array(); divsList = document.getElementsByClassName("prefImg");

我有一个函数,它应该非常简单,应该在加载后完成,以减少初始加载时间

基本上,我使用这段代码来获取类为“prefImg”的所有元素,并对它们执行一些操作。但是在firebug中调试时,它会说var divsList未定义

function populatePrefsList()
    {
        var divsList = new Array();
        divsList = document.getElementsByClassName("prefImg");
        var x = divsList.length;
        var i = 0;
        for(i=0; i<divsList.length; i++) {
            var imgs = divsList[i].getElementsByTagName("img");
            var imgSRC = imgs[0].src;
            var alt = imgs[0].alt;
            var descs = divsList[i].getElementsByTagName("h4");
            var desc = descs[0].innerHTML;
            //var thisPref = new preference(imgSRC, alt, desc);
            //prefsList[i] = thisPref;
        }
    }
函数populatePrefsList()
{
var divsList=新数组();
divsList=document.getElementsByClassName(“prefImg”);
var x=divsList.length;
var i=0;

对于(i=0;i这不是所有浏览器都支持的…任何不支持它的浏览器,您都必须实现自己的

function getElementsByClassName(node,classname) {
    if (node.getElementsByClassName)
        return node.getElementsByClassName(classname);
    else {
        // custom
    }
}

您可以使用querySelectorAll代替getElementsByClassName:

更改
divsList=document.getElementsByClassName(“prefImg”);

对此
divsList=document.queryselectoral(“.prefImg”);

演示-

顺便说一句,设置数组divsList之前不需要声明它。只需执行以下操作:

var divsList = document.querySelectorAll(".prefImg");

可以使用eventhandler加载窗口对象的load事件,以便仅在窗口完成加载时运行脚本

 function populatePrefsList()
  {
    var divsList = new Array();
    divsList = document.getElementsByClassName("prefImg");
    var x = divsList.length;
    var i = 0;
    for(i=0; i<divsList.length; i++) {
        var imgs = divsList[i].getElementsByTagName("img");
        var imgSRC = imgs[0].src;
        var alt = imgs[0].alt;
        var descs = divsList[i].getElementsByTagName("h4");
        var desc = descs[0].innerHTML;
        //var thisPref = new preference(imgSRC, alt, desc);
        //prefsList[i] = thisPref;
    }
}


 window.onload = function(){
 populatePrefsList();
}
函数populatePrefsList()
{
var divsList=新数组();
divsList=document.getElementsByClassName(“prefImg”);
var x=divsList.length;
var i=0;
for(i=0;i较旧的浏览器(如IE6、IE7、IE8)不支持GetElementsByCassName,因此它们返回
未定义的

在较新的浏览器中,返回值从不
未定义
主要是
HTMLCollection
(但在W3C规范之后,它应该是
NodeList

但我认为在你的案例中,真正的问题是Firebug中的一个bug:


它已修复,并且提交了一个修补程序,并且将成为Firebug 1.10a6的一部分。请不要在头部编写此代码。。 因为这意味着身体还没有加载。 在你的身体标签或使用结束时做-

window.addEventListener(“加载”,函数()
{
//代码在这里

});

因为它返回一个HTMLCollection,所以您应该在行的末尾添加一个
[number]

divsList = document.getElementsByClassName("prefImg")[0];
此外,最好在全部加载后,使用以下命令加载此函数:

window.load = function() {
    populatePrefsList();
}

您是否正在使用Firebug在FF 3+中调试此脚本?您使用的浏览器是FF吗?是的,Firebug 1.9.2的最新FF。使用此
var divsList=[];
而不是此
var divsList=new Array()
它仍然声称未定义,但有趣的是,它现在声称它的长度为48,这可能意味着它已定义,这是Firebug的问题?注意,它在实际功能方面也在工作。调试它只是有点痛苦。我不确定这是如何回答这个问题的。因此对于调试程序,querySelectorAll返回的结果集合显示为未定义。我认为这是因为返回的值是节点列表而不是标准数组。