【问题标题】:Using JavaScript within a JSP tag在 JSP 标记中使用 JavaScript
【发布时间】:2010-09-18 18:53:30
【问题描述】:
我已经看到this question 重新导入与标签内容本身相关的 js 文件。我有一个类似的问题,这里我有一个生成一些 HTML 的 jsp 标记,并有一个通用的 js 实现来处理这个 HTML 的行为。此外,我需要编写一些初始化语句,以便之后通过 JavaScript 使用它。为了能够在我的 JavaScript 中使用这个“处理程序”,它应该可以通过某种方式访问。
问题是...可以将内联
【问题讨论】:
标签:
javascript
jsp
jsp-tags
【解决方案1】:
虽然我同意它并不完全优雅,但在将服务器端决策与 AJAX 集成环境相结合时,我曾多次这样做过。回显内联
至于更好的方法,我不知道这些。我很少这样做,以至于我没有寻求更优雅或“适当”的解决方案。
【解决方案2】:
我不完全确定您在这里问什么,但我认为在 JSP 中包含 <script> 标记以实例化 javascript 代码没有任何问题。我经常遵循这个模型,在外部 javascript 文件中编写库代码,然后从 <script> 标签调用我的对象的构造函数。
这使得调试变得容易,因为逻辑都在外部文件中(而且 firebug 似乎在调试内联 javascript 代码时遇到了麻烦)。库被缓存,但实例化它们的数据没有(这是期望的行为)。
另一种方法是在外部 javascript 文件或 AJAX 调用中动态生成实例化代码。我也这样做了,取得了积极的结果。
我认为决定因素是您拥有多少动态数据。如果您需要表示大型数据结构,我会通过返回 JSON 的 AJAX 调用来提供它。如果是对构造函数的简单调用,请将其放入 JSP 中。
至于全局变量,我通常会为顶级对象设置一个全局变量,它会启动一切。在其中,是对辅助对象的所有其他引用。
【解决方案3】:
可以在 HTML 中使用<script> 标签。有时需要它,但至于任何更好的方法我不知道。在不让事情看起来更复杂的情况下,使用<script> 标签然后尝试找到实现js文件的方法会更容易。
【解决方案4】:
您应该在自己的文件中使用 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);
在此示例中,JSP 文件中唯一的 javascript 是需要存在的部分。核心功能在其自己的 js 文件中分离。