如果正常页面做跳转是会调用brige.js里的route函数,函数如下:
function route ({type}) {
// url: $page[?name=value]
return function (url, config) {
var parts = url.split(/\?/)
var pagepath = parts[0]
if (/^[\w\-]+$/.test(pagepath)) {
pagepath = (conf.get('customRouteResolve') || conf.get('routeResolve'))(pagepath)
}
if (!pagepath) {
throw new Error('Invalid path:', pagepath)
}
config = config || {}
// append querystring
config.url = pagepath + (parts[1] ? '?' + parts[1] : '')
redirector[type](config)
}
这个时候函数只传了一个参数config,我不清楚大大是怎么考虑的,但是route函数没有被bridge.js导出,而且整个脚本内调用回调函数的时候,都没有传入第二个参数,所以我可以认为config是在函数内被初始化,内只有一个对象url。(此处是建议更改的第一个部分,我猜大大可能因为relaunch这种大大说不兼容的api当时做了这个最后没用上成了幽灵代码,而且我也的确没明白reLaunch怎么不兼容)。
redirector里面的函数是这样的:
exportee.navigateTo = function (cfg) {
console.log(cfg, arguments);
return route('navigateTo', cfg, arguments)
}
exportee.redirectTo = function (cfg) {
return route('redirectTo', cfg, arguments)
}
exportee.switchTab = function (cfg) {
return route('switchTab', cfg, arguments)
}
exportee.reLaunch = function (cfg) {
return route('reLaunch', cfg, arguments)
}
exportee.navigateBack = function () {
return wx.navigateBack.apply(wx, arguments)
}
从刚才的分析来看,那么cfg就是传入的config参数,arguments
是一个元素为1的数组。aruments[0]===config
,所以这里是第二个我没明白的地方,argument意义何在?
我加了一行在里面跑了一下,这个时候神奇的部分就来了。(因为我也不知道为什么)
exportee.navigateTo = function (cfg) {
console.log(cfg);
console.log(arguments);
return route('navigateTo', cfg, arguments)
}
控制台打出:
config是
{url:"/module/....(后面我省略了)"}
arguments是
{
0: {url:"module/....(后面我省略了)"}
_proto_: ....
}
url前面的/
不见了,所以这就是QQ会报错navigateTo:fail page "module/module1?From=%E9%A6%96%E9%A1%B5&aim=FAQ7&depth=1" is not found
的原因。
所以我想请问这是什么问题?argument的特性么?
我已经查出来了,这TM是模拟器的问题。