2012-08-04 14 views

Respuesta

14

Antes de anular el original alert, guárdelo.

var origAlert = alert; 
alert = 0; 
origAlert("foo"); 

Demostración: http://jsfiddle.net/jfriend00/tnNE7/


Si no puede guardar el valor original, la única otra forma que conozco para obtener acceso a la misma está en un iframe. He aquí un ejemplo:

alert = 0; 
var iframe = document.createElement("iframe"); 
iframe.height = 0; 
iframe.width = 0; 
document.body.appendChild(iframe); 
iframe.contentWindow.alert.call(window, "foo");​ 

Ejemplo de trabajo: http://jsfiddle.net/jfriend00/waMEV/

No he probado esto en todos los navegadores, pero funciona en Chrome, IE y Firefox y creo que debería funcionar en otros navegadores.

+0

Lo siento, olvidé mencionar. No estoy anulando la alerta. Otra secuencia de comandos es. – Dogbert

+0

Y estoy ejecutando esto en un sitio existente. Mi código siempre se carga más tarde :) – Dogbert

+0

@AnkitGautam Caso de uso: no quiero que el sitio web sepa que llamé a una función. Podrían modificar esa función de su secuencia de comandos, por lo que se comporta exactamente como la secuencia de comandos anterior, pero registra en algún lugar que utilicé esa función. – Dogbert

6

Ok, yo soy el primero en admitir que esto es una respuesta feo, pero parece que funciona:

alert = 0; 

var win = window.open(), 
    method = win.alert; 
win.close(); 

method.call(window, "my message"); 

Fiddle here. En esencia, se crea una nueva instancia de la ventana y robar su método alert. El inconveniente es que en realidad tiene que abrir una nueva ventana del navegador, aunque sea brevemente. Dudo que esta sea en realidad una solución práctica para su problema, depende de qué otro sitio intente trabajar y cuánto le interesa su solución al usuario final.

Editar: Este es un combo de la respuesta anterior y la respuesta de jfriend00, que resuelve el problema "abrir una nueva ventana". Creo que esta es una opción algo mejor, ya que a) no se basa en que el iframe todavía está en el DOM cuando necesitas llamar al método, yb) debe ser generalizable a cualquier método window, que probablemente no sea la respuesta de jfriend00 't.

alert = 0; 

// make a new window instance in an iframe 
var iframe = document.createElement("iframe"); 
iframe.height = iframe.width = 0; 
document.body.appendChild(iframe); 
// steal the method 
var method = iframe.contentWindow.alert; 
// remove the evidence 
document.body.removeChild(iframe); 

// now use the method for your own purposes 
function myAlert(message) { 
    method.call(window, message); 
} 
myAlert("foo"); 
+0

¿Por qué llamas a 'win'' alert' con 'this' establecido en' window' en lugar de 'win'? – icktoofay

+0

He cerrado 'win', por lo que no funcionará. – nrabinowitz

+0

¿Qué le parece robar el fn de un iframe recién creado?El resultado sería el mismo, solo que no aparece una nueva ventana –

Cuestiones relacionadas