代码之家  ›  专栏  ›  技术社区  ›  moffdub

有没有一种方法可以在javascript中模拟点击警报?

  •  8
  • moffdub  · 技术社区  · 16 年前

    我有一个带有iframe的页面,它的源页面在一个单独的域中。源页面会不时生成警报。当它这样做时,它停止它正在做的事情,直到用户单击OK(确定)进入警报。

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

    6 回复  |  直到 10 年前
        1
  •  17
  •   Rex M    16 年前

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

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

        2
  •  7
  •   fig    16 年前

    我很肯定这是不可能的。

        3
  •  3
  •   Quintin Robinson    16 年前

    如果你知道警报的内容,并且不介意弄脏,你就不会有问题。

    您可以用自己的方法覆盖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:

    <%@ 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;
            }
        }
    }
    
        4
  •  2
  •   Thomas L Holaday    16 年前

    如果用代码中的no op覆盖警报,会发生什么?

    例如

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

    行被注释掉后,就会出现警报。在注释了行的情况下,不会显示警报。

        5
  •  1
  •   alex    16 年前

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

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

        6
  •  0
  •   William Clemens    16 年前

    用恼人的javascript解决问题的最佳选择是用客户端脚本工具(如 Greasemonkey .