2009-02-19 17 views
7

Tengo una página con un iframe cuya página fuente está en un dominio separado. De vez en cuando, la página de origen genera una alerta. Cuando lo hace, detiene lo que está haciendo hasta que el usuario hace clic en Aceptar a la alerta.¿Hay alguna manera de simular un clic en una alerta en JavaScript?

Lo que me gustaría hacer es hacer clic en Aceptar en esta alerta mediante programación para que la página de origen pueda volver a ser útil. es posible?

Respuesta

16

JavaScript es de subproceso único, lo que significa que cuando se llama a una función, bloquea hasta que vuelva. Cuando llamas a alert(), eso pasa el control al navegador que decide cómo manejarlo. No es Javascript, que está apareciendo el cuadro de diálogo de la interfaz de usuario, es el navegador. alert() no regresa hasta que el navegador recibe el evento "OK" y devuelve el control. El hilo de JavaScript se detiene hasta que eso suceda.

Así, por al menos dos razones diferentes expresadas en el párrafo anterior, la respuesta es no :)

+0

Confirmado mis sospechas. Tendré que usar algo adicional o en lugar de JavaScript para este. – moffdub

+0

El subproceso de JavaScript no se detiene, los mensajes siguen siendo bombeados y cualquier temporizador o cambio asincrónico disparará controladores de eventos, y JS en esos controladores aún se ejecutará. –

7

Estoy bastante seguro de que no es posible.

+1

@ Quien está downvoting esto: echar un vistazo a la pregunta, que es una recta de sí o no, posible o no-posible. Las otras respuestas son mejores, ¿pero un voto negativo por ser el primero en responder la pregunta correctamente? Extraño. – fig

+0

+1 por ser técnicamente correcto. Mi pregunta era sí/no y el sí/no era si podía hacerlo completamente en JavaScript. – moffdub

+0

Gracias, lo agradezco. :) – fig

1

Lo dudo mucho. Si por dominio separado, ¿te refieres a uno sobre el cual no tienes control?

Si tiene control, puede cambiar las alertas a cuadros de JavaScript modales, que puede controlar.

2

¿Qué pasa si se reemplaza con una alerta de la operación no está en su código?

p. Ej.

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

Con la línea comentada, aparece la alerta. Con la línea comentada, la alerta no aparece.

+0

Esta es una buena alternativa, suponiendo que al desarrollador no le importe perder alertas en todos los ámbitos. –

+0

No, el iframe no leerá la función de alerta sobrescrita. –

+0

¿Esto funcionaría incluso si el código ofensivo está en un iframe cuya fuente está en un dominio separado? – fig

0

La mejor apuesta para resolver sus problemas con JavaScript molesto sería anularla con una herramienta de creación de secuencias de comandos del lado del cliente como Greasemonkey.

3

No debería tener un problema si conoce el texto de la alerta y no le importa ensuciar.

Puede anular alerta de la ventana de marco flotante con su propio y hacer algo al efecto de ..

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

Editar: hice una pequeña prueba con un controlador de proxy (está en asp.net/c# pero debe tener la idea) ...

La página externa en mi prueba es una página w3 con un botón que muestra una alerta, la alerta ahora se pasa a través de la función definida por el usuario.

Estoy seguro de que esto es mucho más sucio de lo que te gustaría obtener.

Página:

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

La fuente de iframe está en un dominio externo, por lo que se denegó el permiso cuando probé esto. – moffdub

+0

Sí, tenía miedo de que los permisos del dominio causen un problema, solo la solución es crear una página/controlador de proxy local, etc. para cargar la página remota, entonces está en el dominio y esta secuencia de comandos debería funcionar. –

Cuestiones relacionadas