由于没有延迟选项:
<asset:javascript src="custom_view_script.js"/>
在资源插件之外还可以使用哪些其他方法将视图特定脚本放在关闭正文标记之前,而不在布局中全局声明它?
我知道:
<asset:deferredScripts/>
但只处理页面脚本而不包括。
答案 0 :(得分:0)
最简单的方法是使用网站网格。
在你的布局中你需要放
<g:pageProperty name="page.script"/>
在身体的尽头。
然后在页面中你会做这样的事情:
<content tag="script">
<script type="application/javascript">
... your code here ...
</script>
</content>
请注意,内容标记(脚本)是您指定的任何文本,但是要引用“pageme”之前的sitemesh中的内容。它。
但是,要小心,因为sitemesh属性不是累积的,我的意思是,如果你把两个带有content tag =“script”的部分只使用最后一个。
如果您需要,就像我通常那样,您可以使用稍微修改SitemesTagLib的自定义TagL来完成它:
class MyContentTagLib implements RequestConstants {
static namespace = "mycontent"
Closure addContent = { Map attrs, body ->
if( body != null ) {
def htmlPage = getPage()
if( htmlPage instanceof GSPSitemeshPage && attrs.tag ) {
def name = attrs.tag
def sitemeshPage = (GSPSitemeshPage) htmlPage
StreamCharBuffer currentContent = sitemeshPage.getContentBuffer( "page.$name" ) as StreamCharBuffer
StreamCharBuffer newContent = wrapContentInBuffer( body )
if( currentContent ) {
newContent.writeTo( currentContent.writer )
newContent = currentContent
}
sitemeshPage.setContentBuffer( name, newContent )
}
}
}
private AbstractHTMLPage getPage() {
return (AbstractHTMLPage)getRequest().getAttribute(PAGE)
}
private StreamCharBuffer wrapContentInBuffer(Object content) {
if (content instanceof Closure) {
content = content()
}
if (!(content instanceof StreamCharBuffer)) {
// the body closure might be a string constant, so wrap it in a StreamCharBuffer in that case
FastStringWriter stringWriter=new FastStringWriter()
stringWriter.print((Object)content)
StreamCharBuffer newbuffer = stringWriter.buffer
newbuffer.setPreferSubChunkWhenWritingToOtherBuffer(true)
return newbuffer
} else {
return (StreamCharBuffer)content
}
}
}
现在您可以在布局中保留g:pageProperty,但是您可以在页面中执行此操作:
<mycontent:addContent tag="script">
<script type="application/javascript">
... your code here ...
</script>
</mycontent:addContent>
这应该收集您放在不同视图和模板中的所有内容,然后在您的g:pageProperty标记所在的最终html中显示。