document.write和委托事件处理程序持久性

时间:2012-05-26 13:41:44

标签: javascript

我只是尝试使用JavaScript替换整个页面,将I found this answer替换为document.write。至于为什么document.write,我需要使用同一页面替换整个HTML,包括脚本和样式。

它做了我想要的但我似乎无法与我的事件处理程序保持一致。我的处理程序都使用以下内容附加到document

$(document).delegate(...);

目前,我的结果很奇怪。 In a fiddle I made,它附加了一个处理程序。单击时,事件将触发,重写页面,再次运行该函数 - 但它不会附加处理程序。

但是在我的项目中,我正在执行相同的例程(d.w(),然后添加处理程序)。它确实重新连接一次并且处理程序工作,但在执行第二个例程(仍然在同一页面上)后,它不再附加。

所以我的问题是:

  • 使用d.w()时,现有的处理程序是否会从document
  • 中删除
  • window之后,documentd.w()是否相同?或者他们以某种方式“更新”
  • 已解析的脚本是否会留在内存中并在后续d.w()之后运行?或者它们也会被删除?

2 个答案:

答案 0 :(得分:6)

(以下适用于Google Chrome)

仅清除document,内存中的脚本仍然保持不变。您可以通过将某些内容设置为变量来轻松测试它,并在使用.open清除文档后查看它是否存在。

旧的本机处理程序因此从文档中丢失,但jQuery仍然认为处理程序存在于其自己的事件模型中。您可以通过将日志编辑为:

来查看
console.log('patch', JSON.stringify($.cache ));

jQuery每个事件只附加一个本机处理程序,因此如果在"click"上注册了document事件,则附加了jQuery的其他处理程序不会附加新的本机处理程序,而是附加处理程序被推入jQuery内部处理程序数组。

现在,因为document.open删除了本机处理程序,但是没有清除javascript,jQuery仍然认为本机处理程序存在,而且.delegate只进入jQuery内部处理程序数组。如果用普通的document.onclick替换你的处理程序,你会看到它开始工作。

如果你在$(document).unbind()之前添加$.cache = {};(或更健壮的.delegate,但这是内部的并且可能会发生变化),你也可以继续使用jQuery,以便再次同步jQuery 。否则它不会,因为它不知道你打电话给document.open

所以:

  1. 它们仍然是相同的对象,可以通过保存引用并在document
  2. 之后检查agaist .open进行测试
  3. 他们留在记忆中。
  4. http://jsfiddle.net/wphzt/4/

答案 1 :(得分:0)

它从第二次开始停止工作的唯一原因是因为在你的功能中你写了

document.write('<span>'+(++i)+'</span>');

在这种情况下,下次文档没有委托功能来增加跨度值,但只有你在我上面突出显示的代码片段中写的内容。因此,当你怀疑时,是的,它们也会被删除。希望这会有所帮助。