前向兼容性
正如评论中提到的,创建这样的元素是不安全的。例如,假设输入元素不存在,但后来创建。
<input>Some Content</input>
浏览器将其重写为(为清楚起见,XHTML):
<input />Some Content
搜索引擎优化和可访问性
HTML5 页面提供了描述内容的元素。这有助于搜索引擎了解您的页面。如果他们不理解您的页面,可能会降低您的排名。
如果您坚持使用这些标签,并且将它们用于不止一个文本块,您应该给它们角色和aria-tags。这有助于搜索引擎和需要屏幕阅读器或其他可访问性服务的人。
风格化
在您以编程方式创建元素之前,某些浏览器不会让 CSS 样式生效。html5shiv 使用相同的技术让旧浏览器支持新的 HTML5 元素。
document.createElement("arial"); // don't need to do anything with it
浏览器替代:数据-*
您可以使用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(客户端)编写的演示,但与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)
这可以在构建脚本中使用,也可以作为非常简单的服务器端模板。这样,浏览器和搜索引擎就永远不会看到我们组成的元素。如果您需要这些虚拟元素,我推荐此解决方案。