[英]Custom data in XHTML 1.0 Strict
我在我的 html 中使用了一些自定義屬性,用於 jquery 的東西。 我看到 HTML5 中有data-XYZ
屬性,但我需要嚴格執行 xhtml 1.0。 我還有什么其他選擇?
您可以使用jQuery MetaData 插件,它允許您以 JSON 格式在 class 屬性中寫入數據:
<li class="someclass {some: 'data'} anotherclass">...</li>
然后在您的 jQuery 中,獲取數據:
var data = $('li.someclass').metadata();
if ( data.some && data.some == 'data' )
alert('It Worked!');
這應該滿足您對 xhtml 1.0 嚴格的要求,並且還允許您使用即插即用的解決方案:)
您可以想到幾個選項。
假設您希望特定於站點的自定義屬性與腳本一起使用,一種方法是將腳本嵌入到您想要添加屬性的元素中。 例如:
<span id="myId1"><script type="text/javascript">
var myId1Span = document.getElementById("myId1");
myId1Span.myData = {};
myId1Span.myData.firstname = "John";
myId1Span.myData.surname = "Smith";
</script>My Text</span>
向元素添加額外數據的另一種方法是將數據嵌入到 class 屬性中。
所以你可以有
<span class="myCssClass http://example.com/hasData
data-firstname:John data-surname:Smith">My Text</span>
如果您將數據用於編寫腳本,則可以添加以下腳本來提取此數據。 您可以在 close body 標簽之前添加它。
<script type="text/javascript">
//<![CDATA[
if (! document.getElementsByClassName)
{
// From http://lawrence.ecorp.net/inet/samples/js-getelementsbyclassname.shtml
document.getElementsByClassName = function(class_name)
{
var docList = this.all || this.getElementsByTagName('*');
var matchArray = new Array();
var re = new RegExp("(?:^|\\s)"+class_name+"(?:\\s|$)");
for (var i = 0; i < docList.length; i++)
{
if (re.test(docList[i].className) )
{
matchArray[matchArray.length] = docList[i];
}
}
return matchArray;
}
}
var hasData = document.getElementsByClassName("http://example.com/hasData");
for (var i = 0 ; i < hasData.length ; i++)
{
var myElem = hasData[i];
myElem.myData = {};
var dataClassList = myElem.className.split(" ");
for (var j = 0 ; j < dataClassList.length ; j++)
{
var dataCandidate = dataClassList[j];
if (dataCandidate.substring(0, 5) == "data-")
if (dataCandidate.indexOf(":") >= 0)
{
var nameValue = dataCandidate.split(":", 2);
myElem.myData[nameValue[0].substring(5)] = nameValue[1];
}
}
}
//]]>
</script>
這應該會導致與第一個選項相同的myData
對象被添加到跨度中。
http://example.com/hasData類只是一個標志,用於指示應處理哪些元素。 為此,您可以使用任何您喜歡的字符串。
這兩種方法都符合 XHTML 1.0 Strict 標准,並且可以作為text/html
或application/xhtml+xml
我只想知道嚴格的規范是否允許以某種方式向元素添加額外數據。
沒有。
(你應該關心嗎?可能不關心,但這是你的決定。)
這是一個建議的解決方案,它是有效的 XHTML 1.0
<li class="someclass someData anotherclass">...</li>
結合
<style>
someData {
--custom-some: data
}
</style>
或者直接在元素上使用 style 屬性。
注 1:class 屬性的語法不允許 json 元數據。 左花括號不是有效的 NMToken。 注 2:元數據中的屬性名稱前面帶有 --custom- 以避免 CSS 本身內容的驗證問題
如果你想要正確的 XHTML,你需要使用 HTML5 doctype ( <!doctype html>
)。 然后您可以使用data-
屬性。
<element data-usage='for an example' data-number='28' />
這是完全有效的 XHTML 嚴格(我在我的網站上使用它)。 這樣做的目的是使 W3C 不會出現並創建與您在網站上使用的名稱相同的屬性並破壞它。
要獲取 JavaScript 中的值,您需要使用elem.getAttribute('data-name');
. W3M 規范確實包括使用ele.dataset.name
但目前尚不支持多種瀏覽器。
我看待它的方式,如果我將它作為text/html
提供,我並不真正關心它是否根據 XHTML 規范有效,因為無論如何它都不會是真正的 xhtml 。 99% 的 xhtml 使用都是這種情況。
只要您沒有諸如缺少結束標記之類的嚴重錯誤,您就不必擔心驗證器告訴您什么,只要您知道為什么。 XHTML 1.0 規范是多年前編寫的。 技術發展迅速。 如果在編寫規范時限制自己使站點“有效”,那么您將永遠無法使用新功能。
雖然我真正的建議是只切換到 HTML 5 - xhtml 語法 AFAIK 與 HTML 5 兼容。可能會有一些輕微的不一致,但在大多數情況下,它應該是一個相當直接的過渡。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.