使用fancyBox时出现HTML属性rel错误

15

我正在使用fancyBox创建一个相册,以下是我的代码:

<a class="fancybox" rel="group1" href="img/work/1.jpg"></a>
<a class="fancybox" rel="group1" href="img/work/2.jpg"></a>
<a class="fancybox" rel="group1" href="img/work/3.jpg"><img src="img/th/thumb.jpg" alt="Thumb" /></a>

但是我在验证代码时遇到了错误。它显示:

Bad value group1 for attribute rel on element a: Keyword group1 is not registered.

我该如何解决这个问题?我的代码写得不对吗?我想要一个缩略图,可以滚动查看3张照片。

谢谢。

6个回答

52

如果你想在一个有效的 HTML 文档中创建一个 fancybox 图库(因为我们都是纯粹主义者 ;),那么你需要两件事:

1:一个 HTML5 DOCTYPE

<!DOCTYPE html>

2:使用data-fancybox-group属性而不是像rel属性一样:

<a class="fancybox" data-fancybox-group="group1" href="img/work/1.jpg"></a>

这是验证过的!!...在这里查看示例。

注意:这适用于fancybox v2.x


5

我该如何解决这个问题?

你需要重写代码,不要使用无意义的术语“group1”来描述当前页面和图片之间的关系。

HTML5提供了data-*系列属性,用于仅添加供JS使用的数据。没有必要劫持rel属性,它具有定义好的含义。


1
那岂不是意味着要重写那个jQuery插件?是的,这样做是一个干净的解决方案,但有点不实际。(我不知道这个插件,但如果他们很好的话,他们已经支持“data-*”属性了。) - Tomalak
我不会重写这个插件。就让它保持原样吧。如果它能在你的浏览器中工作,那就很好了。验证确实很重要,但需要有一个度。如果你不知道自己在做什么,就不应该去打破规则,但一旦你了解了规则,我的意见是可以尝试去突破它们(只要你的页面正常运行即可)。 - Jeremy Miller
1
+1 是因为您提到了 HTML5 提供的 data-*,而 fancybox v2.x 包含了该选项(请参见我的下面的答案)。 - JFK

4

如果您仍在使用不支持data-fancybox-group的fancybox v 1.x版本,则可以轻松修改脚本。

您只需要查找并替换“rel”属性为其他内容,例如“data-fancybox-gallery”。

当搜索字符串“rel”时,您会找到4个元素。请小心仅更改最后3个,因为您找到的第一个“rel”是position:relative的一部分。

这是您需要更改的部分:

        var c = a(this).attr("rel") || "";
        if (!c || c == "" || c === "nofollow") {
            n.push(this)
        } else {
            n = a("a[rel=" + c + "], area[rel=" + c + "]");
            l = n.index(this)
        }

让它变得更好:

        var c = a(this).attr("data-fancybox-gallery") || "";
        if (!c || c == "" || c === "nofollow") {
            n.push(this)
        } else {
            n = a("a[data-fancybox-gallery=" + c + "], area[data-fancybox-gallery=" + c + "]");
            l = n.index(this)
        }

然后您的代码应该是:

    <a class="fancybox" data-fancybox-gallery="group1" href="img/work/1.jpg"></a>
    <a class="fancybox" data-fancybox-gallery="group1" href="img/work/2.jpg"></a>
    <a class="fancybox" data-fancybox-gallery="group1" href="img/work/3.jpg"><img src="img/th/thumb.jpg" alt="Thumb" /></a>

3
你之所以会收到验证错误,是因为rel属性有一个值列表,它期望得到这些值(参见http://www.w3schools.com/html5/att_a_rel.asp)。
你无法修复此问题,Fancybox正在使用该属性来实现其目的,而该属性并非旨在用于此目的。这并没有什么问题,网页不必完全“有效”。

你可以采取行动 - 参见被接受的答案:https://dev59.com/dGox5IYBdhLWcg3wr2To#9037826 - lorem monkey

1
这个问题怎么解决?
你不需要解决。验证器接受rel属性的值范围是有限制的。
很明显,Fancybox在使用该属性时,验证器不喜欢,所以它会发出错误提示;但这并不影响你使用。
我写错了代码吗?
没有,你写得很正确。

@Quentin:哦,我明白了。你可以说忽略它而不会危及无辜小猫的生命。;) 但我知道这不是有效的HTML,有更好的方法来解决这个特定的问题(但插件作者可能没有想到这些方法)。 - Tomalak
你是在遇到错误而无法使用fancybox吗?还是这只是一个验证程序给你的错误信息? - Jeremy Miller
@Jeremy 我怀疑是后者。 - Tomalak
@JeremyMiller fancyBox运行正常。我只是想让我的代码得到验证。非常棒的讨论。非常感谢。/cc Tomalak - kaoscify
是的,我绝对认为这是一件非常好的事情,但有时候是不可避免的。它仍然可以完美地运行,而且很有可能没有人会知道! - Jeremy Miller

0

rel属性指定当前文档与链接文档之间的关系。该属性有一组有限的可能值,列在此处:http://www.w3schools.com/tags/att_link_rel.asp。使用非标准值将导致验证警告,只能通过将rel属性更改为标准值或完全删除来进行更正。

我不太确定您为什么要在那里使用该属性,但是有几个替代方案可以正确验证:

  • 如果您正在尝试针对每个项目存储信息,并且您的网站使用HTML5 doctype,则可以使用data-*属性。示例用法:data-group="1"。然后,您可以通过javascript访问数据集,在此处查看:http://slides.html5rocks.com/#custom-data
  • 如果您要通过css选择器访问项目,则可以将"group1"作为第二个类添加到项目中。
  • 如果您要通过JavaScript访问项目,并且您没有使用XHTML doctype,则可以考虑将其名称属性设置为"group1",然后使用getElementsByName('group1')函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接