我只是尝试使用JavaScript替换整个页面,将I found this answer替换为document.write
。至于为什么document.write
,我需要使用同一页面替换整个HTML,包括脚本和样式。
它做了我想要的但我似乎无法与我的事件处理程序保持一致。我的处理程序都使用以下内容附加到document
$(document).delegate(...);
目前,我的结果很奇怪。 In a fiddle I made,它附加了一个处理程序。单击时,事件将触发,重写页面,再次运行该函数 - 但它不会附加处理程序。
但是在我的项目中,我正在执行相同的例程(d.w()
,然后添加处理程序)。它确实重新连接一次并且处理程序工作,但在执行第二个例程(仍然在同一页面上)后,它不再附加。
所以我的问题是:
d.w()
时,现有的处理程序是否会从document
?window
之后,document
和d.w()
是否相同?或者他们以某种方式“更新”d.w()
之后运行?或者它们也会被删除?答案 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
。
所以:
document
.open
进行测试
答案 1 :(得分:0)
它从第二次开始停止工作的唯一原因是因为在你的功能中你写了
document.write('<span>'+(++i)+'</span>');
在这种情况下,下次文档没有委托功能来增加跨度值,但只有你在我上面突出显示的代码片段中写的内容。因此,当你怀疑时,是的,它们也会被删除。希望这会有所帮助。