首頁 >web前端 >css教學 >如何使用 JavaScript 存取 CSS 產生的內容和計數器?

如何使用 JavaScript 存取 CSS 產生的內容和計數器?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-02 22:19:10554瀏覽

How Can I Access CSS-Generated Content and Counters Using JavaScript?

在 JavaScript 中訪問 CSS 生成的內容和計數器

背景

使用 CSS計數器時和內容屬性,以在網頁上產生編號的標題和圖形,並存取這些的即時值對於向圖形添加引用連結等場景,計數器和從 JavaScript 產生的內容可能是必需的。

GetCompulatedStyle 的限制

雖然window.getComputedStyle() 可以提供對CSS 的深入了解屬性,它在這種情況下有所不足,因為它從樣式表中檢索聲明的值而不是實際的即時值。對於計數器,甚至沒有可訪問的 CSS 屬性可供查詢。

Firefox 的 DOM Level 2 樣式計數器

DOM Level 2 樣式計數器介面的初步探索提出了一個解決方案,但問題仍然存在,因為 Counter物件也缺少用於檢索目前計數器的屬性

方法一:暴力演算法

在沒有直接介面的情況下,一種選擇是手動進行DOM,用計數器和根據它們的出現增加計數。然而,這種方法非常耗費資源,而且容易出現跨瀏覽器的兼容性問題。

方法二:基於腳本的計數器

另一種方法是替換 CSS-基於計數器與基於腳本的等效項。這涉及為元素分配唯一的ID,並使用自訂腳本遍歷文件並根據元素層次結構遞增計數器,類似於下面的範例程式碼:

function Node_getElementsByClassName(element, classNames) {
  var results = [];
  var elements;
  if (typeof element.getElementsByClassName === "function") {
    elements = element.getElementsByClassName(classNames);
    for (var i = 0, l = elements.length; i < l; ++i) {
      results.push(elements[i]);
    }
  }
  return results;
}

function Element_getClassArgument(element, argumentName) {
  var result = null;
  var className = element.getAttribute("class");
  if (className) {
    var pattern = new RegExp("(^|\s)" + argumentName + "=([^\s]+)", "i");
    var match = pattern.exec(className);
    if (match) {
      result = match[2];
    }
  }
  return result;
}

window.onload = function() {
  var counters = Node_getElementsByClassName(document.body, "counter");
  var indices = [];
  for (var counteri = 0; counteri < counters.length; counteri++) {
    var counter = counters[counteri];

    var level = Element_getClassArgument(counter, "level");
    while (indices.length <= level) {
      indices.push(0);
    }
    indices[level]++;
    indices = indices.slice(level + 1);
    var text = document.createTextNode(
      "Figure " + indices.join(".")
    );
    counter.parentNode.insertBefore(text, counter.nextSibling);

    if (counter.id !== "") {
      for (var linki = document.links.length; linki--; ) {
        var link = document.links[linki];
        if (
          link.hostname === location.hostname &&
          link.pathname === location.pathname &&
          link.search === location.search &&
          link.hash === "#" + counter.id
        ) {
          var text = document.createTextNode("(" + indices.join(".") + ")");
          link.parentNode.insertBefore(text, link.nextSibling);
        }
      }
    }
  }
};

透過實現這樣的腳本,可以以獨立於瀏覽器的方式有效追蹤和操作計數器。

以上是如何使用 JavaScript 存取 CSS 產生的內容和計數器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn