Есть ли способ имитировать нажатие на предупреждение в JavaScript?
У меня есть страница с iframe, исходная страница которой находится в отдельном домене. Время от времени исходная страница генерирует предупреждение. Когда он делает это, он останавливает то, что он делает, пока пользователь не нажмет OK для предупреждения.
Что я хотел бы сделать, так это программно нажать кнопку "ОК" в этом предупреждении, чтобы исходная страница снова стала полезной. Это возможно?
6 ответов
JavaScript является однопоточным, что означает, что при вызове функции он блокируется, пока не вернется. Когда вы вызываете alert(), он передает управление браузеру, который решает, как его обработать. Это не Javascript, который выдает диалог пользовательского интерфейса, это браузер. alert() не возвращается, пока браузер не получит событие "ОК" и не вернет управление. Поток javascript останавливается до тех пор, пока это не произойдет.
Таким образом, по крайней мере по двум причинам, указанным в предыдущем абзаце, ответ будет отрицательным:)
Что произойдет, если вы переопределите предупреждение с неактивным в вашем коде?
например
<script>
// uncomment next line to swallow alerts
// function alert(nope) { return; }
<script>
<script>
$(document).ready(function() { alert("Hello, world!"); });
</script>
С закомментированной строкой появляется предупреждение. С комментариями в строке предупреждение не появляется.
У вас не должно быть проблем, если вы знаете текст предупреждения и не возражаете запачкаться.
Вы можете переопределить предупреждение окна 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, которые вы можете контролировать.
Лучшим решением для решения ваших проблем с надоедливым JavaScript было бы переопределить его с помощью скриптового инструмента на стороне клиента, такого как Greasemonkey.