jQuery版本冲突
背景
在做一个地图功能,需要能引入其他的地图来操作,之前用高德特方便,百度的接口感觉也很好写,写到一半被告知要全部改成另一个公司的地图,无接口,自己瞅。
他们的地图引入了1.8.2的jQuery,本身系统的布局页中引入的版本是3.1.1。开始没有意识到是版本冲突,出现的错误一直是对应的marker画不上去(用的Chrome浏览器)但是F12打开调试面板的时候就能显示了,我现在还不知道是为什么。可能和版本冲突有关吧。
remove
我用puer单独发布了地图,相同的功能,可以实现。
删掉了布局页的引入,marker的显示、添加都没有问题,应该就是冲突咯。所以咋办呢?
我开始天真的想到,我直接把高版本删掉不就好了吗,谜一样奇怪的思维,想直接$.remove();掉,以为没问题了。
中间本来想在选择器中用正则去匹配版本号格式,失败告终,最后用的src*来包含固定了版本号的jQuery(ps:因为文件名为jQuery-3.1.1.js这样),src^和src$分别能匹配前后,不过尝试里面写正则失败。jQuery选择器文档
remove掉以后发现3.1.1是已经加载到内存去了的,你把引入的链接删掉有什么用呢,愚蠢。有没有办法?在stackoverflow里面也有人聊这个,反正就是你删不掉的啦,除非用delete关键字,当然是非常不推荐的啦,我觉得我最近都在干些秀下限的事儿。嗯,好,那怎么办?你要上天了。
jQuery.noConflict()
版本冲突之前也尝试过jQuery.noConflict(),因为除了他们的冲突,同页面还有个jQuery.autoComplete用来做补全,作者说能兼容到1.7以上,比bootstrap好,当前用的bootstrap版本只能兼容到1.9.2还是多少,意思就是抛弃IE咯,他们用的这个jQuery版本还真是尴尬。
页面中引用的高版本在前,低版本在后。除外还引了autoComplete。直接这样$("").autoComplete会一直报is not a function。
所以用了匿名函数用闭包画了个圈,里面var $ = jQuery.noConflict();,这样闭包里面的$就变成了高版本。不知道我当时咋想的,其实按高在前低在后,最后autoComplete最后肯定绑到了低版本上,但是加了这个后在闭包外面引用autoComplete不会报错,但是也不生效,真的是很尴尬。
因为当前页面用了bootstrap的modal弹窗,而且也是布局页中引入的,所以丢不掉。所以换了个页面引入,不显示marker依然存在,autoComplete倒是生效了。
当时加autoComplete是考虑用户体验,估计最后为了地图要放弃吧,现在还是没能找到解决marker问题的方法。
删掉任意一个引用
删高版本
这是最愚蠢的尝试了,出了一堆错误,看到Bootstrap要求1.9.2的时候就放弃这个愚蠢的想法了。
删低版本
marker不显示不显示就是不显示。
以上2017.1.17 折腾两天了,没结果,继续加油。