我是Web应用程序的新手,目前正在开发Web应用程序时尝试一些漂亮的新技术和框架。

最近,我通过使用jquery.load()在运行时重新加载页面的一部分而转向了一页应用程序。

到目前为止,我已经在部分网页中嵌入了脚本,并使用自定义事件对其进行了初始化,而不是使用$('document')。ready(),在使用加载时不会触发该脚本。

现在,我想知道当他们的脚本标记所驻留的页面部分被另一个页面片段替换时,我的javascript代码实际上发生了什么。

显然,脚本标签DOM元素已被丢弃,但是函数,变量,处理程序等发生了什么?它们仍然可用,还是我现在注册的处理程序未定义,并在触发它们时引发异常?

目前,我正在查看require.js,但我想知道这是否会(取决于上述问题的答案)是否会更改脚本的生命周期,因为由require.js加载脚本时,它们未绑定到可能是丢弃了?

干杯托马斯

最佳答案

当浏览器解析<script>标记时,所有操作都将停止,并对代码进行评估。一旦开始执行,<script>标记就无关紧要-甚至可以通过包含的代码将其删除。如果脚本创建了任何全局变量,它们将保留在全局变量空间中;如果定义了功能,同上;如果它绑定了一些听众,他们将继续听。删除脚本不会影响全局空间(特别是不会倒退时间并不会擦除脚本执行产生的任何更改)。

像Require.js这样的动态JS加载程序可以做到这一点:通过AJAX提取代码文本,创建脚本元素,然后将其插入文档,这使得浏览器可以执行上述操作。唯一的区别是发生这种情况的时间:一个<script>标记会暂停所有操作,直到代码执行为止(除非它被defer标记),而Require.js处理每个脚本的执行时间(并为您提供依赖项解析以进行控制)该时间)。

大多数应用程序最好不要在AJAX页面中加载JS,这仅仅是因为-正如您所发现-加载AJAX的JS不会自动清除自身,而是应用从您在主页中加载的JS中提取的功能。但是,这不是一项牢不可破的法律。

10-06 07:50
查看更多