Here's a quicky I just put together for a client to generate IE conditional comments. This isn't a feature supported by Tapestry's JavaScriptSupport (for libraries; it is support for CSS files).
Fortunately, this is something that comes together in Tapestry in almost no code:
package com.fivoosh.components; | |
import org.apache.tapestry5.BindingConstants; | |
import org.apache.tapestry5.MarkupWriter; | |
import org.apache.tapestry5.annotations.Parameter; | |
/** | |
* A component that wraps its body in an IE conditional comment. | |
*/ | |
public class ConditionalComment { | |
@Parameter(required = true, allowNull = false, defaultPrefix = BindingConstants.LITERAL) | |
String condition; | |
void beginRender(MarkupWriter writer) { | |
writer.writeRaw(String.format("<!--[if %s]>", condition)); | |
} | |
void afterRender(MarkupWriter writer) { | |
writer.writeRaw("<![endif]-->"); | |
} | |
} |
This is what it looks like in a template:
<t:conditionalcomment condition="lte IE 9"> | |
<t:remove> | |
Fix IE8+9 lack of support for html5 elements and media queries | |
</t:remove> | |
<script src="${context:js/html5shiv.js}" type="text/javascript"/> | |
<script src="${context:js/respond.js}" type="text/javascript"/> | |
<script src="${context:js/media.match.js}" type="text/javascript"/> | |
</t:conditionalcomment> |
And here's the markup it produces:
<!--[if lte IE 9]> | |
<script type="text/javascript" src="/assets/ctx/z79f6b0bd/js/html5shiv.js"></script> | |
<script type="text/javascript" src="/assets/ctx/zf8f53e99/js/respond.js"></script> | |
<script type="text/javascript" src="/assets/ctx/z8aa0bee8/js/media.match.js"></script> | |
<![endif]--> |
And that's the whole point ... the URLs for the referenced JavaScript libraries are now Tapestry assets, and will have access to Tapestry's asset pipeline as unique resources, including GZip compression and minimization.
It is always important to me that Tapestry not get in the way: frameworks that lock you down and prevent you from accomplishing your goals should not be used. Tapestry has a long history, and there are certainly many areas that could have been implemented differently, or simply not implemented at all, but it's nice that most edge cases, like this one, have a simple solution.
Hello,
ReplyDeleteI have a problem with your conditionnal comment...
It comments also all my javascript !
Hello,
ReplyDeleteI am trying to do the same but with the html tag. Enclosing html tags within multiple conditional comments.
This is the html conditional comment css trick:
https://github.com/h5bp/html5-boilerplate/blob/v4/index.html
It helps you have css classes set to the html tag that helps you identify which browser is accessing the page.
eg:
I am just trying to figure out where I have to hook in the services to transform the html tag into this conditional comment soup :)
Any advice ?
Best regards,
Numa
Hi,
ReplyDeleteSorry for my previous comment, I found a solution :) I was looking for a complex solution and did not even tried the obvious one....
I just tried pasting the html header with conditional comments as is in the tapestry Layout component. And tadadam!!! It works straight out of the box.
I just hope that when I go to production it doesn't strip these comments :)
Numa