页面上写了一行 alert(1),本地打开好好的,嵌到 iframe 里就一点反应没有。原因不复杂:沙箱里的 iframe 不允许弹窗,浏览器直接把 alert 忽略了,控制台只留一句警告。

js alert 是 window 对象上的方法,弹一个带确定按钮的模态框,参数会被转成字符串。它返回 undefined,拿返回值做判断永远为假,也没有回调可用,弹完就结束,想按用户选择走分支只能用 confirm。

弹窗期间页面是停的

弹窗出现时,当前页面的 JS 停止执行,渲染也停,定时器不推进,动画冻住,用户点确定才继续。调试时这是优点,能看清某一步的状态;放进正式页面就是灾难,一个没注意的 alert 能把请求回调全卡住。

它只显示纯文本。传对象进去,出来的是 [object Object];想换行得用转义字符,不能直接敲回车。样式更没法改,字体、按钮文字全由浏览器决定。

什么时候会被浏览器吞掉

  • 跨域 iframe 带 sandbox 属性,没给 allow-modals。
  • 页面被判定为弹窗滥用,Chrome 会提示阻止此页面创建更多对话框。
  • 部分移动端浏览器和 App 内置 WebView 直接屏蔽。
  • 不在点击、按键这类用户手势里触发,可能被延迟或者忽略。

那该用什么

调试信息用 console.log,能打对象、能分组、不打断流程。要给用户提示,用页面内的 toast 或者对话框组件,样式可控,也不阻塞渲染。确实要打断用户做确认,自己写模态层最稳,confirm 同样受沙箱限制。看数组用 console.table,看 DOM 对象用 console.dir,比弹窗高效得多;断点调试用开发者工具的 Sources 面板,逐步执行比一堆 alert 直观。

还有个老坑:alert 写在循环里,浏览器会连续弹,用户点到手软。早年有人拿它做表单校验,一个字段一个框,现在看完全是折磨。校验提示应该贴在输入框旁边,别打断填写。

一句话,js alert 只适合临时确认代码跑到哪一行,验证完就删,留在代码里的弹窗迟早出事。