我正在尝试创建一个函数,通过id逐个获取所有元素,并将它们的id与className进行比较。
如果其中一个不同,则元素id'50's为e设置,否则(如果它们全部相等)元素的src e设置为Y.
问题是,如果元素id'50'== class'50',它会自动将src设置为Y,即使某些元素具有不同的id和class。
它似乎只测试最后一个元素,而不是测试所有元素。
function checking(){
for(var i = 1; i < 51; i++){
if(document.getElementById(''+i+'').id != document.getElementById(''+i+'').className){
document.getElementById('50').src = '../images/X.gif';
complete = false;
}
else{
document.getElementById('50').src = '../images/Y.jpg';
complete = true;
}
}
}
只有简单的Javascript。
欢迎任何建议!
答案 0 :(得分:1)
只测试最后一个(或者看起来如此),因为你永远不会停止循环。很自然地,它一直持续到结束,complete
是最后一个值集。
如果您想在将其设置为false
时停止,请使用break
甚至return
,因为此时您似乎已完成。
而且仅供参考,这是毫无意义的......
document.getElementById(''+i+'').id
与执行i
或技术i.toString()
相同。
所以重写你的代码,我们可以这样做:
function checking(){
for(var i = 1; i < 51; i++){
if(i != document.getElementById(i).className) {
document.getElementById('50').src = '../images/X.gif';
complete = false;
return;
}
}
document.getElementById('50').src = '../images/Y.jpg';
complete = true;
}
在这里,我摆脱了else
并将其代码放在循环下方。现在,如果存在不匹配,我们设置complete
并返回。如果没有找到不匹配,则在循环完成后循环后转到代码。
但是看起来你似乎在滥用变量。我们不知道complete
在哪里,但看起来你应该只返回所需的布尔值。
function checking(){
for(var i = 1; i < 51; i++){
if(i != document.getElementById(i).className) {
document.getElementById('50').src = '../images/X.gif';
return false;
}
}
document.getElementById('50').src = '../images/Y.jpg';
return true;
}
var complete = checking();
或者更简洁的方法是为所有ID创建一个选择器并使用.every()
。
var sel = "#" + Array.apply(null, 50).map(function(_, i) { return i+1; }).join(",#");
var complete = [].every.call(document.querySelectorAll(sel), function(el) {
return el.id === el.className;
});
document.getElementById('50').src = '../images/' + (complete ? 'Y.jpg' : 'X.jpg');
答案 1 :(得分:1)
您可以在进入循环之前设置src
属性,只有在id
和className
属性不匹配时才能更改它。一旦发现不匹配,您还需要break
或return
:
function checking() {
var fifty = document.getElementById('50');
fifty.src = '../images/Y.jpg';
for (var i = 1; i < 51; i++) {
var e = document.getElementById(i);
if (e.id != e.className) {
fifty.src = '../images/X.gif';
return;
}
}
}