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

我知道这是有些人不赞成的原因,但这真的很重要吗? 我认为,他们提供的与JavaScript交互以及从服务器存储信息和向服务器发送信息的能力超过了validation问题。 我错过了什么吗? 什么是“无效的”HTML的后果? 而不是一个自定义的DTD解决它们呢?

分支是w3c在2,5,10年来,并创造一个同名的属性。 现在你的页面被打破了。

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

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

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

class="document docId.56 permissions.RW"

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

例如:

 <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。 最好保持小写一路。

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

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

我已经看到人们痴迷于使用一个简单的自定义属性做更糟糕/奇怪的事情validation:

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

在我看来,自定义属性真的没有关系。 换句话说,注意将来在标准中添加属性可能会很好。 但是现在我们在HTML5中有数据属性,所以我们被保存了。

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

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

顺便说一句,我经常讽刺地发现,所有这些validation狂热者如何在Google的聪明窍门(比如iframe上传)前屈服。

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

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

至于后果,请参阅SpliFF的答案 。

在类属性中存储多个值不是正确的代码封装,只是一个错综复杂的黑客办事方式。 以一个自定义的广告轮播为例,使用jQuery。 它在页面上要干净得多

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

并让一些简单的jQuery代码从这里做工作。 任何开发人员或网页devise师现在都可以在广告轮播上工作,并在不需要太多问题的情况下将值更改。

回到一年后的项目,或者进入一个新开发项目,前一位开发人员拆分并去了太平洋的一个岛屿,可能会试图找出代码是用这样一个不明确的encryption方式编写代码的意图:

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

当我们用c#和其他语言编写代码时,我们不写代码把所有的自定义属性放在一个属性中作为空格分隔的string,最后每次我们需要访问或写入时都必须parsing这个string。 想想下一个可以处理你的代码的人。

validation的事情是,今天可能没关系,但是你不知道明天会不会很重要(根据墨菲定律,明天会有影响的)。

select一个面向未来的替代品是更好的select。 如果他们不存在( 他们在这个特定的情况下 ),那么要走的路是创造一个未来的certificateselect。

使用自定义属性可能是无害的,但是,为什么select一个可能有害的解决scheme,只是因为你认为(你永远不能确定),这将不会造成伤害? 如果未来的certificatescheme过于昂贵或笨拙,可能值得进一步讨论,但事实并非如此。

旧的讨论,但不过; 在我看来,因为html是一种标记而不是一种编程语言,所以应该总是以宽大的方式解释标记“错误”。 浏览器完全可以这样做。 我不认为这将会改变。 因此,唯一重要的实际标准是你的html将被大多数浏览器正确显示,并且将在几年后继续这样做。 那个时候之后,你的html将被重新devise。

只要将我的原料添加到组合中,当您需要创build可以/可以使用自动化工具后处理的内容时,validation也很重要。 如果您的内容有效,您可以更轻松地将标记从一种格式转换为另一种格式。 例如,使用特定模式对XML进行有效的XHTMLparsing数据时,您可以更轻松地进行parsing,并且可以根据可预测的格式进行validation。

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

那么这取决于你的客户/老板/等等。他们是否需要validationXHTML?

有人说有很多解决方法 – 根据sceneraio,他们可以很好地工作。 这包括添加类,利用rel属性,甚至有人甚至写了自己的parsing器从HTML注释中提取JSON。

HTML5提供了一个标准的方法来做到这一点,用“data-”作为自定义属性的前缀。 我build议现在就这样做,因为您有可能使用标准XHTML中使用的属性。

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

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

也许页面呈现怪癖模式,也许页面在一些不起眼的手机浏览器上根本不渲染,也许浏览器会泄漏内存,也许病毒杀手会呛你的网页等等等等。

我知道,按照标准虔诚可能看起来像势利。 但是,一旦你因为没有遵循而遇到问题,你就会停止这样的思考。 然而,那么大多已经太晚了,你需要用一个不同的框架从头开始你的应用程序…

我认为开发人员的确认只是为了validation,但有一点可以说是因为它保持了标记的清洁。 但是,因为每个(夸大警告!)浏览器都显示不同的东西,所以没有标准。 我们试图遵循标准,因为它使我们觉得至less有一些方向。 有人认为,保持代码标准将防止未来的问题和冲突。 我的观点:无论如何,无论如何,没有人能够正确完整地实现标准,不妨假设你所有的代码最终都会失败。 如果它起作用,就可以使用它,除非它杂乱无章,或者你只是试图忽略标准来坚持W3C或什么的。 我认为重要的是要记住,标准执行速度非常缓慢,5年来networking已经发生了很大变化。 我相信任何人在需要解决潜在冲突时都会有多年的时间。 没有理由去规划今后的标准兼容性,甚至不能依靠今天的标准。

哦,我几乎忘了,如果你的代码不validation10只小猫会死。 你是小猫杀手吗?

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

validation

您不应该需要自定义属性来提供validation。 更好的方法是根据实际的任务添加validation。

通过使用类来指定意义。 我有类名:

  • date (date)
  • zip (邮政编码)
  • area (面积)
  • ssn (社会安全号码)

示例标记:

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

示例javascript(使用jQuery):

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

如果您需要针对特定​​情况的特殊validation器,则只需为您的特例创build新类(或使用select器 )即可:

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

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

(这种方法在jQueryvalidation和mvc .net框架以及其他可能的框架下都是无缝的)

奖励:您可以分配多个以空格分隔的课程class =“ssn custom-one custom-two”

从服务器发送信息“

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

(确保你没有传递任何敏感数据和隐藏的input,因为用户几乎可以毫不费力地修改它们)