6

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

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

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

(将它们视为更大的东西的一部分,其中文本区域必须从 JavaScript 生成,并且不能硬编码到页面中)。它们都产生相同的输出,但前者被认为是“坏”的,而后者被认为是“正确”的做法。(对?)

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

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

4

4 回答 4

5

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

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

于 2008-12-15T02:42:15.227 回答
4

只要在呈现页面时内联执行 document.write() ,它就不会删除页面内容。在线广告广泛使用 document.write() 在页面加载时将广告动态写入页面。

但是,如果您稍后在页面历史记录中执行 document.write() 方法(在正文完全呈现后),那么正如 Chase 所说,它将吹走现有正文并将参数显示给 document.write() .

除此之外,我同意保留表单行为确实是特定于浏览器的,在很多情况下你不应该依赖它。这是一个帮助用户的功能,而不是开发人员需要了解或尝试使用的功能。

于 2008-12-21T19:42:25.270 回答
0

您是否可以添加一个可以用来将新文本区域定位到的钩子?例如。一个 <div>

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

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

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

于 2008-12-15T10:40:21.673 回答
0

通常,我更喜欢创建一个 DOM 元素并插入它——尤其是因为我可以将它准确地插入到页面中我想要的位置(即使用 object.appendChild 或 body.appendChild)。插入是在页面加载期间还是稍后插入也没有关系,因此我可以使用通用插入函数并在整个页面加载期间或之后随时使用它。

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

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

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

于 2011-09-27T16:07:37.433 回答