文档.写入和委托事件处理程序持久性

document.write and delegated event handler persistence

本文关键字:事件处理 程序 持久性 文档      更新时间:2023-09-26

我只是在测试使用 JavaScript 用另一个页面替换整个页面,我找到了这个答案 document.write .至于为什么document.write,我需要替换整个 HTML,包括使用同一页面的脚本和样式。

它做了我想要的,但我似乎无法与我的事件处理程序保持一致。我的处理程序都连接到document使用以下方法:

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

目前,我有奇怪的结果。在我制作的小提琴中,它附加了一个处理程序。单击时,事件将触发,重写页面,再次运行函数 - 但它不会附加处理程序。

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

所以我的问题是:

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

(以下内容适用于谷歌浏览器)

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

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

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

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

现在,由于document.open删除了本机处理程序,但没有清除javascript,jQuery仍然认为本机处理程序存在,并且进一步.delegate仅转到jQuery内部处理程序数组。如果您用普通的旧document.onclick替换处理程序,您将看到它开始工作。

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

所以:

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

http://jsfiddle.net/wphzt/4/

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

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

在这种情况下,下次文档没有委托函数来增加范围值,而只有您在我上面强调的代码片段中编写的内容。因此,正如您所怀疑的,是的,它们也会被删除。希望这有帮助。