簡體   English   中英

XHTML 1.0 Strict 中的自定義數據

[英]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/htmlapplication/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM