如何禁用页面部分Alert弹窗并保留指定弹窗?原生JS实现遇递归问题
解决alert递归调用问题,实现部分弹窗拦截
这问题我太熟了!你之前的代码之所以陷入递归,核心原因是重写window.alert之后,函数里调用的alert()其实是你刚定义的新函数,不是浏览器原生的弹窗方法。要解决这个,关键是先把原生alert的引用存下来,之后直接调用这个保存好的原生方法就行。
核心解决方案代码
// 先把原生alert存到独立变量里,避免被重写覆盖 const nativeAlert = window.alert; // 重写window.alert函数 window.alert = function(text) { // 判断弹窗内容是否包含"rambo",符合条件就调用原生alert弹出 if (text.includes("rambo")) { nativeAlert(text); } else { // 不符合的弹窗,只输出到控制台,不显示弹窗 console.log("已拦截alert:", text); } };
为什么这样能行?
nativeAlert变量保存了原始的window.alert函数引用,当我们在重写的函数里调用nativeAlert(text)时,触发的是浏览器自带的原生弹窗,完全不会触发我们自己写的重写版本,自然就避免了递归问题。
扩展:支持多个允许的关键词
如果之后需要允许多个关键词的弹窗,也可以轻松扩展:
const nativeAlert = window.alert; // 定义允许弹出的关键词列表 const allowedAlertKeywords = ["rambo", "系统提示", "critical"]; window.alert = function(text) { // 检查内容是否包含任意一个允许的关键词 const shouldShowAlert = allowedAlertKeywords.some(keyword => text.includes(keyword)); if (shouldShowAlert) { nativeAlert(text); } else { console.log("拦截alert内容:", text); } };
内容的提问来源于stack exchange,提问作者Edwin Thomas
相关产品推荐
相关产品推荐

