前向兼容性
正如 cmets 中所述,创建这样的元素是不安全的。例如,假设输入元素不存在,但后来创建。
<input>Some Content</input>
浏览器将其重写为(为清楚起见,XHTML):
<input />Some Content
SEO 和可访问性
HTML5 页面提供了描述内容的元素。这有助于搜索引擎了解您的页面。如果他们不理解您的页面,可能会降低您的排名。
如果您坚持使用这些标签,并且将它们用于不止一个文本块,您应该给它们roles 和aria-tags。这有助于搜索引擎和需要屏幕阅读器或其他无障碍服务的人。
样式性
在您以编程方式创建元素之前,某些浏览器不会让 CSS 样式生效。 html5shiv 使用相同的技术让旧浏览器支持新的 HTML5 元素。
document.createElement("arial"); // don't need to do anything with it
替代浏览器:data-*
您可以使用data-something 属性来标记元素以进行替换。例如:
<span data-large>Large Text</span>
然后,您可以使用重写器将它们替换为不同的 HTML。本示例使用 jQuery 和一种极其简单的模板语言。
rewrites = {
large: '<span style="font-size: 2em">{}</span>'
};
function rewrite(r) {
for (rule in r) {
// build a selector in the form of [data-something]
var selector = "[data-{}]".replace("{}", rule)
$(selector).each(function (i, el) {
// get our inner html and inject it into our template
var inner = $(this).html();
var templated = r[rule].replace("{}", inner);
// replace the element with our new HTML
$(this).replaceWith(templated);
});
}
}
rewrite(rewrites);
服务器端/构建
您可以使用您喜欢的任何标签编写代码,但在它到达您的浏览器之前在服务器上对其进行转换。这是一个用 jQuery(客户端)编写的 demo,但与 Cheerio(nodejs)兼容。
rewrites = {
large: '<span style="font-size: 2em">{}</span>'
};
function rewrite($, r) {
for (rule in r) {
$(rule).each(function (i, el) {
var inner = $(this).html();
var templated = r[rule].replace("{}", inner);
$(this).replaceWith(templated);
});
}
}
rewrite($, rules)
这既可以作为构建脚本,也可以作为一个非常简单的服务器端模板。这样,浏览器和搜索引擎就永远不会看到我们组成的元素。如果您需要这些虚拟元素,我推荐此解决方案。