Script elements
A ScriptViewElement
writes a <script>
tag to the output.
This can reference either an external script or hold a body of any type of script.
Nesting <script>
tags is not supported by browsers.
Because of this a ScriptViewElement
will defer nested ScriptViewElements
to write sequentially instead.
This makes it a handy tool for building client-side HTML templates using ViewElements
.
See the examples for a detailed explanation.
Element and builder
The ViewElement
implementation is ScriptViewElement
and has an equivalent ScriptViewElementBuilder
.
A builder can be created using BootstrapUiBuilders.script()
factory methods.
Examples
Including an external script
Suppose the following builder configuration for including an external script:
BootstrapUiBuilders.script( "application/javascript" )
.source( "http://myscript" )
.async( true )
.defer( true )
.charset( "utf-8" )
.build()
This would render the following markup:
<script type="application/javascript" src="http://myscript" async="async" defer="defer" charset="utf-8"><script>
Including a HTML template
As a ScriptViewElement
is a regular NodeViewElement
, you can easily build a HTML template by adding child elements.
BootstrapUiBuilders.script( MediaType.TEXT_HTML )
.add(
BootstrapUiBuilders.paragraph()
.add( BootstrapUiBuilders.text( "hello" ) )
)
.build()
This would render the following markup:
<script type="text/html">
<p>hello</p>
</script>
Nested script elements
Things get a bit more complicated when you start nesting ScriptViewElements
.
Suppose you have the following configuration:
import static BootstrapUiBuilders.*;
script( MediaType.TEXT_HTML )
.add(
paragraph().add( BootstrapUiBuilders.text( "hello" ) )
)
.add(
script( MediaType.TEXT_HTML )
.add( paragraph().add( BootstrapUiBuilders.text( "nested hello" ) ) )
)
.add(
paragraph().add( BootstrapUiBuilders.text( "goodbye" ) )
)
.build()
Because nesting of <script>
tags is not supported by browsers, the nested scripts will be written sequentially instead.
In the original location a different element will be written with a reference to the actual <script>
element.
<script type="text/html">
<p>hello</p>
<i data-bum-ref-id="[UNIQUE_ID]" style="display: none; visibility: hidden;"></i>
<p>goodbye</p>
</script>
<script type="text/html" id="[UNIQUE_ID]">
<p>nested hello</p>
</script>
The actual <script>
element output gets a unique HTML id assigned.
The replacement element holds a data
attribute with the same id value for easy retrieval.
Using the data-bum-ref-id
attribute client scripts can access the original element output.
Nesting ScriptViewElements only works well when using them for HTML (or other HTML-like) templates.
|
Client-side processing
It is up to client scripts to traverse the replacement element to the actual script element written. The BootstrapUiModule javascript provides a utility function which can do this transparently using JQuery.
The following snippet would return the JQuery elements with the target nodes:
BootstrapUiModule.refTarget( $( '[data-bum-ref-id]' ) )
.each( function( node ) {
// do something with the html template
} );