Mar*_*arc 17 html javascript css xhtml cdata
我想在不转义特殊字符的情况下将脚本或CSS内联到XHTML中.
我可以使用CDATA标记的部分来做到这一点.
根据http://www.w3.org/TR/xhtml1/#h-4.8,CDATA部分可以定义为:
<script type="text/javascript">
<![CDATA[
... unescaped script content ...
]]>
</script>
Run Code Online (Sandbox Code Playgroud)
然后,根据http://www.w3schools.com/TAGS/tag_script.asp,CDATA可以看起来像:
<script type="text/javascript"><![CDATA[
// some code
//]]></script>
Run Code Online (Sandbox Code Playgroud)
关闭CDATA部分的哪种方法更好?]]>还是//]]>?
bob*_*nce 33
根据www.w3.org/TR/xhtml1/#h-4.8,CDATA部分可以定义为:[no //]
是啊.在XHTML中,他们可以.正确的XHTML,由XML解析器读取,就像您服务application/xhtml+xml于非IE的Web浏览器一样.
但是,您实际上可能正在服务text/html,这意味着您的浏览器不是该部分中引用的"XML处理器".它是遗留的HTML4解析器,因此您必须遵守附录C准则并避免使用HTML4中不起作用的任何XML功能.
特别是,字符串<![CDATA[和]]>一个<script>或一个<style>块对HTML4解析器并不特殊,因为在HTML4中,这两个元素是'CDATA元素',其中标记不适用(除了</ETAGO序列以结束元素本身).因此,HTML4解析器会将这些字符串直接发送到CSS或JavaScript引擎.
因为<![CDATA[JS无效,所以会出现JavaScript语法错误.(其他答案在这里是错误的:它不仅仅是非常古老的浏览器,而是所有HTML4浏览器,它们会在脚本中为未注释的CDATA部分提供错误.)
您可以使用//或/*注释标记来隐藏JavaScript或CSS引擎中的内容.所以:
<script type="text/javascript">//<![CDATA[
alert('a&b');
//]]></script>
Run Code Online (Sandbox Code Playgroud)
(注意领先//; W3Schools示例代码中省略了这一点,并使该示例代码完全不起作用.失败.不要相信W3Schools:它们与W3C无关,它们的材料通常都是垃圾.)
这由HTML解析器读取为:
script建立CDATA内容直到下一个ETAGO//<![CDATA[\n alert('a&b');\n//]]>script//<![CDATA[\nalert('a&b');\n//]]>但是通过XML解析器:
script(没有特殊的解析含义)//]]>序列\n alert('a&b');\n//script//\nalert('a&b');\n//虽然解析过程完全不同,但JS引擎在每种情况下都会得到相同的有效代码,这要归功于//s,唯一的区别在于注释.
请注意,这是一个与老派截然不同的案例:
<script type="text/javascript"><!--
alert('a&b');
//--></script>
Run Code Online (Sandbox Code Playgroud)
这是为了隐藏脚本/样式内容,以便它不会在不理解<script>和<style>标记的浏览器中写入页面.这不会产生JavaScript/CSS错误,因为hack被置于不同的级别:它是CSS和JavaScript语言本身的语法特征,<!--被定义为什么都不做,允许这个hack工作.
那些浏览器是古老的历史; 你今天绝对不应该使用这种技术.特别是在XHTML中,因为XML解析器会引起你的注意,将整个脚本块转换为XML注释而不是可执行代码.
我想在不转义特殊字符的情况下将脚本或CSS内联到xHTML中.
避免这样做,你会更快乐.
你真的需要<和中的&角色<style>吗?不,几乎从不.你真的需要他们<script>吗?嗯...有时,是的,在这种情况下,评论的CDATA部分是可以接受的.
但说实话,XHTML兼容性指南C.4与HTML4一样适用于XHTML1:任何非平凡的东西都应该是外部脚本,然后您不必担心这一点.
| 归档时间: |
|
| 查看次数: |
13440 次 |
| 最近记录: |