【发布时间】:2011-04-27 20:19:11
【问题描述】:
标签可以有多个属性。属性在代码中出现的顺序无关紧要。例如:
<a href="#" title="#">
<a title="#" href="#">
如何在 Javascript 中“规范化”HTML,以便属性的顺序始终相同?我不在乎选择哪个顺序,只要它总是相同的。
更新:我最初的目标是更容易区分(在 JavaScript 中)有细微差别的 2 个 HTML 页面。因为用户可以使用不同的软件来编辑代码,所以属性的顺序可能会改变。这使得 diff 过于冗长。
ANSWER:好的,首先感谢您的所有回答。是的,这是可能的。这是我设法做到的。这是一个概念证明,当然可以优化:
function sort_attributes(a, b) {
if( a.name == b.name) {
return 0;
}
return (a.name < b.name) ? -1 : 1;
}
$("#original").find('*').each(function() {
if (this.attributes.length > 1) {
var attributes = this.attributes;
var list = [];
for(var i =0; i < attributes.length; i++) {
list.push(attributes[i]);
}
list.sort(sort_attributes);
for(var i = 0; i < list.length; i++) {
this.removeAttribute(list[i].name, list[i].value);
}
for(var i = 0; i < list.length; i++) {
this.setAttribute(list[i].name, list[i].value);
}
}
});
差异的第二个元素$('#different') 也是如此。现在$('#original').html() 和$('#different').html() 以相同的顺序显示具有属性的HTML 代码。
【问题讨论】:
-
这个有什么需要?
-
@rahul:实际上有一个非常有趣的需求:它可以极大地提高页面的 gzip 压缩率。
-
啊,在 Javascript 中……压缩太多了。不知道那时需要什么。
-
@Julien:当你的 JavaScript 代码运行时,页面已经发送到客户端。我看不出它对压缩有什么帮助。
-
尝试执行 OP 要求的操作实际上是有效的。使用 WYSIWYG 编辑器驱动 wiki。我正在处理的项目正是这样做的,每次您编辑 wiki 时,编辑器都会颠倒属性的顺序,从而导致不必要的差异。我在保存之前在后端提交的 HTML 中按字母顺序对属性进行排序以避免差异;在提交之前可以很容易地在 javascript 中完成这种排序。
标签: javascript jquery html html-parsing