2010-08-12 11 views
5

Supongamos que tenía la siguiente función:¿Cómo se puede cambiar dinámicamente una línea de una función de JavaScript?

function alertMesg() 
{ 
    alert("This ok function alerts message!"); 
} 

Ahora en tiempo de ejecución me gustaría cambiar la función alertMesg para hacer otra cosa. Mi idea era hacer algo así.

var temp = window.alertMesg.toString.replace("ok","great") 
temp = temp.replace('function alertMesg()',""); 
window.alertMesg = new Function(temp); 

Básicamente, el problema es que no tengo control sobre la fuente en la función alertMesg. Me gustaría cambiar la función, pero en realidad no puedo cambiar la fuente porque se produce en el lado del servidor. Dicho eso, necesito que actúe de manera diferente.

PD: Olvidé mencionar una parte importante: tengo que mantener la mayor parte de la función. No puedo simplemente reemplazar la función correctamente. Tengo que mantener el 95% de la función como está, y cambiar el otro cinco por ciento.

@Barlow Tucker, quixoto, pekka Gracias, por el interés.

Básicamente, no creo que la idea de proxy funcionará porque no solo estoy agregando funcionalidad, estoy cambiando la funcionalidad del código. Quiero, por ejemplo, que la tercera línea de la función sea diferente. En mi ejemplo de la vida real, tengo que agregar una línea justo en el medio de una función.

+0

posible duplicado de [JavaScript: Anulación de alerta()] (http://stackoverflow.com/questions/1729501/javascript-overriding-alert) –

+1

Ese duplicado debe responderlo (Consulte la respuesta aceptada con el "patrón de proxy") , reemplace 'window.alert()' por su función). –

+0

Proxy podría permitirme agregar funcionalidad a esta función, pero no me permite eliminar la funcionalidad. –

Respuesta

5

Si debe reemplazar el contenido de una función, es posible:

function alertMesg() 
{ 
    alert ("This ok function alerts my message!"); 
} 

alertMesg(); // alerts "This ok function alerts my message!" 

// do whatever you want to the function here 
var temp = alertMesg.toString(); 
temp = temp.replace('my', 'your'); 

// now replace the original function 
alertMesg=new Function(temp.substring(temp.indexOf('{')+1,temp.lastIndexOf('}'))); 

alertMesg(); // alerts "This ok function alerts your message!" 

Esto probablemente no es la mejor manera de hacer lo que estamos tratando de lograr, pero no puedo realmente sugiero cualquier otra cosa a menos que proporciones más detalles.

+0

Lo seguí al principio, pero me perdiste en la evaluación. Simplemente llamando a eval on temp mágicamente cambia alertMesg? Probé tu fuente en IE y obtuve un error de JavaScript. –

+0

Hmm ... si su función se define como alertMesg = function(), entonces quizás tenga que usar 'alertMesg = eval ('(' + temp + ')');' en su lugar. –

+0

Ahora recibo un error de objeto esperado, en la llamada final alertMesg(). –

4

El reemplazo del código dinámico como el que está sugiriendo puede funcionar en algunos casos, pero es un camino aterrador: un paso frágil, un paso equivocado y que se rompe, y rápidamente se convierte en una pesadilla de mantenimiento.

Como comentarista dijo, su apuesta más limpia es simplemente envuelva el nativo window.alert y luego hacer lo correcto cuando la cadena se preocupa por llega a través de, por la respuesta aquí: JavaScript: Overriding alert()

(Insertar comentario estándar aquí acerca de cómo debe hacer para que sus subordinados del servidor estén en la misma página/equipo que usted en esto, así no tendrá que hackear su propia página.)

ACTUALIZACIÓN: No está preguntando sobre alerta, está preguntando sobre este problema en general. Sí, podrías lo que otros sugieren. Pero si tienes el código original para la función, ¿por qué no simplemente lo reemplazas por completo? Si la función que desea es una función global llamada foo(), puede ejecutar JS que hace:

window.foo = function() { 
    // The stuff I know is there (A) 
    ... 
    // Some new stuff I want to change (B) 
    ... 
    // More stuff I know is there (C) 
} 

Qué se tire el original y reemplazarlo con su versión. Esto funcionaría razonablemente bien, aunque "parchear mono" las cosas en la página definitivamente viene con algunos dolores de cabeza de mantenimiento.

Definitivamente señalaré aquí que si no puede hacer esto por alguna razón y por lo tanto insiste en reemplazar el código de texto en medio de las funciones existentes, está abusando del idioma/entorno con el fin de mantenerlo cualquier cosa, y estás realmente jodido de múltiples maneras.

+0

Supongamos que la función original tiene la parte a, la parte b y la parte c. Quiero que la nueva función tenga la parte a, la parte b, una nueva parte y luego la parte c. Con la sobreescritura, solo puedo hacer que la nueva función sea como nueva parte, parte a, parte b, parte c, o como parte a, parte b, parte c, y luego la parte nueva. A menos que no lo entiendo, la nueva parte que estoy agregando no puede estar en el medio de la función con tu idea. –

+0

Necesito agregar un código en el medio de la función, no el inicio ni el final. Sin embargo, gracias, por intentarlo. –

+0

La función de JavaScript que tengo que modificar es producida dinámicamente por JSF, del lado del servidor, y es diferente en cada página. Realmente necesito una solución que me permita modificar la función existente, porque realmente no sé qué habrá en la función antes de tiempo. Básicamente sigue un patrón, y sé lo que necesito cambiar cada vez, pero no sé todas las cosas en la función antes del área que quiero cambiar. Creo que puedo adivinar todas las cosas después de ese punto, si eso ayuda. –

Cuestiones relacionadas