如何在JavaScript或jQuery中标准化HTML?


84

标签可以具有多个属性。属性在代码中出现的顺序无关紧要。例如:

<a href="#" title="#">
<a title="#" href="#">

如何在Javascript中“标准化” HTML,因此属性的顺序始终相同?我不在乎选择哪个顺序,只要顺序始终相同即可。

更新:我的最初目标是使比较(在JavaScript中)2个HTML页面(略有差异)更加容易。因为用户可以使用不同的软件来编辑代码,所以属性的顺序可能会更改。这使得差异太冗长。

答案:好的,首先感谢您的回答。是的,这是可能的。这是我设法做到的方式。这是一个概念证明,可以肯定地对其进行优化:

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);
    }
  }
});

diff的第二个元素也是一样$('#different')。现在$('#original').html()$('#different').html()以相同的顺序显示具有属性的HTML代码。


59
这有什么需要?
rahul

40
@rahul:实际上确实有一个非常有趣的需求:它可以极大地改善页面的gzip压缩。
haylem 2010年

11
啊,用Javascript ...压缩就这么多。不知道那是什么需要。
haylem 2010年

13
@Julien:到您的JavaScript代码运行时,页面已经发送到客户端了。我看不到它如何对压缩有帮助。
卡萨布兰卡2010年

22
实际上,尝试执行OP所要求的用途是有效的。使用WYSIWYG编辑器来驱动Wiki。我正在处理的项目正是这样做的,并且每次您编辑Wiki时,编辑器都会颠倒属性的顺序,从而导致不必要的差异。为了避免差异,我在保存之前在提交的HTML中按字母顺序对属性进行了排序。在提交之前,可以使用javascript轻松完成这种排序。
Frank Farmer

Answers:


68

JavaScript实际上看不到基于文本的HTML形式的网页,而是看到一种称为DOM或文档对象模型的树结构。未定义DOM中HTML元素属性的顺序(实际上,作为Svend注释,它们甚至不是DOM的一部分),因此在JavaScript运行时对它们进行排序的想法无关紧要。

我只能猜测您要达到的目标。如果您要尝试这样做以提高JavaScript /页面性能,则大多数HTML文档渲染器可能已经在优化属性访问上付出了很大的努力,因此在这里几乎没有收获。

如果您要对属性进行排序,以使其在通过网络发送时更有效地进行页面的gzip压缩,请了解JavaScript在该时间点之后运行。取而代之的是,您可能希望查看运行在服务器端的内容,尽管这可能比其价值更大。


8
JavaScript可以在服务器端运行。
马特·坎托

属性不被视为文档树的一部分(文档树自然使用顺序)。因此,虽然Attr继承了Node接口,但DOM Core 2将这些字段的w3.org/TR/DOM-Level-2-Core/core.html#ID-637646024
Svend

35

使用HTML并将其解析为DOM结构。然后采用DOM结构,并将其写回到HTML。在编写时,请使用任何稳定的排序对属性进行排序。您的HTML现在将根据属性进行规范化。

这是规范事物的一般方法。(解析非规范化数据,然后以规范化形式写回)。

我不确定为什么要标准化HTML,但是在那里。数据就是数据。;-)


1
你有一个代码示例。我试图做类似的事情,但是没有用。
朱利安

12

这是一个概念证明,可以肯定地对其进行优化:

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代码。


我认为如果您以XML生成html内容,然后使用xslt呈现它,则更好。您一定会得到更好的输出。
Nasaralla 2011年

8

您可以尝试在Firebug中打开HTML标签,属性始终按相同顺序


4
单靠它并没有真正的帮助。那是因为它正在从DOM重新创建HTML,但是这种情况发生时具有特定的属性迭代顺序(或Firebug对其进行手动排序)。Julien可以利用此优势,并使用相同的方法来编写HTML。
马特·坎托

5

实际上,我可以想到一些很好的理由。一种可能是身份匹配和与“ diff”类型工具一起使用的比较,这在语义上等效的行可以被标记为“不同”是很烦人的。

真正的问题是“为什么要使用Javascript”?

“我有问题,我想我有一个答案……但是我的问题也有一个问题”使这个问题“闻起来”。

如果OP可以解释为什么要这样做,那么他们获得良好答案的机会就会大大增加。


2

问题“这需要什么?” 答:它使代码更具可读性且更易于理解。

为什么大多数UI很烂...许多程序员无法理解简化用户工作的需求。在这种情况下,用户的工作就是阅读和理解代码。排序属性的原因之一是必须调试和维护代码的人员。该程序变得熟悉的有序列表使他的工作更加轻松。他可以更快地找到属性,或了解缺少哪些属性,并更快地更改属性值。


有种方法使您对这个问题的思考时间不够长;即使是可行的解决方案也无法解决您在这里所说的内容,尽管可能是正确的。
issa marie tseng,2010年

您为什么认为OP希望使用Javascript来做到这一点?有可能考虑到服务器端(构建时间?)Javascript解决方案,但是不太可能有人有足够的经验来做到这一点,而在Stackoverflow帖子中却没有提到它。OP可能正在实现浏览器内HTML编辑器,但这似乎令人怀疑。
尖尖的

0

这仅在某人正在阅读源代码时才重要,因此对我而言,它首先是语义属性,其次是语义属性...

当然,也有例外,例如,如果您有连续的<li>,所有的都在一个属性上,而另一个仅在某些属性上,则可能要确保共享的属性全部在开头,然后是各个属性,例如。

<li a =“ x”> A </ li>
<li a =“ y” b =“ t”> B </ li>
<li a =“ z”> C </ li>

(即使“ b”属性在语义上比“ a”更有用)

你明白了。


0

我认为,实际上有可能,如果html内容作为xml传递并通过xslt呈现...因此,XML的原始内容可以按照您想要的任何顺序排列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.