विशेषता परिवर्तन पर ईवेंट ट्रिगर करने के लिए कोई तरीका है (कस्टम हो सकता है)?डीओएम विशेषता परिवर्तन पर फायरिंग घटना
मान लें, जब IMG src बदल जाता है या DIV का आंतरिक HTML?
विशेषता परिवर्तन पर ईवेंट ट्रिगर करने के लिए कोई तरीका है (कस्टम हो सकता है)?डीओएम विशेषता परिवर्तन पर फायरिंग घटना
मान लें, जब IMG src बदल जाता है या DIV का आंतरिक HTML?
नोट: 2012 तक, उत्परिवर्तन घटनाओं को मानक से हटा दिया गया है और अब उन्हें बहिष्कृत कर दिया गया है। उनके प्रतिस्थापन, MutationObserver
का उपयोग करने के तरीके के लिए अन्य उत्तरों या दस्तावेज़ीकरण देखें।
आप DOM Mutation Events का जिक्र कर रहे हैं। इन घटनाओं के लिए ब्राउज़र समर्थन खराब है (लेकिन सुधार)। Mutation Events plugin for jQuery आपको कुछ रास्ता मिल सकता है।
डोम उत्परिवर्तन घटनाएं वास्तव में ब्राउज़र के बीच उचित रूप से समर्थित हैं। यह सिर्फ इतना है कि आईई उन सभी का समर्थन नहीं करता है (हालांकि आईई 9 होगा) –
@ टिमडाउन यदि आईई की बात आती है, तो यह एक अजीब चीज नहीं है। –
इन्हें अब ' उत्परिवर्तन ऑब्सर्वर', https: //developer.mozilla।संगठन/एन-यूएस/डॉक्स/वेब/एपीआई/उत्परिवर्तन ऑब्सर्वर – DanielB
कोई देशी डोम बदल गया ईवेंट नहीं है जिसमें आप हुक कर सकते हैं।
अच्छा लेख here जो एक jquery प्लगइन के रूप में समाधान प्रदान करने का प्रयास करता है। लेख
$.fn.watch = function(props, callback, timeout){
if(!timeout)
timeout = 10;
return this.each(function(){
var el = $(this),
func = function(){ __check.call(this, el) },
data = { props: props.split(","),
func: callback,
vals: [] };
$.each(data.props, function(i) {
data.vals[i] = el.css(data.props[i]);
});
el.data(data);
if (typeof (this.onpropertychange) == "object"){
el.bind("propertychange", callback);
} else if ($.browser.mozilla){
el.bind("DOMAttrModified", callback);
} else {
setInterval(func, timeout);
}
});
function __check(el) {
var data = el.data(),
changed = false,
temp = "";
for(var i=0;i < data.props.length; i++) {
temp = el.css(data.props[i]);
if(data.vals[i] != temp){
data.vals[i] = temp;
changed = true;
break;
}
}
if(changed && data.func) {
data.func.call(el, data);
}
} }
बड़े उपयोग के साथ 10ms अंतराल प्रदर्शन के बारे में क्या? – pie6k
इस दृष्टिकोण के साथ बहुत बड़े प्रदर्शन प्रभाव हैं। –
"अच्छा लेख" लिंक टूटा हुआ :( – Richardissimo
से
कोड तो एक सरल setInterval()
काम करेंगे आप केवल कुछ विशिष्ट की जरूरत है, लक्ष्य विशेषता (रों) हर कुछ मिलीसेकेंड देख सकते हैं:
var imgSrc = null;
setInterval(function() {
var newImgSrc = $("#myImg").attr("src");
if (newImgSrc !== imgSrc) {
imgSrc = newImgSrc;
$("#myImg").trigger("srcChange");
}
}, 50);
तब करने के लिए बाध्य कस्टम "srcChange" घटना:
$("#myImg").bind("srcChange", function() {....});
इसके लिए अंतराल का उपयोग वास्तव में मेरी राय में खराब है (हाँ यह 'एक' तरीका है) – EricG
अंतराल का उपयोग है सीमित मात्रा में उपयुक्त, विशेष रूप से जहां प्रदर्शन कोई मुद्दा नहीं बन जाएगा। मैंने कोई भी बेंच परीक्षण नहीं चलाया है, लेकिन मुझे अनुभव से पता है कि मैं प्रदर्शन में गिरावट को ध्यान में रखे बिना तेजी से अंतराल में डीओएम में सभी प्रकार की संपत्तियों का उपयोग कर सकता हूं। – Xaxis
एक उत्परिवर्तन ऑब्सर्वर कैसे सेट करें, अधिकतर MDN से कॉपी किया गया है लेकिन मैंने स्पष्टता के लिए अपनी टिप्पणियां जोड़ दी हैं।
window.MutationObserver = window.MutationObserver
|| window.WebKitMutationObserver
|| window.MozMutationObserver;
// Find the element that you want to "watch"
var target = document.querySelector('img'),
// create an observer instance
observer = new MutationObserver(function(mutation) {
/** this is the callback where you
do what you need to do.
The argument is an array of MutationRecords where the affected attribute is
named "attributeName". There is a few other properties in a record
but I'll let you work it out yourself.
**/
}),
// configuration of the observer:
config = {
attributes: true // this is to watch for attribute changes.
};
// pass in the element you wanna watch as well as the options
observer.observe(target, config);
// later, you can stop observing
// observer.disconnect();
उम्मीद है कि इससे मदद मिलती है।
क्रोम में एक आकर्षण की तरह काम करता है। वास्तव में उपयोगी! –
Mats' answerMDN's MutationObserver Example usage से प्रेरित करने के अलावा:
यदि आपका विकल्पों<property>: true
होते हैं और आप MutationObserver
के कॉलबैक फ़ंक्शन के अंदर लक्ष्य की इस संपत्ति को बदलने के लिए, पुनरावर्ती कॉल को रोकने के लिए निम्नलिखित का उपयोग की योजना है - जब तक स्क्रिप्ट टाइमआउट, स्टैक ओवरफ़्लो या जैसे:
...
// Used to prevent recursive calls of observer's callback function
// From https://stackoverflow.com/questions/4561845/firing-event-on-dom-attribute-change
let insideInitialObserverCallback = false
let callback = function(mutationsList) {
insideInitialObserverCallback = ! insideInitialObserverCallback
if (insideInitialObserverCallback) {
// ... change target's given property ...
}
})
let observer = new MutationObserver(callback);
...
एक क्वेरी प्लगइन ऐसा करेगा। https://stackoverflow.com/questions/16781778/detecting-attribute-change-of-value-of-an-attribute-i-made/29978836#29978836 – Kavi