让我们暂时假设我有这样的东西:
if (document.getElementById('div1').innerHTML &&
document.getElementById('div2').innerHTML &&
document.getElementById('div3').innerHTML &&
document.getElementById('div4').innerHTML &&
document.getElementById('div5').innerHTML &&
...
document.getElementById('div100').innerHTML)
显然,像这样输入和维护一条大的条件语句是有问题的。
我想要一些解决方案,例如:
var conditional = "";
for(var i = 1; i <= 100; i++){
conditional += "document.getElementById('div" + i +"').innerHTML";
if(i < 100) {
conditional += " && ";
}
}
if(interpretStringAsJSExpression(conditional)){
console.log("all my divs have content");
}
在JavaScript中这样的事情可能吗?
已提交了很好的答案,我相信我和其他人将从中受益。但是,纯粹出于好奇,是否可以在字符串中存储和运行JavaScript表达式或命令?
就像我在示例中所建议的:interpretStringAsJSExpression(conditional)
答案 0 :(得分:26)
您可以循环进行测试。
var allOK = true;
for (var i = 1; i <= 100; i++) {
if (!document.getElementById("div"+i).innerHTML) {
allOK = false;
break;
}
}
if (allOK) {
console.log("all my divs have content");
}
您还可以为所有DIV提供一个通用类,然后使用内置的迭代器。
var allDivs = document.getElementsByClassName("divClass");
if (Array.from(allDivs).every(div => div.innerHTML)) {
console.log("all my divs have content");
}
答案 1 :(得分:20)
如其他答案所述,您可以更轻松地解决条件问题。
但是,要回答您的新问题
纯粹出于好奇,可以存储和运行 JavaScript表达式或字符串命令?
是的,您可以将JavaScript代码编写为字符串,然后稍后使用eval执行它。如果您担心安全性或性能,则不应该这样做。
答案 2 :(得分:8)
为什么要解释一串代码?还有其他类似for
循环的方式:
var conditionResult = true;
for(var i = 1; conditionResult && (i < 101); i++) {
conditionResult = conditionResult && document.getElementById('div' + i).innerHTML;
}
if(conditionResult) {
// Do something here
}
一旦确定for
为虚假,conditionResult && (i < 101)
循环条件conditionResult
将中断循环。在这种情况下,无需继续循环。
如果元素在数组中,则还可以使用some
和every
之类的数组方法:
var arr = [/* array of DOM elements */];
var conditionResult = arr.every(elem => elem.innerHTML); // This is equivalent to (innerHTML && innerHTML && ...)
var conditionResult = arr.some(elem => elem.innerHTML); // This is equivalent to (innerHTML || innerHTML || ...)
答案 3 :(得分:2)
您可以将condition
设置为true
并进行检查,将condition
设置为false并在错误的情况下退出循环。
var conditional = true;
for(var i = 1; i <= 100; i++){
if (!document.getElementById('div' + i).innerHTML) {
condition = false;
break;
}
}
答案 4 :(得分:2)
使用 document.querySelectorAll 进行此类操作
// Get all the divs that have ids which start with div
var theDivs = document.querySelectorAll('[id^="div"]');
var i,l,el,divsWithContent = [];
// Loop through all theDivs
l = theDivs.length;
for(i = 0; i < l; i++) {
// el is the div
el = theDivs[i];
// Test to make sure the id is div followed by one or more digits
if (/^div\d+$/.test(el.id)) {
// If the div has something in it other than spaces, it's got content
if (el.textContent.trim() !== "") {
// Save the divs with content in the array
divsWithContent.push(el.id);
}
}
}
// Show the results
document.getElementById("result").textContent = divsWithContent.join("\n");
<h1>Div test</h1>
<div id="div1">This</div>
<div id="div2">that</div>
<div id="div3"></div>
<div id="div4">and</div>
<div id="div5">the other thing</div>
<h2>Divs with content</h2>
<pre id="result"></pre>
参考:https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll
答案 5 :(得分:1)
您可以将document.getElementById('divXX').innerHTML
个项目存储在一个数组中,然后使用
items.reduce((a, b) => a && b);
这样,您可以更改表达式中的各个div
元素,而不必重新创建整个列表
答案 6 :(得分:1)
eval
之外的另一种选择是使用Function构造函数。 Function
稍微灵活一点,可以让您保存编译后的代码,而不必每次都eval
。
但是,它们都具有类似的安全风险。
var conditional = "";
for(var i = 1; i <= 6; i++){
conditional += "document.getElementById('div" + i +"').innerHTML";
if(i < 6) {
conditional += " && ";
}
}
const f = new Function('return (' + conditional + ') !== ""');
console.log(f());
<div id="div1">1</div>
<div id="div2"></div>
<div id="div3">3</div>
<div id="div4">4</div>
<div id="div5"></div>
<div id="div6">6</div>