那么,如果自定义 HTML 属性不是有效的 XHTML,该怎么办?

So what if custom HTML attributes aren't valid XHTML?

提问人:Constantine 提问时间:6/15/2009 更新时间:10/9/2012 访问量:19005

问:

我知道这是有些人不赞成他们的原因,但这真的重要吗?我认为,它们在与 JavaScript 交互以及从服务器存储和发送信息方面提供的功能超过了验证问题。我错过了什么吗?“无效”HTML 的后果是什么?无论如何,自定义 DTD 难道不能解决这些问题吗?

HTML 不显眼的 javascript xhtml

评论

21赞 Paolo Bergantino 6/15/2009
我真的希望这么多程序员不要沉迷于验证。这是其中一种情况,我的第一个想法恰恰是“那又怎样?不幸的是,大多数人认为这是亵渎神明......
1赞 Constantine 6/15/2009
我同意你的看法,但我想听听反驳。
4赞 Dan F 6/15/2009
几乎是 stackoverflow.com/questions/992115/custom-attributes-yay-or-nay 的复制品
10赞 alex 6/15/2009
我想知道我验证...它让我感到温暖和模糊
5赞 Paolo Bergantino 6/15/2009
验证很好。为了验证而将项目的最大利益置于危险之中是另一回事。正确的结束标签,正确的语法,这些都是我可以支持的东西。因为解决方案没有验证而丢弃它是另一回事。互联网上排名前 1000 的网站中只有 2 个进行验证是有原因的。我更喜欢把事情做好。

答:

76赞 SpliFF 6/15/2009 #1

结果是 w3c 在 2 年、5 年、10 年后出现,并创建一个同名的属性。现在你的页面坏了。

HTML5 将为合法的自定义属性(如 data-myattr=“foo”)提供数据属性类型,因此也许您现在可以开始使用它,并且可以合理地避免将来的名称冲突。

最后,你可能会忽略自定义逻辑是类属性背后的理性。虽然它通常被认为是一种样式属性,但它实际上是一种在元素上设置自定义元属性的合法方式。不幸的是,你基本上被限制在布尔属性上,这就是HTML5添加数据前缀的原因。

顺便说一句,我所说的“基本上是布尔值”是指原则上的。实际上,没有什么可以阻止您在类名中使用分隔符来定义自定义值和属性。

class="document docId.56 permissions.RW"

评论

5赞 Ionuț G. Stan 6/15/2009
可以通过为它们添加前缀来解决。更不用说真正的XHTML可以从命名空间中受益,但真正的XHTML无论如何都是罕见的。
3赞 Constantine 6/15/2009
我确实认为这是一个很好的反对意见,尽管在我最近的项目中想到的许多例子中,它并不危险。(“disbursementId”有可能成为 w3c 属性吗?尽管如此,知道为什么应该避免某些事情也会告诉你什么时候不必避免。
3赞 Quentin 6/16/2009
即使某些东西没有成为 W3C 标准,它也可能被用于专有浏览器扩展、浏览器插件扩展或您希望使用的第三方 JavaScript。您可以减少发生冲突的几率,但首先不使用非标准属性可以完全避免冲突。
2赞 Smithy 2/3/2013
专有浏览器扩展也会使用数据命名约定,这难道不是合理的吗?
1赞 Joel Peltonen 11/10/2014
正如其他开发人员对点分隔符的评论 - 它可能会破坏类选择器: ->考虑定位或.class="thingType.image".thingType.image{}$('.thingType.image')
7赞 Kirtan 6/15/2009 #2

您可以使用 JSON 将 HTML 元素与属性相关联,而不是使用自定义属性:

var customAttributes = { 'Id1': { 'custAttrib1': '', ... }, ... };

至于后果,请参阅SpliFF的回答

评论

0赞 belugabob 6/15/2009
简洁明了的解决方案 - 只是元素和属性没有存储在一起这一事实令人失望。
0赞 Ionuț G. Stan 6/15/2009
我不确定这是否比仅将数据存储为 DOM 元素对象 (object.attribute = “value”) 的 (JavaScript) 属性更好。我知道 Safari 有执行此操作的建议。
0赞 Kirtan 6/15/2009
@Ionut,这也是可以做到的;但随后我们必须创建 DOM 对象并将它们存储在内存中。
1赞 alex 6/15/2009 #3

好吧,这取决于您的客户/老板/等。他们是否要求它验证 XHTML?

有人说有很多解决方法 - 根据场景的不同,它们可以很好地工作。这包括添加类、利用该属性,以及甚至编写自己的解析器以从 HTML 注释中提取 JSON 的人。rel

HTML5 提供了一种标准方法,在自定义属性前面加上“data-”。无论如何,我建议现在这样做,因为您有可能使用将在标准 XHTML 中使用的属性。

0赞 Graham Clark 6/15/2009 #4

使用非标准 HTML 可能会使浏览器以“怪癖模式”呈现页面,在这种情况下,页面的其他部分可能会呈现不同,而其他内容(如定位)可能会略有不同。不过,使用自定义 DTD 可能会解决此问题。

评论

2赞 Ionuț G. Stan 6/15/2009
自定义 DTD 通常比具有自定义属性更糟糕。除了验证警告之外,没有解决任何其他问题,因为浏览器会忽略文档类型。
0赞 Paolo Bergantino 6/15/2009
您能否举例说明,如果您有一个有效的 DOCTYPE,它将被自定义属性抛入 Quirks 模式?这听起来不太可能......
0赞 Alan Plum 6/15/2009
AFAIK:只要有<,大多数浏览器都应该没问题!DOCTYPE html>,这就是为什么 HTML 5 只建议使用它(即没有 PUBLIC 标识符或 SYSTEM 路径)。无论如何,浏览器都不会读取 DTD,因为浏览器不会进行验证。一般来说,如果遇到自定义元素,它们甚至不应该中断(这就是 HTML 5 元素工作的原因)。
0赞 Radek 8/24/2011
浏览器在尝试呈现页面时,无论如何都会尝试不同的 DTD
0赞 Thomas Hansen 6/15/2009 #5

因为它们不是标准的,所以你不知道现在和将来会发生什么。正如其他人所说,W3C 将来可能会开始使用这些相同的名称。但更危险的是,你不知道“浏览器xxx”的开发者在遇到他们的时候做了什么。

也许页面以怪癖模式呈现,也许页面在一些不起眼的移动浏览器上根本没有呈现,也许浏览器会泄漏内存,也许病毒杀手会窒息你的页面,等等,等等。

我知道虔诚地遵循标准可能看起来很势利。然而,一旦你因为不遵循它们而遇到问题,你往往会停止这样想。但是,这为时已晚,您需要使用不同的框架从头开始应用程序......

评论

1赞 Paolo Bergantino 6/15/2009
这听起来更像是散布恐惧,而不是任何避免自定义属性的正当理由。页面完全没有呈现,因为自定义属性?真?泄漏内存?真?
2赞 Chuck 6/15/2009
你知道“未定义的行为”是什么意思吗,保罗?如果你已经编写了一段时间的C语言,你就会对它产生一种非常健康、非常合理的恐惧。大多数浏览器都戴着儿童手套对待大多数页面,但查看所有被 IE 7/8 “破坏”的页面,看看依赖非标准行为的策略会导致什么。
2赞 Thomas Hansen 6/15/2009
...@Paolo......这不是其中一种情况,这更像是你错了而查克是对的...... ;)
8赞 Ionuț G. Stan 6/15/2009 #6

我见过痴迷于验证的人做比使用简单的自定义属性更糟糕/奇怪的事情:

<base href="http://example.com/" /><!--[if IE]></base><![endif]-->

在我看来,自定义属性真的无关紧要。正如其他人所说,注意未来在标准中添加的属性可能是件好事。但是现在我们在 HTML5 中有了 data-* 属性,所以我们被保存了。

真正重要的是,你有正确的嵌套标签,以及正确引用的属性值。

我什至使用自定义标签名称(HTML5 引入的那些,如页眉、页脚等),但这些在 IE 中存在问题。

顺便说一句,我经常讽刺地发现,所有这些验证狂热者都在谷歌的聪明伎俩面前低头,比如 iframe 上传。

2赞 Vinko Vrsalovic 6/15/2009 #7

验证的问题是,今天它可能无关紧要,但你无法知道明天它是否重要(而且,根据墨菲定律,明天会很重要)。

最好选择一个面向未来的替代方案。如果它们不存在(在这种特殊情况下确实存在),那么要走的路就是发明一个面向未来的替代方案。

使用自定义属性可能是无害的,但是,为什么要仅仅因为您认为(您永远无法确定)它不会造成伤害而选择可能有害的解决方案呢?如果面向未来的替代方案过于昂贵或笨拙,可能值得进一步讨论这一点,但事实肯定不是这样。

评论

0赞 Paolo Bergantino 6/15/2009
您建议在链接到的问题中使用哪一个?得票最高的答案不会验证为 XHTML
1赞 Vinko Vrsalovic 6/15/2009
得票最高的答案不是恒定的,所以我不知道你指的是什么。无论如何,我错过了问题中的XHTML标签。
0赞 Vinko Vrsalovic 6/15/2009
此外,注释方法似乎足以证明未来,就像使用 JavaScript 而不是自定义属性来存储数据一样。我也喜欢 HTML5 方法,押注于未来的标准。
0赞 teh_noob 6/15/2009 #8

我认为开发人员验证只是为了验证,但有话要说,因为它保持了标记的清洁。然而,由于每个(夸张警告!)浏览器以不同的方式显示所有内容,因此实际上没有标准。我们努力遵循标准,因为这让我们觉得我们至少有一些方向。有些人认为,保持代码标准将防止将来出现问题和冲突。我的观点是:无论如何,今天没有人正确和完全地实现标准,还不如假设你所有的代码最终都会失败。如果它有效,它就可以使用它,除非它很乱,或者你只是想忽略标准将其粘在 W3C 或其他东西上。我认为重要的是要记住,标准的实施非常缓慢,网络在 5 年内发生了如此大的变化。我敢肯定,当任何人需要解决潜在的冲突时,都会有多年的通知。当你甚至不能依赖今天的标准时,没有理由计划将来的标准兼容性。

哦,我差点忘了,如果你的代码没有验证,10只小猫就会死。你是小猫杀手吗?

10赞 Alohci 6/15/2009 #9

验证本身并不是目的,而是一种工具,用于帮助及早发现错误,并减少网页在多种浏览器类型上使用时可能面临的神秘渲染和行为问题的数量。

添加自定义属性现在不会影响这些问题中的任何一个,将来也不太可能影响,但由于它们不进行验证,这意味着当您评估页面验证的输出时,您需要仔细选择重要的验证问题和不重要的验证问题。每次更改页面并重新验证时,都必须重复此操作。如果你的页面完全验证,那么你会得到一个很好的绿色PASS消息,你可以进入下一阶段的测试,或者进行下一个需要进行的更改。

0赞 abhishek 9/14/2010 #10

如果标记无效,Jquery .html(标记)不起作用。

评论

0赞 Matt Browne 3/15/2014
更准确地说,如果浏览器无法解析它,它就不起作用。即使自定义属性是“无效的”,所有浏览器都可以解析它们,因此 .html( 可以正常工作。
5赞 Randall Tomes 10/19/2010 #11

在 class 属性中存储多个值不是正确的代码封装,而只是一种复杂的黑客做事方式。以使用 jquery 的自定义广告轮播器为例。在页面上做起来要干净得多

<div class="left blue imagerotator" AdsImagesDir="images/ads/" startWithImage="0" endWithImage="10" rotatorTimerSeconds="3" />

让一些简单的jQuery代码从这里开始工作。 现在,任何开发人员或网页设计师都可以在广告轮播器上工作,并在询问时毫不费力地将值更改为此值。

一年后回到项目,或者进入一个新的项目,当代码以不明确的加密方式编写时,以前的开发人员分裂并去了太平洋某处的某个岛屿,这可能是地狱般的试图弄清楚意图:

<div class="left blue imagerotator dir:images-ads endwith:10 t:3 tf:yes"  />

当我们用 c# 和其他语言编写代码时,我们不会编写代码,将所有自定义属性作为空格分隔的字符串放在一个属性中,最终每次需要访问或写入该字符串时都必须解析该字符串。想想下一个将处理你的代码的人。

评论

2赞 SpliFF 3/3/2014
你声称一个比另一个更令人困惑,除了你自己的意见之外,没有任何支持。无论哪种情况,您都需要在某处记录属性,以便下一个人应该能够使用任何一种格式。在第二个示例中,您故意将标识符更改为模糊的缩写,只是为了说明一个观点,这一事实表明您从一开始就从未真正拥有过标识符。
2赞 Laurens 1/6/2011 #12

旧的讨论,但仍然;在我看来,由于 HTML 是一种标记而不是一种编程语言,因此对于标记“错误”,它应该始终以宽容的方式解释。浏览器完全能够做到这一点。我认为这不会也不会改变。因此,唯一重要的实际标准是,大多数浏览器都能正确显示您的 html,并且会在几年内继续显示。在那之后,你的html可能会被重新设计。

0赞 Jonas Stensved 8/9/2011 #13

验证

您不需要自定义属性来提供验证。更好的方法是根据字段实际任务添加验证。

使用类分配含义。我有这样的类名:

  • date(日期)
  • zip(邮政编码)
  • area(区域)
  • ssn(社会安全号码)

标记示例:

<input class="date" name="date" value="2011-08-09" />

示例 javascript(使用 jQuery):

$('.date').validate(); // use your custom function/framework etc here.

如果你需要为某个场景提供特殊的验证器,你只需为你的 特例:

检查两个密码是否匹配的示例:

<input id="password" />
<input id="password-confirm" />

if($('#password').val() != $('#password-confirm').val())
{
 // do something if the passwords don't match
}

(这种方法与jQuery验证和mvc .net框架以及可能的其他框架非常无缝)

奖励:您可以分配多个类,用空格 class=“ssn custom-one custom-two” 分隔

“从服务器向服务器发送信息”

如果需要传回数据,请使用 .它们开箱即用。<input type="hidden" />

(确保您不会传递任何带有隐藏输入的敏感数据,因为用户几乎可以毫不费力地修改它们)

22赞 DrParanoia 8/24/2011 #14

是的,您可以使用“数据”合法地添加自定义属性。

例如:

<div id="testDiv" data-myData="just testing"></div>

之后,只需使用最新版本的jquery来执行以下操作:

alert($('#testDiv').data('myData'))

或设置数据属性:

$('#testDiv').data('myData', 'new custom data')

由于jQuery几乎可以在所有浏览器上运行,因此您应该不会有任何问题;)

更新

  • 就 javascript 引擎而言,data-myData 在某些浏览器中可能会转换为 data-mydata。最好一直保持小写。

评论

2赞 Victor Farazdagi 3/13/2012
感谢您提到 jQuery.data() - 使它不仅很酷,而且是优雅的解决方案!
0赞 Matt Browne 3/15/2014
注意:根据标准,连字符分隔的数据属性在 Javascript 中转换为 camelCase。因此,您可以使用 data-my-data,它在 Javascript 中将是 myData。
2赞 Joel Peltonen 10/9/2012 #15

只是为了将我的成分添加到混合物中,当您需要创建可以使用/可以使用自动化工具进行后处理的内容时,验证也很重要。如果您的内容有效,您可以更轻松地将标记从一种格式转换为另一种格式。例如,在解析您知道并可以验证以遵循可预测格式的数据时,使用特定架构对 XML 执行有效的 XHTML 要容易得多。

例如,我需要我的内容是有效的 XHTML,因为很多时候它被转换为各种作业的 XML,然后转换回来,而不会丢失数据或意外的渲染结果。