Javascript、CSS: スタイル属性で要素を取得する 質問する

Javascript、CSS: スタイル属性で要素を取得する 質問する

そうしたいです:

  1. ページ内のすべての要素のスタイル属性を検索します(例: を持つすべての要素color:#333;
  2. すべてに対してこの属性を変更します (たとえば、 からcolor:#333color:#444)。

そうすることに関して何か提案はありますか?

ベストアンサー1

私の提案は、可能な限りこれを避けることです。代わりに、クラスを使用して色の値を割り当て、色の値ではなくクラスを使用して要素を検索できるようにします。

私の知る限り、CSS3でさえも、クエリに使用できるセレクタは存在しません。特定のスタイル値、つまりすべての要素をループして (または、属性を持つすべての要素に制限できるようですstyle)、element.style.colorプロパティを確認します。ここで問題となるのは、属性color: #333;に記述したとしてもstyle、ブラウザーが異なれば、その記述がさまざまな方法で返されるということです。 、#333#333333、 などrgb(51, 51, 51)、 になる可能性もありますrgba(51, 51, 51, 0)

全体的に、実に厄介な練習です。


これは Chrome 拡張機能用だとおっしゃっているので、複数の形式についてそれほど心配する必要はないと思いますが、Chrome が形式を変更する場合(他のブラウザとの一貫性を保つためなど、よくあることです)に備えて、実際に使用されている形式も入れておきます。

しかし、例えば:

(function() {

  // Get all elements that have a style attribute
  var elms = document.querySelectorAll("*[style]");

  // Loop through them
  Array.prototype.forEach.call(elms, function(elm) {
    // Get the color value
    var clr = elm.style.color || "";

    // Remove all whitespace, make it all lower case
    clr = clr.replace(/\s/g, "").toLowerCase();

    // Switch on the possible values we know of
    switch (clr) {
      case "#333":
      case "#333333":
      case "rgb(51,51,51)": // <=== This is the one Chrome seems to use
      case "rgba(51,51,51,0)":
        elm.style.color = "#444";
        break;
    }
  });
})();

わかりやすくするために赤を使用したライブ例|ソース- この例は、ES5機能と がありquerySelectorAllますが、これは Chrome なので、それらが存在することはわかっています。

上記は属性について話しているからインラインスタイルを前提としていることに注意してくださいstyle計算されたスタイルなら、ループする以外に方法はありません全てページ上の要素を呼び出しますgetComputedStyle。それ以外は上記が適用されます。

最後に:もし本当にスタイル属性に値やまたは、その他の文字列でcolor: #333はなく、正確に値を指定したいのであれば、次のように処理できます。しかし、color:#333color:#333333;color: #333; font-weight: boldquerySelectorAllquerySelectorAll('*[style="color: #333"]')とても壊れやすい。


下のコメントから、あなたは次のようなことを経験しているようです要素。もしそうなら、私はquerySelectorAllまったく使用せず、再帰降下を使用します。

function walk(elm) {
    var node;

    // ...handle this element's `style` or `getComputedStyle`...

    // Handle child elements
    for (node = elm.firstChild; node; node = node.nextSibling) {
        if (node.nodeType === 1) { // 1 == Element
            walk(node);
        }
    }
}

// Kick it off starting with the `body` element
walk(document.body);

こうすることで、大きくて不必要な一時構造を構築しなくて済みます。これはおそらく、ドキュメントの DOM 全体を走査する最も効率的な方法です。

おすすめ記事