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

时间:2017-09-13 18:11:48

标签: undefined mapbox-gl-js mapbox-gl

我以这种方式动态加载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)并且它们工作正常。

任何帮助都将受到高度赞赏!

3 个答案:

答案 0 :(得分: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);
      }
    };

答案 1 :(得分:0)

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

答案 2 :(得分:0)

要在 express 中解决此问题: 在发回的响应中,添加以下内容

res.status(200).set(
      'Content-Security-Policy',
      'connect-src https://*.tiles.mapbox.com https://api.mapbox.com https://events.mapbox.com'
    ).render('whatever', {} );