文档.写入和委托事件处理程序持久性
document.write and delegated event handler persistence
我只是在测试使用 JavaScript 用另一个页面替换整个页面,我找到了这个答案 document.write
.至于为什么document.write
,我需要替换整个 HTML,包括使用同一页面的脚本和样式。
它做了我想要的,但我似乎无法与我的事件处理程序保持一致。我的处理程序都连接到document
使用以下方法:
$(document).delegate(...);
目前,我有奇怪的结果。在我制作的小提琴中,它附加了一个处理程序。单击时,事件将触发,重写页面,再次运行函数 - 但它不会附加处理程序。
但是在我的项目中,我正在执行相同的例程(d.w()
,然后添加处理程序)。它确实重新附加一次并且处理程序工作,但在执行第二个例程(仍在同一页面上)后,它不再附加。
所以我的问题是:
- 使用
d.w()
时,现有的处理程序是否会从document
中删除? - 在随后的
d.w()
之后,window
和document
是否相同? 还是以某种方式"更新" - 已解析的脚本是否保留在内存中并在后续
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
.
所以:
- 是的
- 它们仍然是相同的对象,可以通过保存引用并在
.open
后检查 agaistdocument
来进行测试 - 他们留在记忆中。
http://jsfiddle.net/wphzt/4/
它从第二次开始停止工作的唯一原因是因为你在你的函数中编写了
document.write('<span>'+(++i)+'</span>');
在这种情况下,下次文档没有委托函数来增加范围值,而只有您在我上面强调的代码片段中编写的内容。因此,正如您所怀疑的,是的,它们也会被删除。希望这有帮助。
- keyup事件处理程序更改焦点不适用于快速键入
- 提示使用服务器端事件处理程序激活JavaScript
- 将事件处理程序绑定到任何可能的事件
- 正在将事件处理程序添加到不存在的类
- 在循环中附加事件处理程序时出现浏览器性能问题
- 在同一个javascript事件处理程序中调用不同的函数
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 检查事件处理程序参数
- 实现延迟的jquery更改事件处理程序
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- 带有参数的Javascript事件处理程序
- Jquery事件处理程序仅适用于匿名函数
- 如何从另一个处理程序内部取消JavaScript事件处理程序函数的执行
- 如何在jQuery事件处理程序中存储和重用超时
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 异步处理所有事件处理程序的方法
- jsplumb中的Click事件处理程序丢失“;这个“;对象
- 构造函数中的事件处理程序与构造函数外的事件处理函数的行为不同
- 如何在事件处理程序的回调中防止Default