我的常规javascript代码似乎是错误地或以错误的顺序输出到页面的东西,这很奇怪,因为代码非常简单(可能是20行顶部)。我的代码如下。注意:
pttr_data.length
将返回150 clean_array.length
将返回4. output
是一个div对象,即var output = document.getElementById(“results”); 我希望我的代码输出如下:
<div>matcha matchb matchc matchn </div>
但它会返回:
<div/>matcha matchb matchc match
这是我的代码,我在其中放置随机字符以找出内容的位置(你会在div周围看到;;;, |||, [[[, }}}
):
var len = pttr_data.length;
for (var i = 0; i < len; i++) {
var clean_array = pttr_data[i].match(RegExp(rexp.value, flags.value));
output.innerHTML += ";;;<div>|||";
var lengthy = clean_array.length;
for (var j = 1; j < lengthy; j++) {
if( clean_array[j] ) { output.innerHTML += clean_array[j] + ' '; }
else { output.innerHTML += 'NULL '; }
}
out.innerHTML += "[[[</div>}}}\n";
}
此代码返回:
;;;<div>|||</div>matcha matchb matchc [[[}}}
有人可以解释为什么会这样吗? javascript for循环是否独立运行(因此以不同的速度完成),即使它们是嵌套的?这没有任何意义,为什么有人会设计这样的脚本语言?
我的代码如何输出<div/>blah
而不是<div>blah</div>
?
由于
答案 0 :(得分:2)
.innerHTML
属性比您可以追加的字符串更复杂一些。如果您向其添加"<div>"
(或示例中为";;;<div>|||"
),则浏览器不会等待您是否最终提供结束</div>
标记,它只会创建一个div立即。然后添加更多文字:"matcha", "matchb", etc
。最后你追加一个浏览器忽略的结束</div>
,因为它再次没有等待它,但它保留了"[[[}}}"
。
不要追加到.innerHTML
,而是附加到字符串变量,然后在最后将.innerHTML
设置为等于该字符串。
如果您要将clean_array
的所有元素追加为空格,您甚至不需要for
循环,则只需使用.join()
:
output.innerHTML = "<div>" + clean_array.join(" ") + "</div>";
// or for all from index 1
output.innerHTML = "<div>" + clean_array.slice(1).join(" ") + "</div>";
但要保持嵌套for循环:
var len = pttr_data.length,
outputStr = ""; // use a string variable
for (var i = 0; i < len; i++) {
var clean_array = pttr_data[i].match(RegExp(rexp.value, flags.value));
outputStr += ";;;<div>|||";
var lengthy = clean_array.length;
for (var j = 1; j < lengthy; j++) {
// I think ternary conditional is neater than if/else
outputStr += clean_array[j] ? clean_array[j] + ' ' : 'NULL ';
}
outputStr += "[[[</div>}}}\n";
}
output.innerHTML += outputStr;