有没有办法在 JavaScript 中模拟点击警报?

Posted

技术标签:

【中文标题】有没有办法在 JavaScript 中模拟点击警报?【英文标题】:Is there a way to simulate a click on an alert in JavaScript? 【发布时间】:2009-02-19 03:52:50 【问题描述】:

我有一个带有 iframe 的页面,其源页面位于单独的域中。源页面有时会生成警报。当它这样做时,它会停止它正在做的事情,直到用户单击“确定”来发出警报。

我想做的是以编程方式单击此警报上的“确定”,以便源页面可以恢复使用。这可能吗?

【问题讨论】:

【参考方案1】:

javascript 是单线程的,这意味着当你调用一个函数时,它会阻塞直到它返回。当你调用 alert() 时,它会将控制权传递给决定如何处理它的浏览器。弹出 UI 对话框的不是 Javascript,而是浏览器。在浏览器收到“OK”事件并返回控制权之前,alert() 不会返回。 javascript 线程会停止,直到发生这种情况。

因此,至少出于上段所述的两个不同原因,答案是 :)

【讨论】:

证实了我的怀疑。除了 JavaScript 之外,我还需要使用一些东西来代替它。 JavaScript 线程没有停止,消息仍在发送,任何计时器或异步更改仍将触发事件处理程序,并且这些处理程序中的 JS 仍将运行。【参考方案2】:

我很确定这是不可能的。

【讨论】:

@Whoever 对此表示反对:看看这个问题,这是一个直接的是-否,可能或不可能。其他答案更好,但是对于第一个正确回答问题的人投反对票?很奇怪。 +1 表示技术上正确。我的问题是是/否,是/否是我是否可以完全用 JavaScript 完成。【参考方案3】:

如果您在代码中使用 no-op 覆盖警报会发生什么?

例如

<script>
// uncomment next line to swallow alerts
//  function alert(nope)  return; 
<script>
<script>
  $(document).ready(function()  alert("Hello, world!"); );
</script>

注释掉该行后,会出现警报。注释行时,不会出现警报。

【讨论】:

这是一个不错的选择,假设开发人员不介意全面丢失警报。 即使有问题的代码位于源代码位于单独域中的 iframe 中,这也能正常工作吗? 我已经在 iframe 的父级中尝试过这个,它对 iframe 生成的警报没有影响。但是,它会抑制 iframe 的父级生成的所有警报。【参考方案4】:

如果您知道警报的文本并且不介意弄脏,那么您应该没有问题。

你可以用你自己的覆盖 iframe 窗口的警报,并做一些事情来达到..

document.getElementById("InnerFrameName").contentWindow.alert = function()
    if (arguments[0].toLowerCase() == "innerframe alert text")
        return; //supress
    else
        alert(arguments[0]);
;

编辑:我用代理处理程序做了一个小测试(它在 asp.net/c# 中,但你应该明白)...

我测试中的外部页面是一个 w3 页面,带有一个显示警报的按钮,警报现在通过用户定义的函数传递。

我敢肯定这比你想得到的要脏得多。

页面:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Hello From MyPage</title>
    <script type="text/javascript">
        function frameLoaded() 
            document.getElementById("InnerFrameName").contentWindow.alert = function() 
                if (arguments[0].toLowerCase() == "i am an alert box!!") 
                    alert("MESSAGES WOULD BE SUPRESSED: " + arguments[0]);
                    return; //supress
                 else 
                    alert(arguments[0]);
                
            ;
        
        </script>
</head>
<body onload="alert('Hello from an unsupressed top level frame message!');">
    <form id="form1" runat="server">
            <div>
                <h1>Internal Page (Top Level)</h1>
                <hr />
                <iframe id="InnerFrameName" onload="frameLoaded();" src="PageProxy.ashx?externalURI=http://www.w3schools.com/JS/tryit_view.asp?filename=tryjs_alert"
                    style="width: 800px; height: 600px;">Derp!...</iframe>
            </div>
    </form>
</body>
</html>

代理处理程序:

<%@ WebHandler Language="C#" Class="PageProxy" %>

using System;
using System.Web;

public class PageProxy : IHttpHandler 

    public void ProcessRequest (HttpContext context) 
            byte[] externalPage = new System.Net.WebClient().DownloadData(context.Request["externalURI"]);
            context.Response.OutputStream.Write(externalPage, 0, externalPage.Length);
            context.Response.End();
    

    public bool IsReusable 
        get 
            return false;
        
    

【讨论】:

iframe 源位于外部域中,因此尝试此操作时权限被拒绝。 是的,我担心域权限会导致问题,唯一的解决方法是创建一个本地代理页面/处理程序等来加载远程页面,这样它就在域内并且这个脚本应该可以工作。跨度> 【参考方案5】:

我非常怀疑。如果使用单独的域,您是指您无法控制的域吗?

如果您有控制权,您可以将警报更改为您可以控制的模态 Javascript 框。

【讨论】:

【参考方案6】:

解决烦人的 JavaScript 问题的最佳选择是使用客户端脚本工具(如 Greasemonkey)覆盖它。

【讨论】:

以上是关于有没有办法在 JavaScript 中模拟点击警报?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript关闭警报框

如果记录已经存在或者在 PDO MySQL 插入查询中不存在,如何生成 javascript 警报?

如何在javascript中返回到for循环的顶部

如何使 javascript 警报不说页面的名称?

如何通过 Javascript / jQuery 在按钮单击时显示引导警报?

有没有办法在 iPhone 模拟器上点击菜单按钮然后重新启动应用程序后查看日志记录?