2

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

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

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

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

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

所以我的问题是:

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

2 回答 2

6

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

只有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 = {};的 ,但这是内部的,可能会更改),您也可以继续使用 jQuery .delegate,以便再次同步 jQuery。否则它不会,因为它不知道你打电话给document.open.

所以:

  1. 是的
  2. 它们仍然是相同的对象,可以通过保存引用并document在 a.open
  3. 他们留在记忆中。

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

于 2012-05-26T14:07:43.520 回答
0

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

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

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

于 2012-05-26T14:06:53.720 回答