You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IE11正常IE10报错‘Set’未定义:ArcGIS JS 4.5 WebMap问题

问题分析与解决方案

这个问题我之前碰到过类似的场景,结合ArcGIS JS API 4.5的特性和IE10的兼容性限制,主要有以下几个可能的原因,以及对应的解决办法:

核心原因:IE10原生不支持ES6的Set对象

IE10是2012年发布的老旧浏览器,本身完全不支持ES6新增的Set数据结构。之前你的代码能正常运行,大概率是因为ArcGIS JS API的CDN资源中原本包含了针对这类ES6特性的polyfill(兼容补丁),但最近Esri可能对旧版本API的CDN资源做了维护调整,移除了对IE10这类过时浏览器的polyfill支持,导致现在运行时直接抛出Set is undefined的错误。

另外还有一种可能:之前你的浏览器缓存了带有polyfill的旧版API资源,昨天缓存过期后加载了最新的CDN资源,而新版资源已经不再包含IE10需要的补丁,所以突然出现问题。


解决方案

1. 手动添加Set的polyfill

在加载ArcGIS JS API之前,先引入Set的兼容补丁,确保IE10能识别这个对象。你可以自己写一个简易实现,或者使用成熟的polyfill库:

简易版polyfill代码:

// 在加载ArcGIS API之前执行这段代码
if (typeof window.Set === "undefined") {
  window.Set = function Set(iterable) {
    this._items = {};
    // 处理传入的可迭代对象
    if (iterable) {
      for (let item of iterable) {
        this.add(item);
      }
    }
  };

  Set.prototype.add = function(value) {
    this._items[value] = value;
    return this;
  };

  Set.prototype.has = function(value) {
    return this._items.hasOwnProperty(value);
  };

  Set.prototype.delete = function(value) {
    if (this.has(value)) {
      delete this._items[value];
      return true;
    }
    return false;
  };

  Set.prototype.clear = function() {
    this._items = {};
  };

  Object.defineProperty(Set.prototype, 'size', {
    get: function() {
      return Object.keys(this._items).length;
    }
  });
}

如果需要更完整的Set特性支持,建议使用core-js这类专业的polyfill库,只需要在API加载前引入对应的polyfill模块即可。

2. 锁定API的固定版本资源

检查ArcGIS JS API 4.5的官方归档资源,确认是否有固定的、保留了IE10兼容补丁的资源路径,避免加载被更新后的CDN资源。不过需要注意,Esri已经停止对旧版本API的维护,这个方法可能无法长期生效。

3. 调整API版本(若项目允许)

如果你的项目有调整空间:

  • 若必须支持IE10,可以考虑回退到ArcGIS JS API 3.x版本,3.x系列对旧IE浏览器的兼容性更好,原生就支持IE10;
  • 若可以放弃IE10支持,升级到更高版本的4.x API,同时在项目中声明不再支持IE10这类老旧浏览器。

内容的提问来源于stack exchange,提问作者asprin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:33:53