gpt4 book ai didi

javascript - document.write 和委托(delegate)事件处理程序持久化

转载 作者:行者123 更新时间:2023-11-29 16:20:38 25 4
gpt4 key购买 nike

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

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

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

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

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

所以我的问题是:

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

最佳答案

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

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

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

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

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

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

如果添加 $(document).unbind()(或更健壮的 $.cache = {};,您还可以继续使用 jQuery,但这是内部的并随时更改)在 .delegate 之前,以便再次同步 jQuery。否则它不会,因为它不知道您调用了 document.open

所以:

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

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

关于javascript - document.write 和委托(delegate)事件处理程序持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10766750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com