2012-05-02 8 views
14

मैं नई Mutation Observer कार्यक्षमता के साथ चयन बॉक्स (या नेस्टेड option तत्व) में परिवर्तनों की निगरानी करने की कोशिश कर रहा हूं। हालांकि, केवल "setAttribute" मेरे लिए उत्परिवर्तन पर्यवेक्षक के कॉलबैक को ट्रिगर कर रहा है।वेबकिट उत्परिवर्तन पर्यवेक्षक कॉलबैक ट्रिगर नहीं हुआ जब चुनिंदा बॉक्स विशेषता का परिवर्तन

यहाँ कोड मैं का उपयोग कर रहा है:

~function(doc, $) { 
    var select = $('select'); 

    // http://www.w3.org/TR/dom/#mutation-observers 
    var observer = new WebKitMutationObserver(function(mutations) { 
     alert(mutations.length + " mutations happened"); 
    }); 

    observer.observe(select, { 
     // monitor descendant elements – changing `selected` attr on options 
     subtree: true, 
     attributes: true 
    }); 

    // this triggers Observer's reaction, but doesn't update select box UI 
    select.setAttribute('value', 'whee'); 
    // this updates select box UI, but doesn't trigger mutation observer's callback 
    select.value = "whee"; 
    // this also updates the UI, but doesn't trigger mutation observer's callback 
    select.getElementsByTagName('option')[0].selected = true; 
    // 
    // neither does manual selecting of options trigger mutation observer unfortunately :(

    button.addEventListener('click', function(e) { 
     e.preventDefault(); 
     // my goal is to react to this change here 
     select.value = Math.random() > .5 ? "whee" : "whoa"; 
    }, false); 

}(document, function(selector) { return document.querySelector(selector); });​ 

और यहाँ कार्रवाई http://jsfiddle.net/gryzzly/wqHn5/

मैं विशेषताओं में बदलाव (<select> पर <option> पर selected या value) पर प्रतिक्रिया करना चाहते हैं, कोई सुझाव में इस कोड है क्यों पर्यवेक्षक प्रतिक्रिया नहीं करता है स्वागत से अधिक है!

मै मैक ओएस एक्स पर क्रोम 18.0.1025.168 में इसका परीक्षण कर रहा हूं। उत्पादन कोड में भी moz कन्स्ट्रक्टर और अपरिक्स्ड संस्करण के लिए उपसर्ग भी होगा, यह परीक्षण कोड है।

यूपीडी।

फ़ायरफ़ॉक्स नाइटली में भी कोड का परीक्षण किया और यह क्रोम के साथ-साथ क्रोम कैनरी में भी व्यवहार करता है। मैं दोनों ब्राउज़रों के लिए बग भरा है:

कृपया टिप्पणी और इन कीड़ों के लिए वोट अगर आप भी इस समस्या से परेशान हैं।

+0

ऐसा नहीं लगता कि मैं एक अधूरा नमूना के प्रयोगात्मक कार्यान्वयन पर भरोसा करना चाहता हूं। –

+1

क्रोमियम के खिलाफ रिपोर्ट की गई संबंधित वेबकिट-रूट वाली बग का एक और अभिव्यक्ति होना प्रतीत होता है: http://code.google.com/p/chromium/issues/detail?id=103551 –

+2

@ टिमडाउन ने कहा कि मैं कुछ भी भरोसा कर रहा हूं? :-) मैं खुद का प्रयोग कर रहा हूँ! –

उत्तर

4

@gryzzly, मैं एक विस्तृत प्रतिक्रिया के साथ क्रोमियम बग को नवीनीकृत किया है: http://code.google.com/p/chromium/issues/detail?id=128991#c4

उत्परिवर्तन निरीक्षक डोम राज्य धारावाहिक को देख तक सीमित हैं। यदि आप जानना चाहते हैं कि उत्परिवर्तन पर्यवेक्षक कुछ देख सकते हैं, बस तत्व के लिए आंतरिक HTML आउटपुट देखें। यदि आप मार्कअप में परिवर्तनों में दिखाई देने वाले राज्य में परिवर्तन देख सकते हैं जो उत्पन्न करता है, तो उत्परिवर्तन पर्यवेक्षकों को सुनने में सक्षम होना चाहिए।

टीएल; डीआर: यह इरादा के रूप में काम कर रहा है; HTMLSelectElement.value जैसे आईडीएल विशेषताओं में परिवर्तनों का निरीक्षण करने के लिए, ऑनक्लिक या ऑनचेंज जैसी इनपुट इवेंट शायद आपकी सर्वश्रेष्ठ शर्त है।

+0

आपके प्रयास के लिए धन्यवाद। मैंने एक टिप्पणी लिखी है: https://code.google.com/p/chromium/issues/detail?id=128991#c5 –

+0

@gryzzly: बग पर adamk की टिप्पणी स्पॉट पर है। सौभाग्य से, उन मामलों के लिए जहां फॉर्म तत्वों के 'मूल्य' जैसे गुणों में परिवर्तन डीओएम विशेषताओं में प्रतिबिंबित नहीं होते हैं, वैकल्पिक परिवर्तन होते हैं, जैसे 'परिवर्तन' और 'इनपुट' ईवेंट। –

+1

@TimDown जैसा कि मैंने मुद्दों के पृष्ठों पर लिखा है, समस्या यह है कि जब जेएस इस 'select.value = "foo" जैसे मान बदल रहा है; ', यूआई अपडेट और जब फॉर्म सबमिट किया जाता है तो मान नया होता है, लेकिन 'परिवर्तन' और 'इनपुट' घटनाएं आग नहीं लगती हैं। –

संबंधित मुद्दे