2009-02-19 17 views
7

Mam stronę z ramką iframe, której strona źródłowa znajduje się w oddzielnej domenie. Od czasu do czasu strona źródłowa generuje alert. Gdy to zrobi, zatrzymuje to, co robi, dopóki użytkownik nie kliknie przycisku OK.Czy istnieje sposób symulacji kliknięcia alertu w języku JavaScript?

Co chciałbym zrobić, to programowo kliknąć OK w tym ostrzeżeniu, aby strona źródłowa mogła wrócić do użyteczności. czy to możliwe?

Odpowiedz

16

JavaScript jest jednowątkowy, co oznacza, że ​​podczas wywoływania funkcji blokuje się do momentu jego powrotu. Kiedy wywołujesz alert(), to przekazuje kontrolę do przeglądarki, która decyduje, jak sobie z tym poradzić. To nie jest JavaScript, który pojawia się w oknie interfejsu użytkownika, to jest przeglądarka. alert() nie powraca, dopóki przeglądarka nie otrzyma zdarzenia "OK" i nie zwróci kontroli. Wątek javascript zostaje zatrzymany, aż do tego momentu.

Więc na co najmniej dwa różne powody wskazane w powyższym akapicie, odpowiedź jest nr :)

+0

Potwierdziłem moje podejrzenia. W tym celu będę musiał użyć czegoś oprócz lub zamiast JavaScript. – moffdub

+0

Wątek JavaScript nie jest zatrzymywany, wiadomości nadal są pompowane, a wszelkie liczniki czasu lub asynchroniczne zmiany nadal będą uruchamiały procedury obsługi zdarzeń, a JS w tych programach obsługi nadal będzie działał. –

7

Jestem prawie pewien, że to niemożliwe.

+1

@ Ktokolwiek downvoting to: spójrz na pytanie, co jest prostym w górę tak, nie, to możliwe, lub nie-możliwe. Pozostałe odpowiedzi są lepsze, ale głosowanie na niższy stopień jest pierwszą odpowiedzią na pytanie poprawnie? Dziwne. – fig

+0

+1 za poprawność techniczną. Moje pytanie brzmiało "tak"/"nie", a "tak"/"nie" brzmiało: czy mogę zrobić to w całości w JavaScript. – moffdub

+0

Dzięki - doceń to. :) – fig

1

Bardzo w to wątpię. Czy przez oddzielną domenę rozumiesz tę, nad którą nie masz kontroli?

Jeśli masz kontrolę, możesz zmienić alerty na modalne pola Javascript, które możesz kontrolować.

2

Co się dzieje, jeśli zastąpić alert z nie-op w kodzie?

np.

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

Po skomentowaniu linii pojawi się ostrzeżenie. Po skomentowaniu linii alert nie pojawia się.

+0

Jest to dobra alternatywa, zakładając, że deweloper nie ma nic przeciwko utracie ostrzeżeń na całej tablicy. –

+0

Nie, element iframe nie odczyta nadpisanej funkcji alertu. –

+0

Czy to działałoby, nawet jeśli kod naruszający prawa znajduje się w elemencie iframe, którego źródło znajduje się w oddzielnej domenie? – fig

0

Najlepszą opcją rozwiązania problemów z denerwującym JavaScriptem byłoby zastąpienie go narzędziem skryptowym po stronie klienta, takim jak Greasemonkey.

3

Nie powinieneś mieć problemu, jeśli znasz tekst alarmu i nie masz nic przeciwko zabrudzeniu.

Można zastąpić zaalarmować okna iframe z własnych i zrobić coś do skutku ..

document.getElementById("InnerFrameName").contentWindow.alert = function(){ 
    if (arguments[0].toLowerCase() == "innerframe alert text") 
     return; //supress 
    else 
     alert(arguments[0]); 
}; 

Edit: zrobiłem mały test z obsługi proxy (nie jest to jednak w asp.net/c# powinieneś dostać pomysł) ...

Strona zewnętrzna w moim teście to strona w3 z przyciskiem, który wyświetla alert, alert jest teraz przekazywany przez funkcję zdefiniowaną przez użytkownika.

Jestem pewien, że jest o wiele bardziej brudny niż chciałbyś dostać.

strony:

<%@ 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> 

Proxy Handler:

<%@ 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; 
     } 
    } 
} 
+0

Źródło iframe znajduje się w domenie zewnętrznej, więc odmówiono uprawnień, gdy próbowałem tego. – moffdub

+0

Tak, bałem się, że uprawnienia do domeny spowodują problem, tylko obejście tworzy lokalną stronę proxy/handler itp., Aby załadować stronę zdalną, więc jest to w domenie i ten skrypt powinien działać. –

Powiązane problemy