我们在做一个手机端的页面,在微信和微博浏览器里使用,我们使用了 sea.js 进行前端模块化管理。页面就一个种子文件,根据配置去加载不同的静态资源(模板、css、js),微信 JSSDK 是异步载入的。
一开始的做法,习惯性地使用了 jQuery 的 $.getScript() 来异步加载 http://res.wx.qq.com/open/js/jweixin-1.0.0.js ,结果发现 JS 加载成功以后,window.wx 这个对象,居然是 undefined。
初步怀疑是微信 JSSDK 不支持异步加载,直接通过 <script> 标签放页面上 sea.js 之后,居然也是 undefined。
将微信 JSSDK 挪到 sea.js 之前,就好了,去格式化了一下 jwexin-1.0.0.js 源码之后,才发现,如果有了 define() 这个全局方法,微信 JSSDK 是当做 require() 的结果返回,不再生成 window.wx 这个对象。
于是改成了 seajs.use() 来引用,代码如下:
seajs.use('http://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(weixinSDK){
wx = weixinSDK;
var info = {
debug: false,
jsApiList: ["chooseImage", "uploadImage", "onMenuShareTimeline", "onMenuShareAppMessage"]
};
// 我的配置信息,是从 opts.jssdk 参数里获得的
for(var key in opts.jssdk){
if(key != "url"){
info[key] = opts.jssdk[key];
}
}
wx.ready(function(){
// 开始调用微信 JSSDK 的 api
});
wx.error(function(res){
// alert( JSON.stringify( res ) );
});
wx.config(info);
});
至此,问题得到解决。
微博的轻应用也存在此类问题