2012-04-23 2 views
6

У меня есть два разных JSP, которые Java-сервер объединяет вместе и отправляет обратно на ту же визуализированную HTML-страницу.Область действия JavaScript между сценариями тегов

Каждый JSP имеет свой собственный <script> блок и определяет функции внутри этого блока:

JSP # 1:

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

JSP # 2

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

Как я уже сказал, добавляет бэкенд они передаются в ответ HTTP и отправляют их обратно в браузер в течение одного и того же запроса.

Когда я запустил эту страницу в своем браузере, я сразу могу сказать, что blah() не выполняется, когда foo() получает вызов. Я вижу ошибку консоли в Firebug, указывая blah() не определен. Мне интересно, только если blah() имеет область внутри своей собственной метки <script>, а также для foo(). Это дело здесь, или что-то еще не так?

Когда я иду посмотреть источник страницы, я вижу оба блока сценариев и обе функции. Это говорит мне, что все генерируется/отображается правильно на стороне сервера, но, возможно, мой подход по своей сути ошибочен (определение функций внутри разных тегов скриптов). Заранее спасибо.

+2

, когда или как вы называете Foo()? – Philipp

+0

foo() вызывается, когда пользователь наводит указатель мыши на элемент. Я могу проверить, что он вызван, заменив его содержимое оператором alert (""). – IAmYourFaja

ответ

5

все они глобальны. они могут видеть друг друга. проблема в том, когда они определяются и называют друг друга.

вы должны определить и назвать их в таком порядке:

  1. бар
  2. Foo
  3. вызов Foo
    • Foo выполняется и вызовы бар
    • бар выполнен
+0

Ну, foo() определяется внутри заголовка страницы, а bar() определяется внутри нижнего колонтитула. Поэтому foo() действительно появляется «выше» (номер строки мудрый) в результирующем HTML, чем bar(). Возможно ли, что, поскольку все они определены при загрузке страницы, что, поскольку foo() определяется первым, bar() еще не существует? В этом случае, как заставить bar() определить сначала (или еще лучше, что foo() не будет вызван до тех пор, пока bar() уже не будет определен во время загрузки страницы)?!? – IAmYourFaja

+0

Ahhh, это была проблема с заказом. Я поместил bar() в заголовок выше определения foo(), и все хорошо. Спасибо, Джозеф! – IAmYourFaja

0

Единственная вещь, которая определяет область видимости в JavaScript, - это функция, поэтому ваша проблема не является проблемой. Вы, скорее всего, не вызываете foo(), вы вызываете его до того, как будет определен blah(), или у вас есть синтаксическая ошибка где-то. Возможно, вы можете опубликовать всю свою HTML-страницу, чтобы мы могли видеть, что происходит.

+0

Я ценю ваш вход, но фактический HTML * огромный * и требует, чтобы этот не-SSCCE даже был * запрошенным *. Пожалуйста, см. Мои комментарии под ответом @ Джозефа, поскольку я думаю, что он на правильном пути. Еще раз спасибо за вашу помощь. – IAmYourFaja

+0

Я понимаю. Я также упомянул его ответ в одном из возможных решений в моем ответе. Приятно слышать, что вы его запускали – koenpeters

1

Вы можете вызвать функцию следующим образом:

(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(); 
    }); 
Смежные вопросы