从文档就绪事件中的导入模块调用函数是否安全?

内维尔·洛博托姆

我想在渲染 DOM 时从导入的模块中调用一个函数。让我怀疑其安全性的原因是模块文件是异步获取的。因此,我担心的是:是否有可能在文档准备好后获取所需的模块文件?

import someModule from '../someModule.js'

$( document ).ready(function() {
    someModule.hello();
});

这段代码安全吗?

一定的表现

该代码是安全的。

如果您使用的是 DOMContentLoaded 而不是$(document).ready,则可能需要担心。模块是异步加载的,模块本身导入的所有内容都是在模块主体运行之前加载的。那是:

import someModule from '../someModule.js'

将首先解析为someModule导出的值,然后模块的其余部分才会运行:

$( document ).ready(function() {
    someModule.hello();
});

文档的其余部分可能在那个时候已经完成加载,尤其是在依赖关系树中更高的导入链,并且源 HTML 很短的情况下。

但是 $(document).ready不仅会在文档准备好时运行它的回调,如果文档已经准备好它也会运行它的回调 - 可以使用document.readyState.

例子:

setTimeout(() => {
  // the document will have been fully loaded for ages now,
  // but the callback will still run:
  $(() => {
    console.log('running');
  });
}, 5000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

如果您使用的是 DOMContentLoaded ,为了安全起见,您需要使用

if (document.readyState === 'complete') {
  someModule.hello();
} else {
  window.addEventListener('DOMContentLoaded', () => someModule.hello());
}

另请注意,在 jQuery 中,当文档准备好时调度回调的首选现代方法是将回调传递给$

$(() => {
    someModule.hello();
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我在 viewModel 中的函数在文档就绪时被调用?

从导入模块中的父模块调用函数

如何在 Jquery 文档就绪函数中触发复选框单击事件?

jQuery在声明于文档就绪之外但从内部调用的函数中

Javascript按钮onclick事件以调用模块中函数内部的函数

在javascript中创建就绪函数时调用

JavaScript中是否有语音或语音就绪事件?

通过 jquery 在单个函数中触发更改和就绪事件

从导入模块重新定义调用的函数

模拟导入模块时调用的函数

从导入的模块调试 python 函数调用

是否可以在角度4的onclick事件中从服务调用函数

当我们仅从模块顶部调用函数时,是否会导入模块顶部的软件包?

Ajax加载的JavaScript上的文档就绪事件

是否可以在 C# 中监听函数调用(即将 C# 函数调用视为事件)?

自调用函数作为jQuery文档准备就绪的回调

jQuery文档准备就绪,并按键调用一个函数

在导入模块之前,正在从模块调用函数

在Rust 2018中跨模块调用函数时出现“未解决的导入”

无法从导入为类型模块的js文件中调用函数

在 ruby 模块中调用模块函数

构造函数中的事件调用

通过显式调用.off()删除jQuery中的.one()事件处理程序是否安全?

无法从导入的函数中调用函数

Python从导入的模块中模拟函数

Python从导入的模块中模拟函数

在两个函数中使用时,在文档就绪冲突中取消绑定jQuery

如何从导入的模块内部调用函数,也称为设计问题

从QThread派生的类的析构函数中手动调用终止()和退出()是否安全?