如果需要在js里动态的加载一些html代码,一般会选择下面这样的方式
str="<div class="dialog"><div class="title"><img src="close.gif" alt="点击可以关闭" />亲爱的提示条</div><div class="content"><img src="delete.jpg" alt="" /><span>您真的要GG吗?</span></div><div class="bottom"><input id="Button2" type="button" value="确定" class="btn"/> <input id="Button3" type="button" value="取消" class="btn"/></div></div>"
但是感觉这样太丑了,可读性和可维护性都很差。有什么更加优雅和简洁的方式吗?
把你想要的结构写在HTML里,用一个display:none的标签来包裹,一般而言,会使用:
script
标签textarea
标签如
或
使用这些标签,是为了避免这些不被直接使用的标签一被浏览器读取到就被渲染。而且这样做的话,里面的img的src也不会被浏览器自动获取。
如果你使用script标签,就可以如下代码得到它:
使用时textarea时要注意,textarea无法嵌套自身;script标签也无法自嵌套。
但如果文档结构是固定的,里面的数据需要动态填充呢?请参考面向数据编程。
P.S. 对于innerHTML和value的使用可能会造成XSS。
动态添加HTML代码,前端若由模板导出,在JS里面写结构,或者在HTML里面写结构,这个结构对于黑客来说都是白盒的,白盒攻击相对简单,黑客可以通过阅读代码来看到哪一些代码可以被利用。比如$用户签名$,发现这里的用户签名是用户可控制的数据之后,黑客可以构造一个
<img src="javascript:window.open()">
之类的用户签名,未经过滤<>的话,就可以做到XSS。因此,在面向数据编程里讲到的方案中,通过json进行动态匹配替换时,一定要保证后端输出的数据JSON里,
<
、>
等语义敏感的字符正确转义。