我正在做一个有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标记存储任意信息?


当前回答

任意属性都是无效的,但在现代浏览器中是完全可靠的。如果您通过javascript设置属性,那么您也不必担心验证问题。

另一种方法是用javascript设置属性。jQuery有一个很好的实用工具方法,也可以使用自己的方法。

其他回答

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

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

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

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

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

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

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

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

任意属性都是无效的,但在现代浏览器中是完全可靠的。如果您通过javascript设置属性,那么您也不必担心验证问题。

另一种方法是用javascript设置属性。jQuery有一个很好的实用工具方法,也可以使用自己的方法。

你使用的是哪个版本的HTML ?

在HTML 5中,使用data-作为前缀的自定义属性是完全有效的。

<div data-internalid="1337"></div>

在XHTML中,这实际上是无效的。如果您使用的是XHTML 1.1模式,浏览器可能会报错,但在1.0模式下,大多数浏览器会默默地忽略它。

如果我是你,我会遵循基于脚本的方法。您可以让它在服务器端自动生成,这样维护起来就不那么麻烦了。

我的回答可能不适用于你的情况。我需要在HTML中存储一个2D表,并且我需要用最少的按键操作。下面是我的HTML数据:

<span hidden id="my-data">
    IMG,,LINK,,CAPTION
    mypic.jpg,,khangssite.com,,Khang Le
    funnypic.jpg,,samssite.com,,Smith, Sam
    sadpic.png,,joyssite.com,,Joy Jones
    sue.jpg,,suessite.com,,Sue Sneed
    dog.jpg,,dogssite.com,,Brown Dog
    cat.jpg,,catssite.com,,Black Cat
</span>

解释

It's hidden using hidden attribute. No CSS needed. This is processed by Javascript. I use two split statements, first on newline, then on double-comma delimiter. That puts the whole thing into a 2D array. I wanted to minimize typing. I didn't want to redundantly retype the fieldnames on every row (json/jso style), so i just put the fieldnames on the first row. That a visual key for the programmer, and also used by Javascript to know the fieldnames. I eliminated all braces, brackets, equals, parens, etc. End-of-line is record delimiter. I use double-commas as delimiters. I figured no one would normally use double-commas for anything, and they're easy to type. Beware, programmer must enter a space for any empty cells, to prevent unintended double-commas. The programmer can easily use a different delimiter if they prefer, as long as they update the Javascript. You can use single-commas if you're sure there will be no embedded commas within a cell. It's a span to ensure it takes up no room on the page.

下面是Javascript代码:

// pull 2D text-data into array
let sRawData = document.querySelector("#my-data").innerHTML.trim();

// get headers from first row of data and load to array. Trim and split.
const headersEnd = sRawData.indexOf("\n");
const headers = sRawData.slice(0, headersEnd).trim().split(",,");

// load remaining rows to array. Trim and split.
const aRows = sRawData.slice(headersEnd).trim().split("\n");

// trim and split columns
const data = aRows.map((element) => {
    return element.trim().split(",,");
});

解释:

JS使用大量的修饰来消除任何额外的空白。

只要您的实际工作是在服务器端完成的,那么为什么还要在输出中的html标记中使用自定义信息呢?在服务器上,你所需要知道的只是一个索引,不管它是什么类型的结构列表,都包含你的自定义信息。我觉得你把信息存错地方了。

我承认,不管多么不幸,在很多情况下,正确的解决方案并不是正确的解决方案。在这种情况下,我强烈建议生成一些javascript来保存额外的信息。

许多年后:

这个问题是在数据公布大约三年前提出的……随着html 5的出现,属性成为了一个有效的选项,所以事实已经发生了变化,我最初给出的答案不再相关。现在我建议改用数据属性。

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

<script>
    let anchors = document.getElementsByTagName('a');
    for (let anchor of anchors) {
        let articleId = anchor.dataset.articleId;
    }
</script>