在Grails <g:link>标签中使用jQuery遇编译错误,求正确语法
解决GSP中嵌入jQuery生成动态链接的编译错误问题
兄弟,你这个错误的根源其实是混淆了服务器端代码和客户端代码的执行时机,咱们一步步理清楚:
首先,<g:link>是Grails的服务器端标签,它会在服务器渲染页面的时候就编译成HTML的<a>标签。而$('#authorID').val()是客户端浏览器才会执行的jQuery代码,服务器在编译页面的时候根本不知道这个值是什么——而且服务器会把代码里的$当成Groovy的变量引用符号,所以才会报「美元符号后的字符串字符非法」的错误。
那正确的做法应该是分开处理服务器端和客户端的逻辑,直接用JS构造链接,而不是在服务器端标签里硬塞客户端代码,给你两种可行的方案:
方案一:用Grails生成基础URL,客户端拼接完整链接
先在GSP里用<g:createLink>生成author控制器show动作的基础URL,然后让JS去拼接动态的id值:
<!-- 先在GSP里生成服务器端的基础链接 --> <g:set var="authorShowBaseUrl" value="${createLink(controller: 'author', action: 'show')}" /> <script> // 客户端JS代码 var authorId = $('#authorID').val(); var authorName = $('#authorField').val(); // 拼接完整链接(根据你的URL映射规则选一种,REST风格用/,传统风格用?id=) var fullLink = "${authorShowBaseUrl}/${authorId}"; // 或者 var fullLink = "${authorShowBaseUrl}?id=" + authorId; // 构造HTML元素并追加 ul.append('<li><a href="' + fullLink + '">' + authorName + '</a></li>'); </script>
方案二:转义美元符号(仅适用于纯JS场景,不推荐你的案例)
如果只是想让Grails不解析JS里的$,可以给$加转义符\,但注意这个方法解决不了「服务器无法获取客户端JS值」的本质问题——因为<g:link>在服务器编译时还是拿不到$('#authorID').val()的实际值,生成的链接会是无效的。不过还是给你列出来:
// 转义$符号,避免Grails把它当成Groovy表达式 ul.append('<li><g:link action="show" controller="author" id="'+ \$('#authorID').val()+'">'+ \$('#authorField').val()+'</g:link></li>');
强烈推荐方案一,因为它从根本上解决了服务器端和客户端代码执行时机冲突的问题,生成的链接也是有效的。
内容的提问来源于stack exchange,提问作者BZer0
相关产品推荐
相关产品推荐

