2008-10-23 2 views
7

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

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

ответ

9

Вы должны стремиться к javascript в своих файлах. Обычно это делается с Progressive Enhancement. Но иногда у вас нет выбора, например, когда один и тот же 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-файле.

0

Несмотря на то, что я не согласен с тем, что он не совсем изящный, мне известно несколько раз при объединении решений на стороне сервера с интегрированной средой AJAX. Echoing inline < скрипт > теги, чтобы инициализировать некоторые переменные, не страшная вещь, пока никто ее не видит.

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

1

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

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

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

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

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

0

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