2012-04-23 5 views
6

Tengo dos JSP diferentes que el backend de Java concatena y envía de vuelta a la misma página HTML renderizada.Alcance de la función de JavaScript entre las etiquetas de secuencia de comandos

Cada JSP tiene su propio bloque <script> y define las funciones dentro de ese bloque:

JSP # 1:

<script type="text/javascript"> 
    function blah() { ... } 
</script> 

JSP # 2

<script type="text/javascript"> 
    function foo() 
    { 
     blah(); 
    } 
</script> 

Como dije, el back-end añade estos a la respuesta HTTP y los envía de vuelta al navegador durante la misma solicitud.

Cuando ejecuto esta página en mi navegador, puedo decir de inmediato que blah() no se está ejecutando cuando se llama a foo(). Veo un error de consola en Firebug indicando blah() no está definido. Me pregunto si blah() solo tiene alcance dentro de su propia etiqueta <script>, y lo mismo para foo(). ¿Es ese el caso aquí, o hay algo más equivocado?

Cuando voy a ver el origen de la página veo ambos bloques de scripts y ambas funciones. Esto me dice que todo se está generando/procesando correctamente en el lado del servidor, pero tal vez mi enfoque sea intrínsecamente incorrecto (definiendo las funciones dentro de diferentes etiquetas de script). Gracias por adelantado.

+2

cuándo o cómo se llama foo()? – Philipp

+0

foo() se invoca cuando un usuario coloca su mouse sobre un elemento. Puedo verificar que se llama reemplazando su contenido con una declaración de alerta (""). – IAmYourFaja

Respuesta

5

todos ellos son globales. pueden verse el uno al otro. el problema es cuando se definen y se llaman entre sí.

debe definir y llamarlos en este orden:

  1. barra
  2. foo
  3. llamada foo
    • foo ejecutado y las llamadas barras
    • se ejecuta
    • barra
+0

Bueno, foo() se define dentro de un encabezado de página, y bar() se define dentro del pie de página. Por lo tanto, foo() aparece "más alto" (número de línea) en el HTML resultante que bar(). ¿Es posible que, dado que todos están definidos en la carga de la página, porque foo() se defina primero, bar() aún no exista? En este caso, ¿cómo puedo forzar que bar() se defina primero (o mejor aún, que foo() no se llame hasta que bar() ya se haya definido durante la carga de la página)?!? – IAmYourFaja

+0

Ahhh, era un problema de pedido. Puse bar() en el encabezado sobre la definición de foo() y todo está bien. Gracias José! – IAmYourFaja

0

Lo único que define el alcance en JavaScript es una función, por lo que su problema no es un problema de alcance. Probablemente no estés llamando a foo(), lo llames antes de que se defina blah(), o tengas un error de sintaxis en alguna parte. Tal vez puedas publicar toda tu página HTML para que podamos ver lo que está pasando.

+0

Agradezco su opinión, pero el HTML real es * enorme * y requiere que este no-SSCCE sea incluso * factible *. Por favor, mire mis comentarios debajo de la respuesta de @ Joseph, ya que creo que está en el camino correcto. Gracias de nuevo por toda su ayuda hasta ahora. – IAmYourFaja

+0

Entiendo. Mencioné su respuesta también en una de las posibles soluciones en mi respuesta. Es bueno saber que lo tienes funcionando – koenpeters

1

Puede llamar función como esta:

(function($) { 

    var namespace; 
     namespace = { 
        something : function() { 
              alert('hello there!'); 
              }, 
         bodyInfo : function() { 
              alert($('body').attr('id')); 
              } 
        }; 
     window.ns = namespace; 
    })(this.jQuery); 

    $(function() { 
       ns.something(); 
       ns.bodyInfo(); 
    }); 
Cuestiones relacionadas