8

我在一个网站中使用angular-ui-select,其中样式选择字段配置有一个名为ui-select. 这很好用,但是进行W3C 验证会导致此错误:

在此上下文中ui-select,不允许元素作为元素的子元素。div(抑制来自该子树的更多错误。)

这是一个示例代码:

<!doctype html>
<html lang="en">
<head><title>x</title></head>
<body>
 <div>
  <ui-select></ui-select>
 </div>
</body></html>

我知道<ui-select>预计不会出现这种情况,但我怎样才能更好地处理这个问题?

我可以将它包装到不同的标签中,还是有不同的方法来ui-select代替使用 HTML 标记?

4

3 回答 3

17

W3C HTML5 验证器维护者在这里。关于验证器行为的简短回答是,验证器会为您在文档中使用的任何自定义元素发出错误,目前作为用户,您无法解决它——而且它将继续还要再等一段时间,直到我们找到解决方案。

我们正在就如何解决这个问题进行一些持续的讨论。将验证器更改为忽略任何带有连字符的元素名称作为一个完整的解决方案是不可行的,因为这样做的结果是我们实际上无法检查它可能具有的任何子元素——我们只需要忽略整个子树,因为否则会导致其他错误。所以这远不是一个理想的解决方案。

无论如何,我很想找到解决这个问题的好方法,所以如果其他人有想法,我想听听他们的意见。发送想法/建议的两个好地方是 public-webapps@w3.org 邮件列表 https://lists.w3.org/Archives/Public/public-webapps/和 whatwg@whatwg.org 邮件列表https: //whatwg.org/mailing-list#specs

我自己想到的一个想法是,我们可以让验证器以与当前处理元素相同的方式处理所有自定义元素<div>(就文档中允许的位置以及允许包含的子元素而言)。这也不够理想,但至少它会提供一种方法来检查自定义元素的子树中的后代元素中的错误。


2017-02-06 更新:W3C HTML 检查器现在支持自定义元素

因此,我在 2016 年 12 月 16 日向W3C HTML 检查器(验证器)添加了对自定义元素的支持,并在几天后对其进行了改进,以对禁止的名称进行更详细的检查。

我最终想出在检查器架构中实现它的技巧(其核心是基于 RelaxNG 语法/模式的验证器)是添加一个预处理过滤器,该过滤器采用元素名称中带有连字符的任何元素,并将它们放在单独的 XML 命名空间中。

然后我更新了 RelaxNG 模式以允许来自该 XML 名称空间的任何元素。(具有讽刺意味的是,我非常讨厌 XML 命名空间以及它们引起的所有问题。)

所以我们现在正在考虑对自定义属性名称做类似的事情——可能只是将它们定义为包含连字符的任何属性名称(如自定义元素名称)。

但是,在 HTML 规范更新为允许之前,不能更改 HTML 检查器以允许自定义属性名称。为此,请参阅 HTML 规范问题跟踪器中正在讨论的提案

于 2015-02-25T04:17:39.973 回答
5

这确实是 AngularJS 的一个众所周知的问题。

你可以做几件事:

除了使用 element <ui-select>,您可以使用<div ui-select>,但这仍然会在参数上失败。

x-以or为前缀的参数data-将通过,但我不确定是否ui-select支持。

HTML W3C 验证很有用,但我认为对 HTML 电子邮件最为重要,因此它们不会被视为垃圾邮件。它对搜索引擎也有好处,但实际上并不那么重要。

如果您查看“为什么要验证”,原因主要是为了清洁、易于调试和整体良好实践。

Angular(不是?)幸运地扩展了 HTML5 的可能性领域,自然而然地偏离了最新的 HTML 规范。

于 2015-02-13T22:48:57.013 回答
0

我们在使用 Knockout 自定义组件时遇到了同样的问题。 http://knockoutjs.com/documentation/component-overview.html

我添加了一个建议,即使规范尚未最终确定(http://w3c.github.io/webcomponents/spec/custom/#custom-tag-示例):

https://github.com/validator/validator/issues/94

于 2015-09-08T09:09:39.397 回答