此函数将自定义协议 URL 作为参数。然后它会创建一个临时<iframe>的,通过模拟点击隐藏<a>元素来加载传递的 URL。
function invokeProtoLink(url) {
return new Promise(function(resolve, reject) {
// create temp frame where url will be opened
const frame = document.createElement('iframe');
frame.name = '_invoker_' + Math.random();
// create temp link and set it's target to temp frame
const lnk = document.createElement('a');
lnk.href = url;
lnk.target = frame.name;
// frame must be appended to body otherwise link will
// open in new tab, and might trigger popup blocker
document.body.appendChild(frame);
setTimeout(function() {
// remove temp frame
frame.parentNode.removeChild(frame);
resolve();
}, 0);
// a simple lnk.click() did not work in firefox
// hence we're using dispatchEvent
lnk.dispatchEvent(new MouseEvent('click'))
});
}
基于您的示例的用法是:(这必须在事件处理程序中,例如onclick)
invokeProtoLink('abcd://').then(() => {
invokeProtoLink('xyz://');
});
在 Chrome 68、Edge 42 和 Firefox 61 上测试。