Javascript document.GetElementsByCassName返回未定义
我有一个函数,它应该非常简单,应该在加载后完成,以减少初始加载时间 基本上,我使用这段代码来获取类为“prefImg”的所有元素,并对它们执行一些操作。但是在firebug中调试时,它会说var divsList未定义Javascript document.GetElementsByCassName返回未定义,javascript,html,Javascript,Html,我有一个函数,它应该非常简单,应该在加载后完成,以减少初始加载时间 基本上,我使用这段代码来获取类为“prefImg”的所有元素,并对它们执行一些操作。但是在firebug中调试时,它会说var divsList未定义 function populatePrefsList() { var divsList = new Array(); divsList = document.getElementsByClassName("prefImg");
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返回的结果集合显示为未定义。我认为这是因为返回的值是节点列表而不是标准数组。