Есть ли способ имитировать нажатие на предупреждение в JavaScript? - PullRequest
8 голосов
/ 19 февраля 2009

У меня есть страница с iframe, исходная страница которой находится в отдельном домене. Время от времени исходная страница генерирует предупреждение. Когда он делает это, он останавливает то, что он делает, пока пользователь не нажмет OK для предупреждения.

То, что я хотел бы сделать, это программно нажать кнопку «ОК» в этом предупреждении, чтобы исходная страница снова стала полезной. Это возможно?

Ответы [ 6 ]

17 голосов
/ 19 февраля 2009

JavaScript является однопоточным, что означает, что при вызове функции он блокируется, пока не вернется. Когда вы вызываете alert (), он передает управление браузеру, который решает, как его обработать. Это не Javascript, который выдает диалог пользовательского интерфейса, это браузер. alert () не возвращается, пока браузер не получит событие «ОК» и не вернет управление. Поток javascript останавливается до тех пор, пока это не произойдет.

Таким образом, по крайней мере по двум различным причинам, указанным в предыдущем абзаце, ответ будет нет :)

8 голосов
/ 19 февраля 2009

Я уверен, что это невозможно.

3 голосов
/ 19 февраля 2009

У вас не должно быть проблем, если вы знаете текст предупреждения и не возражаете запачкаться.

Вы можете переопределить предупреждение окна 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;
        }
    }
}
2 голосов
/ 19 февраля 2009

Что произойдет, если вы переопределите предупреждение с неактивным в вашем коде?

, например

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

С закомментированной строкой появляется предупреждение. С закомментированной строкой предупреждение не появляется.

1 голос
/ 19 февраля 2009

Я очень сомневаюсь в этом. Если под отдельным доменом вы имеете в виду тот, который вы не можете контролировать?

Если у вас есть контроль, вы можете изменить оповещения на модальные поля Javascript, которыми вы можете управлять.

0 голосов
/ 19 февраля 2009

Лучшим решением для решения ваших проблем с надоедливым JavaScript было бы переопределить его с помощью скриптового инструмента на стороне клиента, такого как Greasemonkey .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...