2020-05-23 16:05:35
"WeixinJSBridge is not defined" 是微信内置浏览器中因 WeixinJSBridge 对象未正确加载或注入时序问题导致的常见错误,通常出现在未使用微信JS-SDK或依赖其功能的场景中。
错误原因分析未使用微信JS-SDK时的触发场景
微信内置浏览器中,WeixinJSBridge 是微信提供的核心通信接口,用于实现网页与微信客户端的交互(如支付、分享等)。
该对象需要一定时间加载,若网页代码在 WeixinJSBridge 初始化完成前调用其方法(如直接触发支付或分享),会抛出此错误。
例如:用户点击网页中的支付按钮时,若 WeixinJSBridge 未就绪,会触发 Uncaught ReferenceError。

使用微信JS-SDK时的触发场景
微信Webview注入钩子存在时序问题:WeixinJSBridge 可能在其他依赖它的模块(如支付、分享组件)之前注入。
若代码未等待 WeixinJSBridgeReady 事件直接调用其方法,会因对象未定义而报错。
例如:在 WeixinJSBridge 注入前执行 window.WeixinJSBridge.invoke('pay') 会失败。
忽略错误(若无实际功能影响)若网页未依赖微信特有功能(如支付、分享),此错误通常不会影响核心功能,可忽略或通过全局错误监控(如 window.onerror)捕获后静默处理。
延迟操作执行通过监听 WeixinJSBridgeReady 事件确保对象就绪后再调用相关方法:
if (typeof window.WeixinJSBridge === "undefined") { document.addEventListener('WeixinJSBridgeReady', function() { // 初始化支付或分享按钮 document.getElementById('payButton').onclick = function() { window.WeixinJSBridge.invoke('getBrandWCPayRequest', {...}, function(res) {...}); }; });} else { // 直接初始化(适用于非微信环境或已加载场景) document.getElementById('payButton').onclick = function() {...};}严格遵循官方文档时序
使用微信JS-SDK提供的 ready 事件回调,而非直接监听 WeixinJSBridgeReady。
示例(微信支付):
wx.ready(function() { document.getElementById('weiXinPay').onclick = function() { wx.chooseWXPay({...}); // 使用JS-SDK封装的方法 };});避免混用不同文档的代码
微信支付需使用 JS-SDK文档 中的代码(如 wx.chooseWXPay),而非公众号支付文档中的直接调用 WeixinJSBridge.invoke 的方式。
参考链接:
官方优化注入时序微信团队需解决 WeixinJSBridge 与其他模块的注入顺序问题,例如通过延迟加载非核心模块或提供更明确的加载状态接口。
开发者主动防御
在关键操作前添加对象存在性检查:
function safeInvoke(method, args, callback) { if (window.WeixinJSBridge) { window.WeixinJSBridge.invoke(method, args, callback); } else { console.error('WeixinJSBridge is not ready'); }}使用 try-catch 捕获潜在错误:
try { window.WeixinJSBridge.invoke('...');} catch (e) { if (e.message.includes('not defined')) { // 降级处理或提示用户 }}此错误本质是微信内置浏览器环境下的时序问题,开发者需通过 延迟操作、事件监听 和 代码规范 规避风险。若问题持续存在,建议向微信开放平台反馈以推动官方修复。