我正在做一个有javascript提供的一些交互的页面。举个例子:发送AJAX请求以获取文章内容的链接,然后在div中显示该数据。显然,在这个例子中,我需要每个链接存储一个额外的信息:文章的id。我处理它的方法是把这些信息放在href链接中:

<a class="article" href="#5">

然后使用jQuery找到a.article元素并附加适当的事件处理程序。(不要太纠结于可用性或语义,这只是一个例子)

不管怎样,这个方法是有效的,但是有点臭,而且根本不能扩展(如果click函数有多个参数会发生什么?如果其中一些参数是可选的呢?)

显而易见的答案是在元素上使用属性。我是说,这就是它们的作用,对吧?(种)。

<a articleid="5" href="link/for/non-js-users.html">

在我最近的问题中,我问这个方法是否有效,结果证明,如果不定义我自己的DTD(我没有),那么不,它是无效或不可靠的。一种常见的响应是将数据放入class属性中(尽管这可能是因为我选择的示例不佳),但对我来说,这种方法更有味道。是的,它在技术上是有效的,但它不是一个很好的解决方案。

我过去使用的另一种方法是实际生成一些JS,并将其插入到页面中的<script>标记中,创建一个与对象关联的结构。

var myData = {
    link0 : {
        articleId : 5,
        target : '#showMessage'
        // etc...
    },
    link1 : {
        articleId : 13
    }
};

<a href="..." id="link0">

但这是一个真正痛苦的屁股维护,通常只是非常混乱。

那么,要回答这个问题,如何为HTML标记存储任意信息?


当前回答

一个几乎适用于所有可能的浏览器的黑客是使用这样的开放类:< A class='data\_articleid\_5' href="link/for/non-js-users.html>;

对于纯粹主义者来说,这并不是那么优雅,但它得到了普遍支持,符合标准,并且非常容易操作。这似乎是最好的方法了。如果你序列化,修改,复制你的标签,或者做其他任何事情,数据将保持附加,复制等。

唯一的问题是您不能以这种方式存储不可序列化的对象,如果您在那里放置非常大的对象,可能会有限制。

第二种方法是使用伪属性,例如:< A articleid='5' href="link/for/non-js-users.html">

这更优雅,但不符合标准,而且我不能100%确定是否支持。许多浏览器完全支持它,我认为IE6支持JS访问,但不支持CSS选择器(在这里这并不重要),可能有些浏览器会完全混淆,你需要检查一下。

做一些有趣的事情,比如序列化和反序列化,会更加危险。

使用id到纯JS散列通常是可行的,除非你试图复制你的标记。如果你有tag <a href="…" id="link0">,通过标准的JS方法复制它,然后尝试修改附加到一个副本的数据,另一个副本也会被修改。

如果不复制标记或使用只读数据,这不是问题。如果你复制标签,它们被修改了,你需要手动处理。

其他回答

在html中,我们可以存储自定义属性,在属性名之前加上“data-”前缀

<p data-animal='dog'>这个动物是一只狗。 检查文档

我们可以使用这个属性使用jQuery动态设置和获取属性,例如: 如果我们有一个p标签

<p id='animal'>这个动物是一只狗

然后为上面的标签创建一个名为'breed'的属性,我们可以这样写:

$(" #动物”)。attr(“data-breed”、“哈巴狗”);

为了随时检索数据,我们可以这样写:

var breedtype = $('#animal').data('breed');

这是个好建议。感谢@Prestaul

如果你已经在使用jQuery,那么你应该利用“数据” 方法,该方法是在对象上存储任意数据的推荐方法 dom元素。

非常正确,但是如果您想在普通的HTML中存储任意数据呢?还有另一种选择……

<input type="hidden" name="whatever" value="foobar"/>

将数据放在隐藏输入元素的name和value属性中。如果服务器正在生成HTML(即PHP脚本或其他东西),而您的JavaScript代码稍后将使用此信息,那么这可能是有用的。

不可否认,它不是最干净的,但它是一种选择。它与所有设备都兼容 浏览器,是有效的XHTML。你不应该使用自定义属性,也不应该使用带有“data-”前缀的属性,因为它可能不适用于所有浏览器。此外,您的文档将无法通过W3C验证。

我发现元数据插件可以很好地解决使用html标记存储任意数据的问题,并且可以很容易地检索和使用jQuery。

重要提示:您包含的实际文件只有5 kb,而不是37 kb(这是完整下载包的大小)

下面是一个例子,它被用来存储值时,我使用生成谷歌分析跟踪事件(注:数据。标签和数据。值碰巧是可选参数)

$(function () {
    $.each($(".ga-event"), function (index, value) {
        $(value).click(function () {
            var data = $(value).metadata();
            if (data.label && data.value) {
                _gaq.push(['_trackEvent', data.category, data.action, data.label, data.value]);
            } else if (data.label) {
                _gaq.push(['_trackEvent', data.category, data.action, data.label]);
            } else {
                _gaq.push(['_trackEvent', data.category, data.action]);
            }
        });
    });
});

<input class="ga-event {category:'button', action:'click', label:'test', value:99}" type="button" value="Test"/>

另一种方法是将key:value对存储为一个简单的类,使用以下语法:

<div id="my_div" class="foo:'bar'">...</div>

这是有效的,可以很容易地用jQuery选择器或自定义函数检索。

使用jquery,

存储:$('#element_id')。数据(“extra_tag”、“extra_info”);

检索:$('#element_id').data('extra_tag');