document.write()vs插入DOM节点:保留表单信息?

时间:2008-12-15 00:40:11

标签: javascript firefox usability

考虑两个网页,分别在其正文中包含以下内容:

<body>
<script>
document.writeln('<textarea></textarea>')
</script>
</body>

<body>
<script>
var t = document.createElement('textarea');
document.body.appendChild(t);
</script>
</body>

(将它们视为更大的一部分,其中textareas 具有从JavaScript生成并且无法硬编码到页面中)。它们都产生相同的输出,但前者被认为是“坏”,而后者被认为是“正确”的方式。 (右?)

另一方面,如果你在页面中键入内容然后刷新它,或者去其他地方然后点击Back,那么在前一种情况下,你在textarea中输入的内容会被保留,而在后面它是丢失。 (至少在Firefox上。)

有没有办法使用后一种方法,并且仍然具有有用的功能,即即使用户意外点击刷新或通过“后退”按钮返回(至少在Firefox上),用户输入表单的内容也会保存? / p>

4 个答案:

答案 0 :(得分:5)

我相信document.write版本实际上会破坏页面上的现有内容。即,身体和脚本标签将不再存在。这就是为什么人们通常使用appendChild。

保持文本与否是非常特定于浏览器的。我不打赌Firefox在将来的版本中也不会改变它的行为。当用户尝试离开页面并且编辑字段中有未保存的内容时,我建议实施警报对话框。通常你会在卸载事件中这样做。

答案 1 :(得分:4)

只要在呈现页面时内联执行,

document.write()就不会吹掉页面内容。在线广告广泛使用document.write()在广告加载时动态地将广告写入页面。

但是,如果你稍后在页面历史中执行了document.write()方法(在完全渲染主体之后),那么就像Chase所说的那样,它会吹走现有的主体并将参数显示给文档。写()。

除此之外,我同意保留表单行为非常适合浏览器,而不是在很多情况下你应该依赖的东西。它是帮助用户的功能,而不是开发人员了解或尝试使用的功能。

答案 2 :(得分:0)

通常,我更喜欢创建一个DOM元素并插入它 - 特别是因为我可以将它完全插入到我想要的页面中(即使用object.appendChild或body.appendChild)。插入是在页面加载期间还是以后也无关紧要因此我可以使用通用插入功能并在整页加载期间或之后的任何时间使用它。

但是,在加载过程中,如果要插入包含javascript的内容(即SCRIPT类型=“text / javascvript”....... / SCRIPT序列),则必须使用document.write才能让脚本执行。

  • 使用document.body.appendChild(theInsertionObject)将正确添加 在加载过程中的当前点插入包括 SCRIPT标记序列,但它不会执行javascript。

  • 如果使用document.write(theInsertionCode),代码将是 插入在加载过程中的当前点,以及任何嵌入的 SCRIPT标签序列将在页面的其余部分之前执行 载入。

答案 3 :(得分:0)

您是否可以添加一个可用于将新textarea定位到的钩子?例如。 a&lt; div&gt;

<div id="addtextarea"></div>

var e = document.getElementByID('addtextarea');
e.innerHTML = '<textarea></textarea>';

然后,如果您需要记住内容,您可以使用innerHTML值来包含HTML,或者只使用textarea的文本节点值来提取文本。