2009-02-19 92 views
7

我有一个页面,其源页面位于一个单独的域中。有时候,源页面会生成警报。当它这样做时,它会停止它正在做的事情,直到用户单击确定提醒。有没有办法在JavaScript中模拟点击警报?

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

回答

16

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

所以至少有两个不同的原因在上面一段所述,答案是没有:)

+0

证实了我的怀疑。我将需要使用除此之外的或者代替JavaScript的东西。 – moffdub 2009-02-21 23:55:57

7

我很确定这是不可能的。

+1

@谁真实downvoting这样的:看看这个问题,这是一个直线上升的是否,可能或不可能。其他答案是更好的,但是首先正确回答问题的人投票反对吗?奇怪的。 – fig 2009-02-19 05:01:15

+0

+1在技术上是正确的。我的问题是是/否,是/否是我是否可以完全用JavaScript来完成。 – moffdub 2009-02-19 21:53:05

+0

谢谢 - 感谢。 :) – fig 2009-02-19 22:46:40

1

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

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

2

如果重写警报,代码中的任何操作,会发生什么?

例如

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

将该行注释掉后,出现警告。通过注释行,不会显示警报。

0

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

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; 
     } 
    } 
} 
相关问题