Использование JavaScript в теге JSP - PullRequest
7 голосов
/ 23 октября 2008

Я видел этот вопрос , касающийся импорта js-файлов, связанных с самим содержимым тега. У меня похожая проблема, здесь у меня есть тег jsp, который генерирует некоторый HTML и имеет общую реализацию js, которая обрабатывает поведение этого HTML. Кроме того, мне нужно написать некоторые операторы инициализации, чтобы потом можно было использовать их через JavaScript. Чтобы можно было использовать этот «обработчик» в моем JavaScript, он должен быть как-то доступен.

Вопрос в том ... Можно ли писать встроенные теги вместе с моим HTML для целей создания и инициализации (лично я не думаю, что это очень элегантно)? И что касается доступности для мира JS, должен ли я оставить глобальную переменную, ссылающуюся на мой объект-обработчик (я думаю, не очень элегантно), есть ли лучшие способы сделать это?

Ответы [ 4 ]

9 голосов
/ 23 октября 2008

Вы должны стремиться к JavaScript в своих собственных файлах. Обычно это делается с помощью Progressive Enhancement . Но иногда у вас нет выбора, например, когда один и тот же JSP отображает страницы на разных языках. Вот реальный пример:

JSP:

  <script src="/javascript/article_admin.js"></script>  
  <script type="text/javascript">  
      NP_ArticleAdmin.initialize({  
            text: {  
              please_confirm_deletion_of: '<i18n:output text="please.confirm.deletion.of"/>',  
              this_cannot_be_undone: '<i18n:output text="this.cannot.be.undone"/>'  
            }  
      });  
  </script>  

JavaScript (article_admin.js):

 /*global NP_ArticleAdmin, jQuery, confirm */  
 NP_ArticleAdmin = function ($) {  
     var text;  

     function delete_article(event) {  
         var article = $(this).parents("li.article"),  
         id = article.attr("id"),  
         name = article.find("h3.name").html();  
         if (confirm(text.please_confirm_deletion_of + name + text.this_cannot_be_undone)) {  
             $.post("/admin/delete_article", {id: id});  
             article.fadeOut();  
         }  
         event.preventDefault();  
         return false;  
     }  

     function initialize(data) {  
         text = data.text;  
         $("#articles a.delete").click(delete_article);  
     }  

     return {initialize: initialize};  
 }(jQuery);

В этом примере единственным javascript в JSP-файле является часть, которая должна быть там. Основные функциональные возможности разделены в своем собственном js-файле.

1 голос
/ 23 октября 2008

Я не совсем уверен, что вы спрашиваете здесь, но я не ошибаюсь, если включу теги <script> в JSP для создания кода javascript. Я часто следую этой модели, пишу код библиотеки во внешних файлах javascript, а затем вызываю конструкторы для моих объектов из тегов <script>.

Это облегчает отладку, поскольку вся логика находится во внешних файлах (и у firebug, похоже, возникают проблемы с отладкой встроенного кода javascript). Библиотеки кэшируются, а данные, создающие их экземпляры, - нет (что является желаемым поведением).

Альтернативой является динамическое создание кода создания экземпляра во внешнем файле JavaScript или при вызове AJAX. Я тоже это сделал с положительными результатами.

Я думаю, решающим фактором является количество динамических данных. Если вам нужно представить большие структуры данных, я бы обслужил это с помощью вызова AJAX, который возвращает JSON. Если это простой вызов конструктора, поместите его в JSP.

Что касается глобальной переменной, у меня часто будет глобальная переменная для объекта верхнего уровня, которая начинает все с нуля. Внутри этого находятся все другие ссылки на вспомогательные объекты.

0 голосов
/ 23 октября 2008

Все в порядке с использованием <script> тегов в соответствии с HTML. Бывают времена, когда это необходимо, но о каких-либо лучших путях я не знаю. Не делая вещи более сложными, проще использовать тег <script>, чем пытаться найти способ реализовать файлы js.

0 голосов
/ 23 октября 2008

Хотя я согласен с тем, что это не совсем элегантно, я уже неоднократно делал это, комбинируя решения на стороне сервера с интегрированной средой AJAX. Выводить встроенные теги для инициализации некоторых переменных не так уж и страшно, пока никто этого не видит.

Что касается лучших методов, я не знаю об этом. Я делал это так редко, что не искал более элегантного или «правильного» решения.

...