代码之家  ›  专栏  ›  技术社区  ›  Pablo Cabrera

在JSP标记中使用JavaScript

  •  7
  • Pablo Cabrera  · 技术社区  · 16 年前

    我见过 this question 恢复与标记内容本身相关的JS文件的导入。我有一个类似的问题,这里我有一个JSP标记,它生成一些HTML,并有一个处理该HTML行为的通用JS实现。此外,我还需要编写一些初始化语句,以便以后通过JavaScript使用它。为了能够在我的javascript中使用这个“处理程序”,应该可以通过某种方式访问它。

    问题是…为了实例化和初始化的目的(我个人认为这不是很优雅),可以在HTML中编写内嵌的<script>标记吗?关于JS世界的可访问性,我是否应该让一个全局var引用我的处理程序对象(我认为不是很优雅),有更好的方法吗?

    4 回复  |  直到 14 年前
        1
  •  9
  •   Magnar    16 年前

    您应该在自己的文件中争取使用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(文章\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);
    

    在本例中,JSP文件中唯一的javascript是需要存在的部分。核心功能在其自己的JS文件中分离。

        2
  •  1
  •   pkaeding    16 年前

    我不完全确定你在这里问什么,但我没有什么错,包括 <script> JSP中用于实例化JavaScript代码的标记。我经常遵循这个模型,在外部JavaScript文件中编写库代码,然后从 <脚本& GT; 标签。

    这使得调试变得容易,因为逻辑都在外部文件中(而firebug似乎在调试内联javascript代码时遇到了问题)。库被缓存,但实例化它们的数据没有缓存(这是所需的行为)。

    另一种方法是在外部JavaScript文件或Ajax调用中动态生成实例化代码。我也这样做了,结果是积极的。

    我认为决定因素是你有多少动态数据。如果您需要表示大型数据结构,我将通过返回JSON的Ajax调用来提供它。如果是对构造函数的简单调用,请将其放入JSP中。

    至于全局变量,我通常会有一个用于顶级对象的全局变量,它可以启动一切。其中,是对辅助对象的所有其他引用。

        3
  •  0
  •   Giorgio    16 年前

    尽管我同意它并不完全优雅,但在将服务器端决策与Ajax集成环境结合在一起时,我已经做过几次了。为了初始化某些变量而回显内联脚本标记并不是什么可怕的事情,只要没有人看到它。

    至于更好的方法,我不知道这些。我很少这样做,所以我没有寻求更优雅或“合适”的解决方案。

        4
  •  0
  •   Dennis    16 年前

    可以用了 <script> 标签与HTML对齐。有时需要它,但就我不知道的更好的方法而言。如果不使事情看起来更复杂,使用 <脚本& GT; 标记,然后尝试找到实现JS文件的方法。