JQueryを使用してCSSプロパティが変更されたときにイベントを検出


91

要素の "display" cssプロパティが変更されたかどうかを検出する方法はありますか(何もないか、ブロックかインラインブロックか...)?そうでない場合、プラグインはありますか?ありがとう

回答:


93

注意

この投稿が作成されて以来、突然変異イベントは廃止されており、すべてのブラウザーでサポートされているわけではありません。代わりに、突然変異オブザーバーを使用してください。

はい、できます。DOM L2イベントモジュールは変更イベントを定義します。それらの1つ-DOMAttrModifiedは、必要なものです。確かに、これらは広く実装されていませんが、少なくともGeckoおよびOperaブラウザーでサポートされています。

これらの線に沿って何かを試してください:

document.documentElement.addEventListener('DOMAttrModified', function(e){
  if (e.attrName === 'style') {
    console.log('prevValue: ' + e.prevValue, 'newValue: ' + e.newValue);
  }
}, false);

document.documentElement.style.display = 'block';

の代わりにIEの「propertychange」イベントを利用することもできDOMAttrModifiedます。style変更を確実に検出できるようにする必要があります。


ありがとう。Firefoxをサポートしますか?
HP。

7
@Boldewyn:True、ただしclass要素の祖先の属性(CSSに属性セレクターが存在する場合はその他の属性)を変更すると、要素も変更される可能性があるためDOMAttrModified、ドキュメントのルート要素のすべてのイベントを処理する必要があります。すべてをキャッチするようにしてください。
Tim Down

12
そのイベントはw3cでは非推奨です。それは別の方法でなければなりません。
ccsakuweb

8
変更イベントは、APIの設計に欠陥があるため、DOMイベント仕様で非推奨としてマークされています。ミューテーションオブザーバーは、代替案として提案されています。こちらがリンクです[ developer.mozilla.org/en-US/docs/DOM/Mutation_events]
Anmol Saraf '26

1
: - Anmol変異イベントのMDNリンクする必要がありますdeveloper.mozilla.org/en-US/docs/Web/Guide/Events/...
groovecoder

19

attrchange jQueryプラグインを使用できます。プラグインの主な機能は、HTML要素の属性変更時にリスナー関数をバインドすることです。

コードサンプル:

$("#myDiv").attrchange({
    trackValues: true, // set to true so that the event object is updated with old & new values
    callback: function(evnt) {
        if(evnt.attributeName == "display") { // which attribute you want to watch for changes
            if(evnt.newValue.search(/inline/i) == -1) {

                // your code to execute goes here...
            }
        }
    }
});

CSSを変更する一部のプラグインでは、evnt.attributeNameは「表示」ではなく「スタイル」であることに注意してください。
jerrygarciuh 2015

正常に動作しますが、これは正規表現検索を使用するよりも高速であり、最初のif(evnt.attributeName ...):if(evnt.newValue.indexOf( 'display:inline-block')> -1){は必要ありません。 ..; return;}
Dan Randolph

4

jQueryのcss関数を使用してCSSプロパティをテストできます。if ($('node').css('display') == 'block')

Colinは正解です。特定のCSSプロパティが変更されたときに発生する明示的なイベントはありません。しかし、あなたはそれをひっくり返して、表示を設定するイベントなどをトリガーすることができるかもしれません。

また、CSSクラスを追加して、必要な動作を実現することも検討してください。多くの場合、包含要素にクラスを追加し、CSSを使用してすべての要素に影響を与えることができます。AJAX応答が保留中であることを示すために、クラスをbody要素にスラップすることがよくあります。次に、CSSセレクターを使用して必要な表示を取得できます。

これがあなたが探しているものかどうかわかりません。


3

CSSトランジションが影響を与えるプロパティの場合、transitionendイベントを使用できます(例:z-index)。

$(".observed-element").on("webkitTransitionEnd transitionend", function(e) {
  console.log("end", e);
  alert("z-index changed");
});

$(".changeButton").on("click", function() {
  console.log("click");
  document.querySelector(".observed-element").style.zIndex = (Math.random() * 1000) | 0;
});
.observed-element {
  transition: z-index 1ms;
  -webkit-transition: z-index 1ms;
}
div {
  width: 100px;
  height: 100px;
  border: 1px solid;
  position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="changeButton">change z-index</button>
<div class="observed-element"></div>


-17

できません。CSSは「イベント」をサポートしていません。何のためにそれを必要とするのでしょうか?SOのこちらの投稿をご覧ください。イベントをスタイル変更にフックしたい理由は考えられません。ここでは、スタイルの変更がJavaScriptによって他の場所でトリガーされていると想定しています。そこで追加のロジックを追加してみませんか?


1
ボックスが表示されるかどうかをトリガーできるイベントがいくつかあります。そして、私は何かをするために、その箱の外観に多少依存する別の要素があります。コードを繰り返して、ボックスに表示される他のすべてのイベントに接続したくないのですが、これは1つの方法です。ちょうど冗長!
HP。

それは冗長です、おそらくルールベースのシステムを使用するとうまくいきますか?つまり、別のコントロールが変更されたときにいくつかのコントロールで何が起こるかを定義する構造のようなJSONがありますか?この方法では、1つの関数を作成するだけで、ルールオブジェクトと現在のコントロール(ID)をパラメーターとして使用できますか。
コリン

3
なぜこれが反対投票されたのですか?両方の要素の親のクラスを定義し、そのスタイルを変更することが、これに対する唯一の正しい解決策です。
Ilia G

11
「イベントをスタイル変更に接続したい理由が考えられない」という反対の理由-理由が考えられない場合でも、考えられる理由がないという意味ではなく、「なぜそこで追加のロジックを追加しませんか?」-スクリプトを常に変更できるとは限らないため。
Andrei Cojea

例を示すために、親要素のcolorプロパティが変更されたときにsvgパスのfillプロパティを変更したいと思います。
Andrei Cojea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.