有没有办法在 JavaScript 中模拟点击警报?
Posted
技术标签:
【中文标题】有没有办法在 JavaScript 中模拟点击警报?【英文标题】:Is there a way to simulate a click on an alert in JavaScript? 【发布时间】:2009-02-19 03:52:50 【问题描述】:我有一个带有 iframe 的页面,其源页面位于单独的域中。源页面有时会生成警报。当它这样做时,它会停止它正在做的事情,直到用户单击“确定”来发出警报。
我想做的是以编程方式单击此警报上的“确定”,以便源页面可以恢复使用。这可能吗?
【问题讨论】:
【参考方案1】:javascript 是单线程的,这意味着当你调用一个函数时,它会阻塞直到它返回。当你调用 alert() 时,它会将控制权传递给决定如何处理它的浏览器。弹出 UI 对话框的不是 Javascript,而是浏览器。在浏览器收到“OK”事件并返回控制权之前,alert() 不会返回。 javascript 线程会停止,直到发生这种情况。
因此,至少出于上段所述的两个不同原因,答案是否 :)
【讨论】:
证实了我的怀疑。除了 JavaScript 之外,我还需要使用一些东西来代替它。 JavaScript 线程没有停止,消息仍在发送,任何计时器或异步更改仍将触发事件处理程序,并且这些处理程序中的 JS 仍将运行。【参考方案2】:我很确定这是不可能的。
【讨论】:
@Whoever 对此表示反对:看看这个问题,这是一个直接的是-否,可能或不可能。其他答案更好,但是对于第一个正确回答问题的人投反对票?很奇怪。 +1 表示技术上正确。我的问题是是/否,是/否是我是否可以完全用 JavaScript 完成。【参考方案3】:如果您在代码中使用 no-op 覆盖警报会发生什么?
例如
<script>
// uncomment next line to swallow alerts
// function alert(nope) return;
<script>
<script>
$(document).ready(function() alert("Hello, world!"); );
</script>
注释掉该行后,会出现警报。注释行时,不会出现警报。
【讨论】:
这是一个不错的选择,假设开发人员不介意全面丢失警报。 即使有问题的代码位于源代码位于单独域中的 iframe 中,这也能正常工作吗? 我已经在 iframe 的父级中尝试过这个,它对 iframe 生成的警报没有影响。但是,它会抑制 iframe 的父级生成的所有警报。【参考方案4】:如果您知道警报的文本并且不介意弄脏,那么您应该没有问题。
你可以用你自己的覆盖 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;
【讨论】:
iframe 源位于外部域中,因此尝试此操作时权限被拒绝。 是的,我担心域权限会导致问题,唯一的解决方法是创建一个本地代理页面/处理程序等来加载远程页面,这样它就在域内并且这个脚本应该可以工作。跨度> 【参考方案5】:我非常怀疑。如果使用单独的域,您是指您无法控制的域吗?
如果您有控制权,您可以将警报更改为您可以控制的模态 Javascript 框。
【讨论】:
【参考方案6】:解决烦人的 JavaScript 问题的最佳选择是使用客户端脚本工具(如 Greasemonkey)覆盖它。
【讨论】:
以上是关于有没有办法在 JavaScript 中模拟点击警报?的主要内容,如果未能解决你的问题,请参考以下文章
如果记录已经存在或者在 PDO MySQL 插入查询中不存在,如何生成 javascript 警报?