我正在尝试在网页上的某些JavaScript中添加jQuery帖子。整个页面由几个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
之前添加“ \ ”会给出完全相同的错误,但是该列是一个额外的,因为在行的开头添加了字符。
答案 0 :(得分:14)
你可以用#[[ ... ]]#
包装你的javascript,告诉Velocity不要解析所附的块(Velocity 1.7中的新内容)
#[[
<script>
...
</script>
]]#
答案 1 :(得分:9)
好的,似乎有两种解决方案:
首先,使用jQuery我们可以避免使用全局别名$而是直接使用jQuery对象:
jQuery.post(url, myJSONObject, function(result){
~~~snip~~~
就我而言,上述作品很棒。但我怀疑在其他情况下(非jQuery)这可能是不可能的。在这种情况下,我们可以在有效的Velocity参考中“隐藏”我们的角色,如下所示:
#set( $D = '$' )
${D}
来源:http://velocity.apache.org/engine/devel/user-guide.html#escapinginvalidvtlreferences
我仍然想知道为什么反斜杠逃脱不起作用,但上面至少会让我再次移动。 :)
答案 2 :(得分:2)
我认为这是版本1.6.x中的 bug ,因为它在1.7中工作正常(如果没有,请告诉我,我测试了很多次..),根据参考,$
仅在a-zA-Z
后面生效。我想尝试调试真正发生的事情,但是翻译代码是由Java CC工具生成的,很难识别逻辑......
答案 3 :(得分:0)
你必须用你的javascript代码创建一个js文件 并将您的js文件导入您的虚拟代码
答案 4 :(得分:-1)
我无法让它与任何其他修复程序一起使用,例如在速度中逃避“$”。我通过使用jQuery加载外部js文件而不是直接以速度编写jQuery来实现它。至少为我工作,希望它可以帮助某人:)
/的Björn