有没有办法在JavaScript中模拟点击警报?
我有一个带有iframe的页面,其源页面位于单独的域中。源页面会不时生成警报。当它执行此操作时,它会停止正在执行的操作,直到用户单击“确定”以显示警报有没有办法在JavaScript中模拟点击警报?,javascript,alerts,Javascript,Alerts,我有一个带有iframe的页面,其源页面位于单独的域中。源页面会不时生成警报。当它执行此操作时,它会停止正在执行的操作,直到用户单击“确定”以显示警报 我想做的是以编程方式单击此警报上的OK,这样源页面就可以恢复有用状态。这可能吗?我很肯定这不可能。我非常怀疑。如果说独立域,你是指你无法控制的域吗 如果您有控制权,您可以将警报更改为模态Javascript框,您可以对其进行控制。Javascript是单线程的,这意味着当您调用函数时,它会阻塞直到返回。调用alert()时,它会将控件传递给浏览器
我想做的是以编程方式单击此警报上的OK,这样源页面就可以恢复有用状态。这可能吗?我很肯定这不可能。我非常怀疑。如果说独立域,你是指你无法控制的域吗
如果您有控制权,您可以将警报更改为模态Javascript框,您可以对其进行控制。Javascript是单线程的,这意味着当您调用函数时,它会阻塞直到返回。调用alert()时,它会将控件传递给浏览器,由浏览器决定如何处理该控件。弹出UI对话框的不是Javascript,而是浏览器。在浏览器收到“OK”事件并返回控件之前,alert()不会返回。javascript线程将暂停,直到发生这种情况
因此,出于上述段落中所述的至少两个不同的原因,答案是:no:)如果您在代码中使用no op覆盖警报,会发生什么 e、 g
//取消注释下一行以删除警报
//函数警报(nope){return;}
$(document).ready(函数(){alert(“Hello,world!”;});
注释掉该行后,将显示警报。注释行后,警报不会出现。解决恼人的JavaScript问题的最佳方法是使用客户端脚本工具覆盖它,如。如果您知道警报文本,并且不介意弄脏,则不应该出现问题 您可以使用自己的警报覆盖iframe窗口的警报,并执行以下操作
document.getElementById("InnerFrameName").contentWindow.alert = function(){
if (arguments[0].toLowerCase() == "innerframe alert text")
return; //supress
else
alert(arguments[0]);
};
编辑:我用一个代理处理程序做了一个小测试(它在asp.net/c中,但你应该明白了)
我的测试中的外部页面是一个w3页面,带有一个显示警报的按钮,警报现在通过用户定义的函数传递
我相信这比你想要的脏多了
第页:
你好,来自MyPage
函数frameLoaded(){
document.getElementById(“InnerFrameName”).contentWindow.alert=函数(){
if(参数[0].toLowerCase()=“我是一个警报框!!”){
警报(“消息将被禁止:+参数[0]);
return;//suppress
}否则{
警报(参数[0]);
}
};
}
内部页面(顶层)
德普!。。。
代理处理程序:
<%@ 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;
}
}
}
使用制度;
使用System.Web;
公共类页面代理:IHttpHandler{
公共void ProcessRequest(HttpContext上下文){
byte[]externalPage=new System.Net.WebClient().DownloadData(context.Request[“externalURI”]);
context.Response.OutputStream.Write(externalPage,0,externalPage.Length);
context.Response.End();
}
公共布尔可重用{
得到{
返回false;
}
}
}
这是一个很好的替代方案,假设开发人员不介意全面丢失警报。即使有问题的代码位于源位于单独域中的iframe中,这种方法是否有效?我在iframe的父级中尝试过这种方法,但它对iframe生成的警报没有影响。但是,它确实会抑制iframe父级生成的所有警报。@不管是谁否决了这一点:看看这个问题,它是一个直接的是否、可能还是不可能的问题。其他的答案更好,但是第一个正确回答问题的人会投反对票吗?奇怪。技术上正确的+1。我的问题是是/否,是/否是我是否可以完全用JavaScript完成。iframe源位于外部域中,因此在我尝试此操作时权限被拒绝。是的,我担心域权限会导致问题,唯一的解决办法是创建一个本地代理页面/处理程序等来加载远程页面,这样它就在域中,这个脚本应该可以工作。证实了我的怀疑。我需要在JavaScript之外使用一些东西,或者用它来代替JavaScript。JavaScript线程没有停止,消息仍然被压缩,任何计时器或异步更改仍然会触发事件处理程序,这些处理程序中的JS仍然会运行。
<%@ 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;
}
}
}