2012-04-23 9 views
6

Mam dwie różne strony JSP, które Java backend łączy razem i odsyła z powrotem do tej samej renderowanej strony HTML.Zakres funkcji JavaScript między znacznikami skryptu

Każdy JSP ma własną <script> blok i określa funkcje wewnątrz tego bloku:

JSP # 1:

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

JSP # 2

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

Tak jak mówiłem, backend dodaje do odpowiedzi HTTP i wysyła je z powrotem do przeglądarki podczas tego samego żądania.

Po uruchomieniu tej strony w przeglądarce mogę stwierdzić od razu, że blah() nie jest wykonywane po otrzymaniu wywołania foo(). Widzę błąd konsoli w Firebug stwierdzający, że blah() nie jest zdefiniowany. Zastanawiam się, czy blah() ma tylko zakres w swoim własnym tagu <script> i podobnie dla foo(). Czy tak jest w tym przypadku, czy jest to coś innego?

Po przejściu do źródła strony widzę zarówno bloki skryptów, jak i obie funkcje. To mówi mi, że wszystko jest generowane/renderowane poprawnie po stronie serwera, ale być może moje podejście jest z natury błędne (definiowanie funkcji wewnątrz różnych znaczników skryptu). Z góry dziękuję.

+2

kiedy i jak można wywołać foo()? – Philipp

+0

Funkcja foo() jest wywoływana, gdy użytkownik najedzie myszą na element. Mogę sprawdzić, czy zostanie wywołany, zastępując jego zawartość instrukcją alertu (""). – IAmYourFaja

Odpowiedz

5

wszystkie z nich są globalne. widzą się nawzajem. problemem jest to, kiedy się zdefiniują i nawiążą do siebie.

należy zdefiniować i nazwać je w następującej kolejności:

  1. bar
  2. foo
  3. wywołanie foo
    • foo wykonany i wzywa bar
    • Pasek jest wykonany
+0

Cóż, foo() jest zdefiniowane wewnątrz nagłówka strony, a bar() jest zdefiniowany wewnątrz stopki. Dlatego foo() wydaje się "wyższy" (numer wiersza mądry) w wynikowym HTML niż bar(). Czy jest możliwe, że skoro wszystkie są zdefiniowane przy ładowaniu strony, to ponieważ foo() zostaje zdefiniowane jako pierwsze, bar() jeszcze nie istnieje? W takim przypadku jak wymusić najpierw bar bar() zdefiniować (lub lepiej, że foo() nie zostanie wywołany, dopóki bar() nie został już zdefiniowany podczas ładowania strony)?!? – IAmYourFaja

+0

Ahhh, to był problem z zamówieniem. Umieściłem bar() w nagłówku powyżej definicji foo() i wszystko jest w porządku. Dzięki Joseph! – IAmYourFaja

0

Jedyną rzeczą, która definiuje zasięg w JavaScript jest funkcja, więc twój problem nie jest problemem z zakresu. Najprawdopodobniej nie wywołujesz foo(), nazywasz to przed zdefiniowaniem blah() lub gdzieś masz błąd składni. Może możesz opublikować całą stronę HTML, abyśmy mogli zobaczyć, co się dzieje.

+0

Doceniam twoje dane wejściowe, ale rzeczywisty kod HTML * jest * ogromny * i wymaga, aby to nie-SSCCE było nawet * odczytywane *. Proszę zobaczyć moje komentarze pod odpowiedzią @ Josepha, ponieważ myślę, że jest na dobrej drodze. Jeszcze raz dziękuję za Twoją pomoc. – IAmYourFaja

+0

Rozumiem. Wspomniałem jego odpowiedź również w jednym z możliwych rozwiązań w mojej odpowiedzi. Dobrze słyszeć, że to działa – koenpeters

1

funkcja jak to można nazwać:

(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(); 
    }); 
Powiązane problemy