如何在Chrome中通过JavaScript调用自定义协议处理器且不触发弹窗?
解决方案
你可以通过隐藏iframe加载自定义协议地址的方式实现无弹窗调用,完全避免触发弹窗拦截规则,改造后的代码如下:
function setBrowser() { var userAgent = navigator.userAgent.toLowerCase(); if (userAgent.indexOf("chrome") > -1) { // 构造自定义协议调用地址 var url = 'ABCProcessLaunch:-Domain mydomain -Args http://google.com -requirelogin true -method "chrome"'; // 创建隐藏的iframe元素 const invokeIframe = document.createElement('iframe'); invokeIframe.style.display = 'none'; invokeIframe.src = url; document.body.appendChild(invokeIframe); // 调用完成后移除iframe,避免残留无用DOM setTimeout(() => { document.body.removeChild(invokeIframe); }, 100); } }
方案说明
- 核心逻辑是将自定义协议地址作为普通资源交给iframe加载,Chrome会自动识别自定义协议并拉起对应应用,全程不会产生新窗口,不会触发弹窗拦截规则
- 无需处理窗口关闭逻辑,也不会影响当前页面的正常交互
可选兼容方案
如果你的调用逻辑是在用户点击、按钮触发等用户交互事件的同步执行流程中,也可以直接修改当前页面地址:
window.location.href = url
该方案同样不会产生新窗口,但如果用户设备未注册对应自定义协议,会导致当前页面跳转到错误页,兼容性弱于iframe方案。
注意事项
- 如果需要处理自定义协议未注册的异常场景,可以在加载iframe后设置2s左右的定时器,若定时器触发后未收到应用拉起的回调,可向用户提示未安装对应应用
- 自定义协议中包含的参数如果有特殊字符、中文等内容,建议先通过
encodeURIComponent()编码后再拼接,避免协议解析异常
内容的提问来源于stack exchange,提问作者pldiguanaman
相关产品推荐
相关产品推荐

