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

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

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

【问题讨论】:

    标签: javascript alerts


    【解决方案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)覆盖它。

      【讨论】:

        猜你喜欢
        • 2015-01-05
        • 1970-01-01
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 2011-02-23
        • 1970-01-01
        相关资源
        最近更新 更多