Javascript函数以一种意想不到的方式工作
Javascript function works in unexpected way
我有一个javascript函数"doAll",它应该写入放在<p>, </p>
标记之间的所有文本。在我的代码中,它有两种使用方式。
当我在页面末尾调用它时,它工作正常。然而,当点击按钮事件发生时,它也应该被触发。由于某种原因,它这次没有做它应该做的事情。当单击按钮时,它只打印第一个<p>...</p>
html元素的内部html。
我的问题是,为什么它在这两种情况下的工作方式不同,以及我应该如何解决这个问题。
<!DOCTYPE html>
<html>
<head>
<script>
function returnList(x)
{
return document.getElementsByTagName(x);
}
function writeList(x)
{
var i = 0;
while (x[i])
{
document.write(x[i++].innerHTML + '<br/>');
}
}
function doAll(x)
{
writeList(returnList(x));
}
</script>
</head>
<body>
<p>XXX</p>
<p>YYY</p>
<div style = 'background-color: gray;'>
<p>YYY</p>
<p>XXX</p>
</div>
<button type = 'button' onclick = "doAll('p')">
Click me!
</button>
<script>
document.write('<br/>');
doAll('p');
</script>
</body>
</html>
这是"输出":
XXX
YYY
YYY
XXX
XXX
YYY
YYY
XXX
点击按钮后可以看到以下内容:
XXX
问题是,当您单击按钮时,页面已经呈现。此时触发document.write()
将覆盖整个文档。它写入第一个元素,因为当您触发函数时,这是唯一仍然存在的元素。在第一次执行CCD_ 4之后,任何其他元素都将不存在。
甚至您的函数本身也将不再是文档的一部分。如果您的MUST
使用document.write()
,或者您只是想出于测试原因使用它,您必须以某种方式"缓存"数据并立即输出:
function writeList(x) {
var i = 0, data = "";
while (x[i]) {
data += x[i++].innerHTML + '<br/>';
}
document.write(data);
}
document.write
只能将内容写入当前加载的文档。加载后,它的行为会有所不同-请参阅https://developer.mozilla.org/en-US/docs/Web/API/document.write。使用特殊的容器元素和innerHTML
来编写所需的输出。
function writeList(list) {
var i, result = "";
for (i = 0; i < list.length; i++) {
result += list[i].innerHTML + "<br />";
}
document.getElementById("myContainer").innerHTML = result;
}
http://jsfiddle.net/3yPAW/1/
其他两个答案解释了为什么,我建议您如何避免这种情况:
将HTML附加到正文(或其他元素)的innerHTML
;
而不是
document.write(x[i++].innerHTML + '<br/>');
使用
document.getElementsByTagName("body")[0].innerHTML += x[i++].innerHTML + '<br/>';
演示:http://jsfiddle.net/MNCbx/
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- 有没有一种方法可以仅使用HTML/CSS来隐藏基于特定值的数据单元格
- 有没有一种方法可以从URL跟踪请求的域
- 有没有一种方法可以列出Ember.Object的所有绑定
- 有没有一种方法可以获得three.js的最小/lite版本
- 有没有一种方法可以在没有文档或jQuery的情况下使用javascript解码html实体
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 有没有一种方法可以从Javascript检测特定的应用程序是否安装在(AndroidiOS)设备上
- 只能存储一种类型的对象的数组
- 在HTML/JavaScript中,有没有一种方法可以在图像开始加载时知道图像的最终布局尺寸
- 有没有一种方法可以在Javascript中进行可变递归currying
- 有没有一种方法可以检测ios<>使用jquery和触发器操作形成导航按钮
- 使用while循环+break是一种可接受的方式;goto;手术的结束
- Javascript函数以一种意想不到的方式工作
- KnockoutJS的select会以一种意想不到的方式影响可观察对象,这取决于select是什么时候创建的