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
相关产品推荐
相关产品推荐

