好的,我在balanced.js 中发现了这个错误。因此,在 Phonegap 中,window.location.href 返回类似 file:///.../index.html 的内容。Balanced.js 为https://js.balancedpayments.com/proxy#file之类的东西创建了一个 iframe
var src = proxy + "#" + encodeURIComponent(window.location.href);
https://github.com/balanced/balanced-js/blob/master/src/utils.js#L48
在 proxy.html(我在 github 上找不到)返回的脚本中,它确实:
c.parentURL=decodeURIComponent(
window.location.hash.replace(/^#/,"")
).replace(/#.*$/,"")
c.parentDomain=c.parentURL.replace(/([^:]+:\/\/[^\/]+).*/,"$1")
正则表达式不匹配,因为 file: 有三个斜杠。现在,起初,我以为我可以将正则表达式转换为:
/([^:]+:\/+[^\/]+).*/
但是,还有另一个问题,因为平衡对匹配进行了安全来源检查:
if (d.origin.toLowerCase() !== c.toLowerCase()) return !1;
但是,正则表达式返回 file:///firstcomponent,而event.origin不包含文件方案的主机名,因此即使使用固定的正则表达式也不匹配。
我无法更改代理响应中返回的脚本中的任何内容,因为如果我从 balancepayments.com 以外的域加载该脚本,那么 AJAX POST 将失败(返回代码 0,正文为空白)。因此,我唯一能控制的就是传递给 iframe 的哈希值。
然而,由于这个正则表达式是一个替换,我们可以简单地传递我们知道我们需要的东西(我们不在乎这个正则表达式是一个空操作)。
因此,解决方法是将上面的L48改成:
var src = proxy + "#" + encodeURIComponent("file://");
这行得通。