我有一个页面,其源页面位于一个单独的域中。有时候,源页面会生成警报。当它这样做时,它会停止它正在做的事情,直到用户单击确定提醒。有没有办法在JavaScript中模拟点击警报?
我想要做的是以编程方式在此警报上单击确定,以便源页面可以恢复为有用。这可能吗?
我有一个页面,其源页面位于一个单独的域中。有时候,源页面会生成警报。当它这样做时,它会停止它正在做的事情,直到用户单击确定提醒。有没有办法在JavaScript中模拟点击警报?
我想要做的是以编程方式在此警报上单击确定,以便源页面可以恢复为有用。这可能吗?
JavaScript是单线程的,这意味着当你调用一个函数时,它会阻塞,直到它返回。当你调用alert()时,它将控制传递给浏览器,决定如何处理它。它不是弹出UI对话框的Javascript,而是浏览器。在浏览器收到“OK”事件并返回控制权之前,alert()不会返回。 JavaScript线程被暂停,直到发生这种情况。
所以至少有两个不同的原因在上面一段所述,答案是没有:)
我非常怀疑它。如果通过单独的域名,你的意思是你无法控制的吗?
如果您确实有控制权,您可以将警报更改为可以控制的模态JavaScript框。
如果重写警报,代码中的任何操作,会发生什么?
例如
<script>
// uncomment next line to swallow alerts
// function alert(nope) { return; }
<script>
<script>
$(document).ready(function() { alert("Hello, world!"); });
</script>
将该行注释掉后,出现警告。通过注释行,不会显示警报。
解决烦人的JavaScript问题的最佳方法是使用客户端脚本工具(如Greasemonkey)覆盖它。
如果您知道警报的文本并且不介意变脏,则不应该有任何问题。
你可以用自己的覆盖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;
}
}
}
证实了我的怀疑。我将需要使用除此之外的或者代替JavaScript的东西。 – moffdub 2009-02-21 23:55:57