How to store arbitrary data for some HTML tags
我正在制作一个由javascript提供一些交互的页面。仅作为示例:发送AJAX请求以获取文章内容然后在div中显示该数据的链接。显然在这个例子中,我需要每个链接来存储额外的信息:文章的ID。我一直在处理它的方式是将这些信息放在href链接中:
1 |
然后我使用jQuery来查找a.article元素并附加相应的事件处理程序。 (不要太在意这里的可用性或语义,这只是一个例子)
无论如何,这种方法有效,但它有点味道,根本不可扩展(如果click函数有多个参数会发生什么?如果其中一些参数是可选的,会怎样?)
显而易见的答案是在元素上使用属性。我的意思是,这就是他们的目的,对吗? (的种类)。
1 |
在我最近的一个问题中,我问这个方法是否有效,结果是没有定义我自己的DTD(我没有),那么不,它是无效的或可靠的。一个常见的反应是将数据放入
我过去使用的另一种方法是实际生成一些JS并将其插入到
1 2 3 4 5 6 7 8 9 10 | var myData = { link0 : { articleId : 5, target : '#showMessage' // etc... }, link1 : { articleId : 13 } }; |
但这可能是维持对接的真正痛苦,而且通常只是非常混乱。
那么,为了解决这个问题,你如何为HTML标签存储任意信息?
您使用的是哪个版本的HTML?
在HTML 5中,具有以数据为前缀的自定义属性是完全有效的,例如,
1 |
在XHTML中,这不是真正有效的。如果您处于XHTML 1.1模式,浏览器可能会抱怨它,但在1.0模式下,大多数浏览器都会默默地忽略它。
如果我是你,我会遵循基于脚本的方法。你可以在服务器端自动生成它,这样就不会让后面的人感到痛苦。
如果您已经在使用jQuery,那么您应该利用"data"方法,这是使用jQuery在dom元素上存储任意数据的推荐方法。
存储东西:
1 | $('#myElId').data('nameYourData', { foo: 'bar' }); |
要检索数据:
1 | var myData = $('#myElId').data('nameYourData'); |
这就是它的全部内容,但请查看jQuery文档以获取更多信息/示例。
换句话说,我个人不会使用它,但它可以工作(确保你的JSON有效,因为eval()是危险的)。
1 2 3 4 5 6 7 | <span style="display: none;">{"id": 1,"title":"Something"}</span> Text of Link // javascript var article = document.getElementsByClassName("article")[0]; var data = eval(article.childNodes[0].innerHTML); |
任意属性无效,但在现代浏览器中完全可靠。如果您通过javascript设置属性,那么您也不必担心验证。
另一种方法是在javascript中设置属性。 jQuery有一个很好的实用方法,只是为了这个目的,或者你可以自己推出。
几乎所有可能的浏览器都可以使用的hack是使用这样的开放类:
这对于纯粹主义者来说并不是那么优雅,但它得到普遍支持,符合标准,并且非常容易操作。这似乎是最好的方法。如果您
唯一的问题是你不能以这种方式存储不可序列化的对象,如果你把那些非常庞大的东西放在那里可能会有限制。
第二种方法是使用假属性,如:
这更优雅,但打破标准,我不是100%肯定支持。许多浏览器都完全支持它,我认为IE6支持
做序贯化和反序列化等有趣的事情会更加危险。
使用
如果您不复制
使用jquery,
存储:
检索:
您可以使用隐藏的输入标记。我在w3.org上没有得到任何验证错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'> <head> <meta content="text/html;charset=UTF-8" http-equiv="content-type" /> Hello </head> <body> <input style="display: none" name="articleid" type="hidden" value="5" /> </body> </html> |
使用jQuery,你会得到类似(未经测试)的文章ID:
1 | $('.article input[name=articleid]').val(); |
但如果这是一个选项我会推荐HTML5。
我知道你现在正在使用jQuery,但如果你内联定义了onclick处理程序会怎样。然后你可以这样做:
1 | Article 5 |
作为jQuery用户,我会使用Metadata插件。 HTML看起来干净,验证,并且您可以嵌入任何可以使用JSON表示法描述的内容。
为什么不利用已有的有意义的数据,而不是添加任意数据?
即使用
所以应该有四种选择:
http://www.shanison.com/?p=321
我主张使用"rel"属性。 XHTML验证,很少使用属性本身,并且有效地检索数据。
这是个好建议。感谢@Prestaul
If you are using jQuery already then you should leverage the"data"
method which is the recommended method for storing arbitrary data on a
dom element with jQuery.
这是真的,但是如果你想在普通的HTML中存储任意数据呢?这是另一种选择......
1 | <input type="hidden" name="whatever" value="foobar"/> |
将数据放在隐藏输入元素的名称和值属性中。如果服务器生成HTML(即PHP脚本或其他),这可能很有用,并且您的JavaScript代码稍后将使用此信息。
诚然,不是最干净的,但它是另一种选择。它与所有人兼容
浏览器并且是有效的XHTML。您不应该使用自定义属性,也不应该使用带有'data-'前缀的属性,因为它可能不适用于所有浏览器。此外,您的文档不会通过W3C验证。
您可以使用随机元素(
您还可以使用
但我个人更喜欢以下内容:
1 | <input type="hidden" title="Your key..." value="Your value..." /> |
在所有情况下,输入都将被隐藏,属性完全有效,如果它在