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

Con*_*ine 78 html xhtml unobtrusive-javascript

我知道这是有些人不同意它们的原因,但它真的重要吗?我认为他们提供的功能,与JavaScript交互以及从服务器存储和发送信息,都超过了验证问题.我错过了什么吗?"无效"HTML的后果是什么?并且自定义DTD不会解决它们吗?

Spl*_*iFF 76

结果是w3c在2年,5年,10年后出现并创建了一个具有相同名称的属性.现在您的页面已损坏.

HTML5将为合法的自定义属性(例如data-myattr ="foo")提供数据属性类型,因此您可以立即开始使用它,并且对未来的名称冲突相当安全.

最后,您可能会忽略自定义逻辑是类属性背后的理性.尽管通常将其视为样式属性,但实际上它是在元素上设置自定义元属性的合法方式.不幸的是,你基本上只限于布尔属性,这就是HTML5添加数据前缀的原因.

BTW,"基本上是布尔"我的意思是原则上.实际上,没有什么可以阻止您在类名中使用分隔符来定义自定义值和属性.

class="document docId.56 permissions.RW"

  • 可以通过为它们添加前缀来解决.更不用说真正的XHTML可以从命名空间中受益,但真正的XHTML无论如何都是罕见的. (4认同)
  • 我确实认为这是一个很好的反对意见,尽管在我最近的项目中我想到的很多例子都没有危险.("disbursementId"是否可能成为w3c属性?)尽管如此,知道为什么应该避免的事情也告诉你何时不必避免. (3认同)
  • 即使某些内容未成为W3C标准,它也可能用于专有浏览器扩展,浏览器插件扩展或您希望使用的第三方JavaScript.您可以减少发生碰撞的可能性,但首先不使用非标准属性可以完全避免碰撞. (3认同)
  • 专有的浏览器扩展还会使用数据命名约定吗? (2认同)

小智 22

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

例如:

<div id="testDiv" data-myData="just testing"></div>
Run Code Online (Sandbox Code Playgroud)

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

alert($('#testDiv').data('myData'))
Run Code Online (Sandbox Code Playgroud)

或者设置数据属性:

$('#testDiv').data('myData', 'new custom data')
Run Code Online (Sandbox Code Playgroud)

由于jQuery几乎适用于所有浏览器,因此您不应该遇到任何问题;)

更新

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

  • 感谢您提及jQuery.data() - 使其不仅酷而且优雅的解决方案! (2认同)

Alo*_*hci 10

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

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


Ion*_*tan 8

我看到人们痴迷于验证做得比使用简单的自定义属性更糟/更奇怪的东西:

<base href="http://example.com/" /><!--[if IE]></base><![endif]-->
Run Code Online (Sandbox Code Playgroud)

在我看来,自定义属性确实无关紧要.正如其他人所说,注意标准中未来添加的属性可能会很好.但是现在我们在HTML5中有data-*属性,所以我们已经保存了.

真正重要的是你有正确的嵌套标签和正确引用的属性值.

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

顺便说一句,我经常讽刺地发现所有那些验证狂热者如何在谷歌的聪明技巧面前鞠躬,如iframe上传.


Kir*_*tan 7

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

var customAttributes = { 'Id1': { 'custAttrib1': '', ... }, ... };
Run Code Online (Sandbox Code Playgroud)

至于分歧,请参阅SpliFF的回答.


小智 5

在class属性中存储多个值不是正确的代码封装,只是一种令人费解的黑客行事方式.以自定义广告旋转器为例,使用jquery.在页面上要做得更干净

<div class="left blue imagerotator" AdsImagesDir="images/ads/" startWithImage="0" endWithImage="10" rotatorTimerSeconds="3" />
Run Code Online (Sandbox Code Playgroud)

并让一些简单的jquery代码从这里完成工作.任何开发人员或网页设计师现在都可以处理广告轮播,并在没有太多问题时将值更改为此值.

一年后重新投入项目或进入一个新的项目,前一个开发人员分裂并前往太平洋某个地方的某个岛屿,当代码以不明确的加密方式编写时,他们会试图找出意图,如下所示:

<div class="left blue imagerotator dir:images-ads endwith:10 t:3 tf:yes"  />
Run Code Online (Sandbox Code Playgroud)

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

  • 你声称一个人比另一个人更容易混淆,除了你自己的意见之外什么都不支持.在任何一种情况下,您都需要在某处记录属性,以便下一个人应该能够使用任何一种格式.您故意将标识符更改为第二个示例中的模糊缩写只是为了表明您从未真正拥有过的标识符这一事实. (2认同)