我使用$ postMessage与父窗口进行跨浏览器通信。 在除Safari之外的所有浏览器中,一切正常。问题是使用document.location.hash 哈希在Safari中返回为空。 无论如何,在Safari中发生这种情况。
function postMessage( msg ){
var parent_url = decodeURIComponent( document.location.hash.replace( /^#/, '' ) );
$.postMessage({ method:'resize', message:msg}, parent_url, parent );
}
更新:
因此父窗口正在创建一个iframe,它将#ur; #url附加到它的末尾。我正在使用document.location.hash.replace(/ ^#/,'')来获取该url以用作postMessage的url。在Safari V8.0.2中测试所有这些时,Safari正在移除#和#之后的任何内容。所以我的parent_url又回来了。
解决方法是在url的末尾使用& param = url而不是#。 我不确定为什么Safari会删除#或者它是否是一个记录良好的问题。我一直在网上搜索以了解更多信息。
答案 0 :(得分:2)
如果location.hash
不可用,为什么不使用location.href
?
href = location.href;
hashIdx = href.lastIndexOf('#');
hash = href.slice(hashIdx);
// or in one line
hash = location.href.slice(location.href.lastIndexOf('#'))
请注意,相当多的浏览器不支持hash
:https://developer.mozilla.org/en-US/docs/Web/API/URLUtils.hash
答案 1 :(得分:0)
刚刚在旧 iPad 上使用 Safari 也遇到了这个问题,我无法在 iOS 12.5.1 之后更新。我有一个使用 Spotify 隐式授权进行授权的小型 Web 应用程序。 Spotify 在散列片段 (#access_token...) 中返回访问令牌,附加到我的重定向 URI。这在旧 iPad 上的除 Safari 之外的所有浏览器中都可以正常工作。 Safari 在较新版本的 iOS 中运行良好。因此,我使用 Mac 上的 Web Inspector 将 Safari 连接到我的 iPad,发现 document.location.hash 和 window.location.hash 都是空的。因此,似乎无法让旧版 iOS 上的 Safari 与任何在重定向时使用哈希片段的 API(如 Spotify 隐式授权)一起使用。