Mapbox Geocoder在Safari中无法识别.on方法的解决方案咨询
嘿,我之前做Rails+Stimulus项目时也碰到过Safari和Mapbox API的兼容性坑,给你几个实用的方向试试:
先核对Mapbox Geocoder的版本
不同版本的Mapbox Geocoder API可能存在事件绑定逻辑的差异,Safari对新特性的支持有时候会慢半拍。你可以试试切换到稳定的v6.x系列版本,或者升级到最新正式版,确认当前版本是否原生支持.on事件绑定方法。用原生事件监听替代
.on方法
如果Safari里确实找不到.on方法,咱们可以绕开它,直接给Geocoder挂载的DOM元素加原生事件监听。Mapbox Geocoder会在目标元素上触发带命名空间的自定义事件,你可以这样写:// 替代原来的this.mapboxGeocoder.on('result', ...) this.geocoderAutocompleteTarget.addEventListener('mapbox.geocoder.result', (event) => { // 这里写地址结果的处理逻辑 const addressResult = event.detail.result; // 比如填充表单字段等操作 });注意要写完整的事件命名空间
mapbox.geocoder.result,确保能正确捕获到回调事件。确认Stimulus控制器的初始化时机
有可能在Safari中,Mapbox的脚本还没完全加载完成,你就初始化了Geocoder对象,导致.on方法还没被挂载到实例上。可以把初始化逻辑放在Stimulus的connect钩子中,并且做加载状态判断:connect() { // 确保Mapbox相关脚本都加载完毕再初始化 if (window.mapboxgl && window.MapboxGeocoder) { this.initMapboxAutofill(); } else { // 脚本未加载完成的话,等页面完全加载后再执行 window.addEventListener('load', () => this.initMapboxAutofill()); } }试试初始化时直接传入回调选项
有些版本的Mapbox Geocoder支持在初始化配置里直接传入onResult回调函数,不用额外绑定事件。你可以修改初始化代码试试:this.mapboxGeocoder = new MapboxGeocoder({ accessToken: mapboxgl.accessToken, mapboxgl: mapboxgl, marker: false, autocomplete: true, placeholder: 'Search for an address', // 直接在这里定义结果回调 onResult: (event) => { // 处理地址结果的逻辑 } });
如果还是不行,你可以打开Safari的开发者工具,把this.mapboxGeocoder打印出来,看看它的原型链里有没有类似事件绑定的方法,比如addEventListener或者其他自定义的事件订阅方法,说不定能找到合适的替代方案。
备注:内容来源于stack exchange,提问作者nelsballs

