javascript - 如果 src 是变量,函数不起作用?
问题描述
使用此 HTML,myFunc()
可以执行该功能。https://myurl.de/myjs.js
里面有这个功能myFunc
。
<head>
<script type="text/javascript" src="https://myurl.de/myjs.js"></script>
<body>
<script type="text/javascript">
myFunc();
</script>
</body>
</head>
但是对于第二个 HTML,我得到一个错误:Uncaught ReferenceError: myFunc is not defined
。
https://myurl.de/settingsFile.js
是一个在 a 中包含这个 url 的文件var
:https://myurl.de/myjs.js
所以基本上SettingsFile.UrlToMyJS
就是这个https://myurl.de/myjs.js
<head>
<script src="https://myurl.de/settingsFile.js"></script>
<script type="text/javascript" id="myid"></script>
</head>
<body>
<script type="text/javascript">
document.getElementById('myid').src = SettingsFile.UrlToMyJS;
myFunc();
</script>
</body>
当我console.log(document.getElementById('myid'))
这是输出时:
<script type="text/javascript" id="myid" src="https://myurl.de/myjs.js></script>
哪个是对的。它看起来与第一个 html 头部中的脚本完全相同(不同之处在于它具有id="myid"
)。
然而它不起作用。为什么以及如何解决?
设置文件.js:
var defaultURL = 'https://myurl.de/';
var SettingsFile = {
UrlToMyJS : defaultURL + 'myjs.js',
}
解决方案
它不起作用的原因是您不能将 a 添加src
到DOM 中已经script
存在的元素中——或者更确切地说,这样做不会做任何事情。该元素已被处理。script
相反,创建它然后附加它:
var script = document.createElement("script");
script.onload = function() {
myFunc();
};
script.src = SettingsFile.UrlToMyJS;
document.head.appendChild(script);
// If you need to support IE8, use the following instead of the previous line:
//document.getElementsByTagName("head")[0].appendChild(script);
等待脚本加载,然后调用myFunc
(那时应该存在)。
另请注意,正如我和杰里米在评论中指出的那样,body
不要进去, head
它会继续。通常最好将script
标签放在末尾body
(如果您没有在它们上使用async
或defer
属性或type="module"
)。总而言之,类似:
<head>
<!-- head stuff here -->
</head>
<body>
<!-- content here -->
<script src="https://myurl.de/settingsFile.js"></script>
<script type="text/javascript">
var script = document.createElement("script");
script.onload = function() {
myFunc();
};
script.src = SettingsFile.UrlToMyJS;
document.head.appendChild(script);
// If you need to support IE8, use the following instead of the previous line:
//document.getElementsByTagName("head")[0].appendChild(script);
</script>
</body>
另一种选择是使用document.write
. 这种事情可能是document.write
页面主要解析期间最后一次至少部分适当的使用:
<head>
<!-- head stuff here -->
</head>
<body>
<!-- content here -->
<script src="https://myurl.de/settingsFile.js"></script>
<script type="text/javascript">
document.write('<script src="' + SettingsFile.UrlToMyJS + '"><\/script>');
</script>
<script>
myFunc();
</script>
</body>
推荐阅读
- c# - 从 2 个数组返回一组静态数据的最佳做法是什么
- ios - 处理用于注销的导航控制器
- c - 指针混淆 - 错误:从不兼容的指针类型传递“值”的参数 1;注意:预期为“...”,但参数类型为“...”
- c# - 返回类型中引用类型的可空性与被覆盖的成员不匹配
- regex - 谷歌表格,我的 importxml 公式突然坏了
- python - 无法使用 python urllib 解析 Google 标题
- swift - 您如何知道登录问题是由模拟器还是您的代码造成的?
- shiny - R Shiny dq_render_handsontable 添加列并尝试编辑新列的单元格时出错
- php - 在函数中添加参数
- asp.net-core - Dialogflow .NET 核心,C# - 检测意图不起作用