【发布时间】:2019-01-15 20:51:16
【问题描述】:
我无法让 jquery 的 $.getScript 工作。这是一个测试文件,demo.html:
<!DOCTYPE html>
<script src="/xyz/scripts/jquery-1.11.0.min.js"></script>
<script>
function wow() { return 3; }
</script>
<h1>Demo</h1>
<script>
console.log(wow);
console.log(wow());
</script>
当我在 Windows 10 上的 Chrome 中浏览到此内容时,控制台中会显示以下内容:
Navigated to https://example.org/xyz/tools/demo.html
demo.html:11 ƒ wow() { return 3; }
demo.html:12 3
这是正确的。
然后我将函数定义移动到一个名为 myModule.js 的文件中:
function wow() { return 3; }
并创建demo2.html,即demo.html,其中函数定义被getScript调用替换:
<!DOCTYPE html>
<script src="/xyz/scripts/jquery-1.11.0.min.js"></script>
<script>
$.getScript("myModule.js");
</script>
<h1>Demo</h1>
<script>
console.log(wow);
console.log(wow());
</script>
这次我明白了
Navigated to https://example.org/xyz/tools/demo2.html
demo2.html:11 Uncaught ReferenceError: wow is not defined
at demo2.html:11
我是否误解了 $.getScript 的用途或使用方式?
附录
为了响应将我的 console.log 调用包装在 $.ready 包装器中的建议,我尝试了以下方法:
<!DOCTYPE html>
<script src="/xyz/scripts/jquery-1.11.0.min.js"></script>
<script>
$.getScript("myModule.js");
</script>
<h1>Demo</h1>
<script>
$.ready(function() {
console.log(wow);
console.log(wow());
});
</script>
这次我没有收到错误消息但是,wow 和 wow() 的值也没有写入控制台。
【问题讨论】:
-
这是因为
getScript是异步的。你的console.logs 在getScript完成之前执行。 -
那有什么好处呢?不那么不屑一顾,我确实看到有一个回调函数的参数,可以执行页面中的其余代码,但是如果我使用 getScript 加载十几个模块或更多模块,每个模块都有自己的成功回调,在我开始运行这些模块要支持的代码之前,我需要其中的许多?
-
为什么你觉得你需要使用
getScript而不是<script src=? -
对于“加载许多脚本并等待它们”的场景,请查看this question。
-
@freedomn-m 和 Kevin B:我正在尝试使用 getScript,以便脚本可以加载自己的依赖项,而不是让客户端 HTML 页面知道它们是什么。换句话说,就是封装,隐藏实现细节。