【问题标题】:Velocity - How to avoid ParseErrorException when using jQuery?Velocity - 使用 jQuery 时如何避免 ParseErrorException?
【发布时间】:2011-10-13 06:55:52
【问题描述】:

我正在尝试将 jQuery 帖子添加到网页上的某些 JavaScript。整个页面由几个 Velocity 模板组成。一切都很好,直到我尝试添加 jQuery 帖子,现在我得到:

org.apache.velocity.exception.ParseErrorException: Encountered "," at line 282, column 24 of /WEB-INF/velocity/www/comments.vm
Was expecting one of:
    "(" ...
    <RPAREN> ...
    <ESCAPE_DIRECTIVE> ...
~~~snip~~~

第 282 行是 $.post(...,第 24 列似乎是第一个“,”字符。最初我在这一行上有 JSON,但我将它向上移动(到 var myJSONObject ... 行),因为我认为错误与无效 JSON 相关(行开头的选项卡给出了误导性的列号)。

var myJSONObject = {"body": "", "action": "postcomment", "submitted": "true", "ajax": "true"};
myJSONObject.body = $("body").val();
$.post("$!{articleurl}", myJSONObject, function(result){            
    btn.textContent='Comment sent successfully.';  
});

小更新

我更改了以下几行:

var url = "$articleurl";

$.post(url, myJSONObject, function(result){
~~~snip~~~

解析异常仍然关注第一个“,”。我假设问题是 Velocity 认为它应该能够解析 $.post - 事实上,它是 jQuery。我在其他 Velocity VM 模板中使用 jQuery 没有任何问题。有没有办法让 Velocity 在解析时忽略某些行/语句?


更新 2

我发现 this link 关于在 Velocity 中转义引用,但它不能解决我的问题。在$.post 之前添加“\”会给我带来完全相同的错误,但是由于在行首添加了字符,所以该列是额外的。

【问题讨论】:

    标签: java javascript jquery json velocity


    【解决方案1】:

    您可以使用 #[[ ... ]]# 包装您的 javascript,它告诉 Velocity 不解析封闭的块(Velocity 1.7 中的新功能)

    #[[ 
    <script>
        ...
    </script>
    ]]#
    

    【讨论】:

    • 另一个缺点是你会注意到我在脚本中使用了一些 Velocity 变量。
    • @Mikaveli 我通常在上面的单独脚本块中启动所有来自velocity的js变量。
    • 这听起来像是更好的方法,我将进行一些重构以提高可读性/可维护性。 :D
    • @Mikaveli 你也可以只写jQuery 而不是$
    • 非常感谢您提供这个有用的答案。你让我很开心。
    【解决方案2】:

    好的,似乎有两种解决方案:

    首先,使用 jQuery,我们可以避免使用全局别名 $,而是直接使用 jQuery 对象:

    jQuery.post(url, myJSONObject, function(result){
    ~~~snip~~~
    

    就我而言,上述方法效果很好。但我怀疑在其他情况下(非 jQuery)这可能是不可能的。在这种情况下,我们可以将我们的角色“隐藏”在一个有效的 Velocity 引用中,如下所示:

    #set( $D = '$' )
    ${D}
    

    来源:http://velocity.apache.org/engine/devel/user-guide.html#escapinginvalidvtlreferences

    我仍然想知道为什么反斜杠转义不起作用,但以上内容至少会让我再次动起来。 :)

    【讨论】:

    • 反斜杠用于转义实际引用,而不是导致解析错误的东西。将反斜杠视为仅在解析后应用的东西。
    【解决方案3】:

    我认为这是 1.6.x 版本中的一个错误,因为它在 1.7 中可以正常工作(如果没有,请告诉我,我测试了很多次..),根据参考,$ 只有在其后跟a-zA-Z 时才会生效。我想试试debug到底发生了什么,但是翻译代码是Java CC工具生成的,逻辑太难辨认了……

    【讨论】:

      【解决方案4】:

      您必须使用您的 javascript 代码创建一个 js 文件 并将您的 js 文件导入到您的 vm 代码中

      【讨论】:

        【解决方案5】:

        不幸的是,我无法让它与任何其他修复一起使用,例如以速度转义“$”。我通过使用 jQuery 加载外部 js 文件而不是直接以速度编写 jQuery 来使其工作。至少对我有用,希望它可以帮助某人:)

        /比约恩

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-02
          • 2016-03-24
          • 2012-07-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多