2009-02-19 21 views

Antwort

16

JavaScript ist single-threaded, das heißt, wenn Sie eine Funktion aufrufen, blockiert es, bis es zurückkehrt. Wenn Sie alert() aufrufen, übergibt das die Kontrolle an den Browser, der entscheidet, wie er damit umgehen soll. Es ist nicht Javascript, das den UI-Dialog öffnet, es ist der Browser. alert() kehrt erst zurück, wenn der Browser das Ereignis "OK" empfängt und die Steuerung zurückgibt. Der JavaScript-Thread wird angehalten, bis das passiert.

Also für mindestens zwei unterschiedlichen Gründen im obigen Absatz erwähnt, ist die Antwort keine :)

+0

Bestätigte meinen Verdacht. Ich werde etwas zusätzlich zu oder anstelle von JavaScript für dieses verwenden müssen. – moffdub

+0

JavaScript-Thread wird nicht angehalten, die Nachrichten werden immer noch gepumpt und alle Timer oder asynchronen Änderungen werden weiterhin Event-Handler auslösen, und JS in diesen Handlern wird weiterhin ausgeführt. –

7

Ich bin mir ziemlich sicher, dass es nicht möglich ist.

+1

@ Wer dies ist Downvoting: werfen Sie einen Blick auf die Frage, was ein straight-up Ja-Nein, möglich oder nicht-möglich ist. Die anderen Antworten sind besser, aber ein Down-Votum, um als Erster die Frage richtig zu beantworten? Seltsam. – fig

+0

+1 für technisch korrekt sein. Meine Frage war ja/nein und das Ja/Nein war, ob ich es komplett in JavaScript machen könnte. – moffdub

+0

Danke - schätze es. :) – fig

1

Ich bezweifle es sehr. Wenn Sie mit separater Domäne meinen, eine, auf die Sie keine Kontrolle haben?

Wenn Sie Kontrolle haben, könnten Sie die Warnungen in modale Javascript-Boxen ändern, die Sie steuern können.

2

Was ist, wenn Sie mit einer No-op in Ihrem Code überschreiben Alarm geschieht?

z.B.

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

Wenn die Zeile auskommentiert erscheint, erscheint eine Warnung. Wenn die Zeile kommentiert ist, wird die Warnung nicht angezeigt.

+0

Dies ist eine gute Alternative, vorausgesetzt, der Entwickler hat nichts dagegen, Warnungen auf der ganzen Linie zu verlieren. –

+0

Nein, der Iframe liest die überschriebene Alarmfunktion nicht. –

+0

Würde dies funktionieren, selbst wenn der fehlerhafte Code in einem Iframe ist, dessen Quelle sich in einer separaten Domäne befindet? – fig

0

Die beste Lösung, um Ihre Probleme mit lästigem JavaScript zu lösen, wäre, es mit einem clientseitigen Skript-Tool wie Greasemonkey zu überschreiben.

3

Sie sollten kein Problem haben, wenn Sie den Text der Warnung kennen und nichts dagegen haben, schmutzig zu werden.

können Sie überschreiben die Benachrichtigung des iframe Fenster mit Ihrem eigenen und etwas tun, um die Wirkung von ..

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

Edit: Ich habe einen kleinen Test mit einem Proxy-Handler (es ist in asp.net/c# aber Sie sollten die Idee bekommen) ...

Die externe Seite in meinem Test ist eine w3-Seite mit einer Schaltfläche, die eine Warnung anzeigt, die Warnung wird nun durch die benutzerdefinierte Funktion übergeben.

Ich bin sicher, das ist viel dreckiger, als Sie gerne bekommen würden.

Seite:

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

Die iframe-Quelle befindet sich in einer externen Domäne, daher wurde die Berechtigung verweigert, als ich dies versuchte. – moffdub

+0

Ja, ich hatte Angst, Domain-Berechtigungen würden ein Problem verursachen, nur Workaround dann erstellt eine lokale Proxy-Seite/Handler etc zum Laden der Remote-Seite, es ist dann in-Domäne und dieses Skript sollte funktionieren. –

Verwandte Themen