घटना का पता तब चलता है जब Jquery का उपयोग करके सीएसएस संपत्ति बदल गई


91

क्या यह पता लगाने का एक तरीका है कि किसी तत्व की "प्रदर्शन" सीएसएस संपत्ति को बदल दिया जाता है (क्या कोई नहीं या ब्लॉक या इनलाइन-ब्लॉक ...)? यदि नहीं, तो कोई प्लगइन? धन्यवाद

जवाबों:


93

ध्यान दें

इस पोस्ट के लिखे जाने के बाद से उत्परिवर्तन घटनाओं को हटा दिया गया है, और सभी ब्राउज़रों द्वारा समर्थित नहीं किया जा सकता है। इसके बजाय, एक उत्परिवर्तन पर्यवेक्षक का उपयोग करें ।

हाँ तुम कर सकते हो। DOM L2 इवेंट मॉड्यूल म्यूटेशन ईवेंट को परिभाषित करता है ; उनमें से एक - DOMAttrModified वह है जिसकी आपको आवश्यकता है। दी गई, ये व्यापक रूप से लागू नहीं हैं, लेकिन कम से कम गेको और ओपेरा ब्राउज़रों में समर्थित हैं।

इन पंक्तियों के साथ कुछ आज़माएँ:

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 के "प्रॉपर्टीचेंज" इवेंट का उपयोग करने का भी प्रयास कर सकते हैं DOMAttrModified। इसे styleमज़बूती से परिवर्तनों का पता लगाने की अनुमति देनी चाहिए ।


धन्यवाद। क्या यह फ़ायरफ़ॉक्स का समर्थन करेगा?
एच.पी.

7
@Boldewyn: सही है, लेकिन classतत्व के पूर्वज की विशेषता (या किसी अन्य विशेषता यदि विशेषता चयनकर्ता CSS में मौजूद है) को बदलना भी तत्व को बदल सकता है, इसलिए आपको DOMAttrModifiedदस्तावेज़ रूट तत्व पर सभी घटनाओं को संभालना होगा सब कुछ पकड़ने के लिए सुनिश्चित हो।
टिम डाउन

12
उस घटना को w3c में चित्रित किया गया है। यह एक और तरीका होना चाहिए।
ccsakuweb

8
उत्परिवर्तन घटनाओं को DOM ईवेंट विनिर्देशन में पदावनत के रूप में चिह्नित किया गया है, क्योंकि API का डिज़ाइन त्रुटिपूर्ण है। उत्परिवर्तन पर्यवेक्षक प्रस्तावित प्रतिस्थापन हैं। यहाँ लिंक है [ developer.mozilla.org/en-US/docs/DOM/Mutation_events]
अनमोल सराफ

1
अनमोल - उत्परिवर्तन घटनाओं के लिए
एमडीएन

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...
            }
        }
    }
});

ध्यान दें कि सीएसएस evnt.attributeName को संशोधित करने वाले कुछ प्लगइन्स के लिए 'शैली' 'प्रदर्शन' नहीं है।
jerrygarciuh

अच्छी तरह से काम करता है, लेकिन यह रेगेक्स खोज का उपयोग करने की तुलना में अधिक तेज़ है और आपको इसकी पहली आवश्यकता नहीं है अगर (evnt.attributeName ...): if (evnt.newValue.indexOf ('डिस्प्ले: इनलाइन-ब्लॉक'): -1 -1 {। ..; वापसी;}
दान रैंडोल्फ

4

आप cssसीएसएस गुणों का परीक्षण करने के लिए jQuery के फ़ंक्शन का उपयोग कर सकते हैं , जैसे। if ($('node').css('display') == 'block')

कॉलिन सही है, कि कोई स्पष्ट घटना नहीं है जो विशिष्ट सीएसएस संपत्ति बदल जाने पर निकाल दी जाती है। लेकिन आप इसे इधर-उधर करने में सक्षम हो सकते हैं, और एक घटना को ट्रिगर कर सकते हैं जो डिस्प्ले सेट करता है, और जो कुछ भी।

अपने इच्छित व्यवहार को प्राप्त करने के लिए CSS कक्षाओं को जोड़ने का उपयोग करने पर भी विचार करें। अक्सर आप किसी वर्ग को एक तत्व में जोड़ सकते हैं, और सभी तत्वों को प्रभावित करने के लिए CSS का उपयोग कर सकते हैं। मैं अक्सर इंगित करने के लिए कि AJAX प्रतिक्रिया लंबित है, शरीर के तत्व पर एक वर्ग को थप्पड़ मारता है। तब मैं अपनी पसंद का प्रदर्शन पाने के लिए CSS चयनकर्ताओं का उपयोग कर सकता हूं।

यकीन नहीं होता कि यह वही है जो आप खोज रहे हैं।


3

ऐसे गुण जिनके लिए सीएसएस संक्रमण को प्रभावित करेगा, ट्रांज़ेंडेंड इवेंट का उपयोग कर सकते हैं, उदाहरण के लिए 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 "घटनाओं" का समर्थन नहीं करता है। हिम्मत मैं पूछता हूँ कि आपको इसके लिए क्या चाहिए? इस पोस्ट को यहाँ एसओ पर देखें। मैं एक ऐसे कारण के बारे में नहीं सोच सकता कि आप किसी घटना को स्टाइल में बदलाव करना क्यों चाहते हैं। मैं यहाँ मान रहा हूँ कि शैली परिवर्तन को किसी और जगह जावास्क्रिप्ट द्वारा ट्रिगर किया गया है। वहां अतिरिक्त तर्क क्यों नहीं जोड़ते?


1
मेरे पास कई ईवेंट हैं जो प्रकट होने या न होने के लिए एक बॉक्स को ट्रिगर कर सकते हैं। और मेरे पास एक और तत्व है कि थोथा चीजों को करने के लिए उस बॉक्स की उपस्थिति पर निर्भर करता है। अब, मैं कोड को दोहराना नहीं चाहता और बॉक्स में उपस्थिति बनाने वाली अन्य सभी घटनाओं को हुक कर सकता हूं, हालांकि यह करने का एक तरीका है। बस अतिरेक!
एच.पी.

यह बेमानी है, शायद एक नियम आधारित प्रणाली का उपयोग करना काम करेगा? यानी, कुछ JSON जैसी संरचना जो परिभाषित करती है कि जब एक और नियंत्रण बदलता है तो कुछ नियंत्रण का क्या होना चाहिए? इस तरह से आपको केवल 1 फ़ंक्शन बनाने की आवश्यकता होगी जो कि नियम ऑब्जेक्ट का उपयोग करता है और शायद वर्तमान नियंत्रण (आईडी) पैरामीटर के रूप में?
कॉलिन

3
यह क्यों ठुकराया गया है? दोनों तत्वों के माता-पिता के लिए परिभाषित करना और उस पर शैली बदलना इसके लिए एकमात्र सही समाधान है।
इलिया जी

11
डाउनवॉट के लिए "मैं एक कारण के बारे में सोच नहीं सकता कि आप एक घटना को स्टाइल में बदलाव के लिए क्यों चाहते हैं" - यदि आप एक कारण के बारे में नहीं सोच सकते हैं तो इसका मतलब यह नहीं है कि कोई संभावित कारण नहीं है, और "क्यों अतिरिक्त तर्क नहीं जोड़ें? - क्योंकि आप हमेशा स्क्रिप्ट को संशोधित नहीं कर सकते।
आंद्रेई कोजिया

एक उदाहरण प्रदान करने के लिए, मैं एक svg पथ की भरण संपत्ति को बदलना चाहता हूं जब मूल तत्व की रंग संपत्ति बदल जाती है।
आंद्रेई कोजिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.