ArcGIS Javascript 异常之No 'Access-Control-Allow-Origin' header

本文只描述现象与处理措施,不讨论原理。

开发过程中遇到此异常,查询后网上说是跨域访问的问题,给出的解决方案是通过JQuery的跨域访问机制来解决,

难道我需要直接找ArcGISTiledMapServiceLayer相关代码,去重构吗?

还有给出的解决方案如下,http://resources.arcgis.com/en/help/rest/apiref/config.html,大意就是要设置一下ArcGIS Server服务,可服务是别人的,设置不了。

代码如下,在地图类型切换时需要调用另一个网址,就报出了如下错误。

if (tp == "mp") {
            //移除之前
            map.removeLayer(basemap);
            //地图
            basemap = new ArcGISTiledMapServiceLayer("http://xxx.xxx.xxx.xxx.xxx.xxx");
            $("#mptype").val("mp");
            map.addLayer(basemap);
        }

实际上两个图层域名是差不多的,不知道为什么出现这个问题。

后来尝试了下,在地图初始化的时候就实例化两个ArcGISTiledMapServiceLayer,在地图切换的时候进行图层的添加、删除,不进行实例化,即解决问题。

大致代码如下:

function loadMap(lnt,lat,zo0o) {
    zoom=zo0o;
    require(["esri/map", "esri/toolbars/navigation", "esri/layers/ArcGISTiledMapServiceLayer"], function (Map, Navigation, ArcGISTiledMapServiceLayer) {
        options = { logo: false,
            fadeOnZoom: true,
            slider: true,
            sliderPosition: "bottom-left",
            sliderStyle: "large"
        };
        iniLat = lat;
        iniLnt = lnt;
        map = new esri.Map("mapDiv", options);
        basemap = new ArcGISTiledMapServiceLayer("http://xxx.xxx.xxx.xxx");
        annolayer = new ArcGISTiledMapServiceLayer("http://bb.bbb.ccc.ddd");
        map.addLayer(annolayer);
        spatialReference = map.spatialReference;

        map.on("mouse-down", function (evt) {
            console.log(evt.mapPoint.x.toFixed(3) + "," + evt.mapPoint.y.toFixed(3));
        });

        map.centerAndZoom(new esri.geometry.Point(lnt, lat), zoom);
        navToolbar = new Navigation(map);
    });
            }

地图切换代码修改如下:

function MapTypeSwitch(tp){
    require(["esri/map", "esri/layers/ArcGISTiledMapServiceLayer", "esri/config"], function (Map, ArcGISTiledMapServiceLayer, esriConfig) {
        esriConfig.defaults.io.corsDetection = false;
        if (tp == "mp") {
            //移除之前
            $("#mptype").val("mp");
            map.removeLayer(annolayer);
            map.addLayer(basemap);
        }
        
    });
            }