2011-05-07 28 views
6

Este es mi código:Javascript: la función está definida, pero el error dice ... ¡No se encuentra la función! (Extraño)

function mark() 
{ 
    alert("This is a test box.."); 
} 

setTimeout("mark()",5000); 

de error: Función de marcas() no se encuentra !!

Existe otro problema ... ya que funciona en http://jsfiddle.net/russcam/6EXa9/ pero no funciona en mi aplicación ... ¿me pueden ayudar a depurar esto?

¿Qué otra cosa puede ser la razón ... Por cierto estoy ejecutando esto dentro de un script de GreaseMonkey!

+2

es la función definida dentro de otra función, por casualidad? –

+0

¿qué entorno estás usando? Funciona bien - http://jsfiddle.net/russcam/6EXa9/ –

+0

Esto no está funcionando ... para mí .. No entiendo por qué? La función no está dentro de ninguna función, ¡es global! –

Respuesta

11

Si está utilizando GreaseMonkey, las funciones que defina son de espacio aislado por GM y no estarán disponibles en la ventana principal.
Sin embargo, cuando utiliza cualquiera de las funciones nativas, como setTimeout o alert, se llaman en el contexto de la ventana principal, por ejemplo; cuando se llama a setTimeout en realidad se está llamando window.setTimeout()

Ahora la función que ha definido, marca no existe en la ventana principal y lo que están pidiendo setTimeout que hacer es evaluar la cadena 'marca() '. Cuando se extingue el tiempo de espera window.eval('mark()') y como se indicó, window.mark no está definido. Por lo tanto, tiene un par de opciones:

1) Defina marca en el objeto ventana.GM le permite hacer esto a través de la unsafeWindow objeto como éste:

unsafeWindow.mark = function(){} 
setTimeout('mark()', 10);  //this works but is ugly, it uses eval 

2) Pasar una referencia a la marca local de a setTimeout:

function mark(){} 
setTimeout(mark, 10);  //this works too but you can't send parameters 

Pero lo que si es necesario para enviar los parámetros? Si ha definido su función en la ventana principal, el método eval funcionará (pero es fea - no lo haga)

unsafeWindow.mark2 = function(param) { 
    alert(param) 
} 
setTimeout('mark2("hello")', 10); //this alerts hello 

Pero este método funcionará para las funciones con parámetros si se han definido en la ventana principal o simplemente en GM la llamada se envuelve en una función anónima y pasó a setTimeout

setTimeout(function() { 
    mark2("hello") 
}, 10);        //this alerts hello 
5

tratan de utilizar thissetTimeout(mark,5000);

+0

¡Esto no resolvió el problema! :( –

+0

Introduje la función en la función setTimeout en sí misma ... y eso fue lo que hizo el truco para mí ... ¡pero no entendí lo que estaba sucediendo anteriormente! –

1

Si el único lugar que necesita para llamar a la función de mark es su intento de tiempo de espera:

setTimeout(function() { 
    alert("This is a test box.."); 
}, 5000); 
0

Sí, la parte mono de grasa podría hacer una diferencia. Grease Monkey casi seguramente envuelve su JavaScript en una función para evitar que su JavaScript entre en conflicto con el JavaScript de la página.

Está utilizando el formato de cadena de setTimeout y no hay garantía sobre en qué contexto se ejecutará la cadena aunque probablemente se encuentre en el ámbito global. El hecho de que su función esté visible donde ejecuta setTimeout no significa que su función será visible cuando la cadena sea eval ed.

Por lo tanto, no utilice la cadena de setTimeout (nunca), utilice el enfoque de Ander.by o el enfoque de función anónima de Walter Rumsby.

1

dos cuestiones:

  1. , no puede ajustar los temporizadores como este setTimeout("mark()",5000); en Greasemonkey. Ver GM pitfalls, Auto-eval Strings.

  2. Actualmente hay un error en Firefox 4. Las alertas fallarán dentro de los temporizadores. Ver "alert + setTimeout = failure". Es por eso que la respuesta de Ander.by no funciona.

Cuestiones relacionadas