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

时间:2009-02-19 03:52:50

标签: javascript alerts

我有一个包含iframe的页面,其源页面位于一个单独的域中。源页面会不时生成警报。当它执行此操作时,它将停止正在执行的操作,直到用户单击“确定”为警报。

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

6 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:8)

我很确定这是不可能的。

答案 2 :(得分:3)

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

您可以使用自己的警告覆盖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;
        }
    }
}

答案 3 :(得分:2)

如果您在代码中使用no-op覆盖警报会怎样?

e.g。

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

在注释掉该行后,会出现警告。如果注释了行,则不会显示警报。

答案 4 :(得分:1)

我非常怀疑。如果是通过单独的域名,你的意思是你无法控制的域名吗?

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

答案 5 :(得分:0)

使用恼人的JavaScript解决问题的最佳方法是使用Greasemonkey等客户端脚本工具覆盖它。