gpt4 book ai didi

javascript - 如何在调用需要该文件之一的其他 js 文件之前加载动态添加的文件

转载 作者:行者123 更新时间:2023-12-03 01:26:52 24 4
gpt4 key购买 nike

首先,感谢您阅读我的问题并尽力帮助我,并对我的英语表示歉意。

我遇到以下问题...

我动态添加js文件和css文件,但有时会出现错误,因为在下载动态添加的两个文件之前先加载静态js文件。

如何解决这个问题?在下载动态添加的两个文件之前,不要加载js文件(mapfunctions.js)

我的api js文件,调用一个函数,在其中添加动态js文件和css文件,如您所见。

这是我的index.html代码:

<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<title>Map Generator</title>
<meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
// this file add dinamically a js file and a css file
<script src="./js/api/api.js"></script>
// this file needs js file added dinamically, and if is not downloaded crash
<script src="./js/option2/mapfunctions.js"></script>
<style>
body { margin:0; padding:0; }
#map { position:absolute; top:0; bottom:0; width:50%; height:50%; }
</style>
</head>
<body>
<div id="map"></div>
<script>
document.addEventListener("DOMContentLoaded", function(event) {
customMap.addMap("5b4f12233cfb101f4c2d0537", "map");
});
</script>
</body>
</html>

有时显示的错误是:错误:ReferenceError:mapboxgl 未在 Object.createMap 中定义

这是我的 api.js 文件:

let mapboxJsUrl = 'https://api.tiles.mapbox.com/mapbox-gl-js/v0.46.0/mapbox-gl.js';
let mapboxCssUrl = 'https://api.tiles.mapbox.com/mapbox-gl-js/v0.46.0/mapbox-gl.css';

(function(window, document) {

var includeJSFiles = function(url) {
var apiJs = document.getElementsByTagName("script")[0];
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", url);

var css = includeCss(mapboxCssUrl);
if (apiJs !== undefined) {
head.insertBefore(script, apiJs);
} else {
head.insertBefore(script, head.firstChild);
}
head.insertBefore(css, script);
};

var includeCss = function(url) {
var css = document.createElement("link");
css.setAttribute("rel", "stylesheet");
css.setAttribute("type", "text/css");
css.setAttribute("href", url);

return css;
};

includeJSFiles(mapboxJsUrl);

}(window, document));

最佳答案

在这种情况下,最安全的选择可能是在 window 对象上使用 load 事件。 According to MDN, load 仅在所有资源和依赖项加载完毕后才会触发,这样可能会更适合您的情况。

但是我不熟悉mapbox after a little research我发现您尝试使用的 api 将在您的窗口上下文中创建一个mapboxgl对象。

由于 customMap 未在任何地方定义,因此我在 window 上检查 mapboxgl 是否存在,以验证 Mapbox API 是否是动态的加载到您的样本中。我对您的代码进行了以下调整以实现动态加载的 Mapbox 脚本:

<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<title>Map Generator</title>
<meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
// this file add dinamically a js file and a css file
<script src="./js/api/api.js"></script>
// this file needs js file added dinamically, and if is not downloaded crash
<script src="./js/option2/mapfunctions.js"></script>
<style>
body { margin:0; padding:0; }
#map { position:absolute; top:0; bottom:0; width:50%; height:50%; }
</style>
</head>
<body>
<div id="map"></div>
<script>
/* UPDATE
Add event listener to window object, and register handler on the load event
*/
window.addEventListener('load', function(e) {
customMap.addMap("5b4f12233cfb101f4c2d0537", "map");
});
</script>
</body>
</html>

此外,在您的 api.js 脚本中,您应该进行以下调整以促进这一点:

(function(window, document) {

var includeJSFiles = function(url) {
//var apiJs = document.getElementsByTagName("script")[0];
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", url);

// UPDATE
// Keep this simple, and insert the script as head's first node
head.insertBefore(script, head.firstChild);

var css = includeCss(mapboxCssUrl);
head.insertBefore(css, script);
};

var includeCss = function(url) {
var css = document.createElement("link");
css.setAttribute("rel", "stylesheet");
css.setAttribute("type", "text/css");
css.setAttribute("href", url);

return css;
};

includeJSFiles(mapboxJsUrl);

}(window, document));

希望这对您有帮助!

关于javascript - 如何在调用需要该文件之一的其他 js 文件之前加载动态添加的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51494381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com