有些浏览器会为了用户体验和安全考虑,拦截一些非用户行为触发的回调中执行的敏感操作。例如,在setTimeout
函数中调用window.open
,或者使用 DOM 元素的focus
方法。为了解决这个问题,通常的解决方法是在用户事件回调函数中同步地调用这些方法,然后在异步回调中执行后续操作,以 window.open
为例:
someDOMElement.onclick = () => {
const win = window.open('about:blank', '_blank');
setTimeout(() => {
win.location.href = "http://...."
}, 500)
}
上述代码中, 我们在事件回调中立即调用 window.open 方法打开一个空白页面,等待异步回调触发后,再填充空白页面的链接, 这样就可以防止被浏览器拦截。
focus
获取焦点无法弹出窗口的解决方法也类似如此,但是要借助一个临时的 DOM 节点:
document.body.ontouchend = function(){
const tmpElement = document.createElement('input');
tmpElement.style.cssText += `
width: 0;
height: 0;
margin: 0;
padding: 0;
border: 0;
opacity: 0;
`;
document.body.appendChild(tmpElement);
tmpElement.focus();
asyncMethod().then(function(){
inpuf.focus();
tmpElement.remove();
});
}
分类:
前端技巧
标签:
JavaScript
, 前端
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?