未捕获的参考错误:mapboxgl未定义

问题描述 投票:1回答:2

我以这种方式动态加载Mapbox-GL JS:

        var script = domConstruct.create("script");
        script.type = "text/javascript";
        script.charset = "utf-8";
        script.onload = instantiateMap();
        script.src = "https://api.mapbox.com/mapbox-gl-js/v0.39.1/mapbox-gl.js";
        script.async = false;
        document.getElementsByTagName("head")[0].appendChild(script);

然后在某个时候,我在'instantiateMap'函数中按如下方式访问它:

        mapboxgl.accessToken = 'pk.eyJ1IjoibW11a2ltIiwiYSI6ImNqNnduNHB2bDE3MHAycXRiOHR3aG0wMTYifQ.ConO2Bqm3yxPukZk6L9cjA';
        var map = new mapboxgl.Map({
         container: mapParent,
         style: 'mapbox://styles/mapbox/streets-v9'
        }); 

一旦我的控件到达该行(mapboxgl.accessToken ...),它就会在Chrome控制台上出现以下错误:

Uncaught ReferenceError: mapboxgl is not defined
    at Object._instantiateMap (VM2337 Sample.js:282)
_instantiateMap @ VM2337 Sample.js:282

这个特定的代码片段在以下情况下可以正常工作: - 动态包含Mapbox-GL.js也可以在独立的HTML文件中正常工作。 - 将库静态包含在HTML文件中。

我知道该库加载正常,因为我在Sources下的左侧面板中看到它,但我不知道为什么在访问mapboxgl对象时出现此错误。

此外,我尝试以类似的方式包含其他库(jQuery,mapbox.js),它们工作正常。

任何帮助将非常感谢!

undefined mapbox-gl-js mapbox-gl
2个回答
1
投票

没有看到源代码我无法测试或修复错误。

我的猜测是,由于脚本的大小或代码的顺序,脚本在实例化之前未加载。

我个人会使用一个回调函数来确保实例化仅在文件完全下载(未测试)时发生

    JavaScript.load("https://api.mapbox.com/mapbox-gl-js/v0.39.1/mapbox-gl.js", function() {
       mapboxgl.accessToken = 'pk.eyJ1IjoibW11a2ltIiwiYSI6ImNqNnduNHB2bDE3MHAycXRiOHR3aG0wMTYifQ.ConO2Bqm3yxPukZk6L9cjA';
        var map = new mapboxgl.Map({
         container: mapParent,
         style: 'mapbox://styles/mapbox/streets-v9'
        }); 
    });

    var JavaScript = {
      load: function(src, callback) {
        var script = document.createElement('script'),
            loaded;
        script.setAttribute('src', src);
        if (callback) {
          script.onreadystatechange = script.onload = function() {
            if (!loaded) {
              callback();
            }
            loaded = true;
          };
        }
        document.getElementsByTagName('head')[0].appendChild(script);
      }
    };

0
投票

当然,js脚本在加载依赖项之前已经运行。

© www.soinside.com 2019 - 2024. All rights reserved.