2011-05-23 25 views
5

में __defineGetter __/__ defineSetter__ द्वारा छिपी हुई संपत्तियों तक पहुंचने से मैं innerHTML संपत्ति के लिए कस्टम सेटर को परिभाषित करने का प्रयास कर रहा हूं। दुर्भाग्य से, मैं अंतर्निहित प्रॉपर्टी का उपयोग करने में असमर्थ हूँ के बाद मैं सेटर समारोह को परिभाषित: क्योंकि काम रिकर्सिवली सेटर कॉलजावास्क्रिप्ट

$('body')[0].__defineSetter__("innerHTML", 
    function (val) { 
    alert("Setting to: " + val); 
    this.innerHTML = val; 
}); 

यह स्निपेट कॉल स्टैक भरता है। Apparenly innerHTML आईई 8 में पहले से ही एक अधिभारित संपत्ति है और आप बस पुरानी गेट/सेट जोड़ी को सहेज सकते हैं और इसे नए प्रॉपर्टी डिस्क्रिप्टर के अंदर उपयोग कर सकते हैं। MSDN से लिया:

var innerHTMLdescriptor = Object.getOwnPropertyDescriptor(Element.prototype, 'innerHTML'); 
Object.defineProperty(Element.prototype, 'innerHTML', 
    { set: function(htmlVal) { 
     var safeHTML = toStaticHTML(htmlVal); 
     innerHTMLdescriptor.set.call(this, safeHTML); 
    } 
}); 

हालांकि, इस क्रोम, जहां getOwnPropertyDescriptor रिटर्न innerHTML के लिए अपरिभाषित के लिए मामला नहीं हो रहा है। इस मामले में, मैं अंतर्निहित संपत्ति का उपयोग कैसे करूं?

बोनस प्रश्न: मैं कैसे सुनिश्चित करूं कि भविष्य में बनाई गई सभी वस्तुओं में यह विशेष innerHTML व्यवहार है? क्या इसके लिए डीओएम प्रोटोटाइप का उपयोग करना संभव है? ऐसा लगता है कि एक समारोह को अधिभारित करना मुझे यहां की आवश्यकता नहीं है। शायद डीओएम कन्स्ट्रक्टर को अधिभारित करना संभव है और __defineGetter__/defineProperty पर कॉल जोड़ें, लेकिन ऐसा लगता है कि कन्स्ट्रक्टर के लिए समर्थन सामान्य नहीं है, इसलिए मैं जानना चाहता हूं कि कोई विकल्प है या नहीं।

+0

वास्तविक उत्पादन कोड में \ _ \ _ defineSetter \ _ \ _ का उपयोग न करें - यह गैर-मानक है और कई ब्राउज़रों के उपयोगकर्ताओं को बहिष्कृत कर सकता है। – Ryan

+1

मानक समकक्ष 'defineProperty' सही है? फिर भी, छुपा संपत्ति का संदर्भ देने की समस्या मौजूद है ... – BruceBerry

+1

नहीं, यह अभी भी वास्तव में एक मानक नहीं है। आपको इसका उपयोग नहीं करना चाहिए क्योंकि इसमें पुराने ब्राउज़र शामिल नहीं हैं। बेशक, यदि आप कुछ गैर-महत्वपूर्ण कर रहे हैं और यह शानदार तरीके से घटता है, तो यह ठीक है। लेकिन ऐसा लगता है कि यह आपके मामले में नहीं होगा। – Ryan

उत्तर

1

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

var _innerHTML = ""; 

this.__defineSetter__("innerHTML", 
    function (val) { 
     alert("Setting to: " + val); 
     _innerHTML = val; 
    }); 

this.__defineGetter__("innerHTML", 
    function() { 
     return _innerHTML; 
    }); 

हालांकि, मैं पाया है कि मौजूदा डोम संपत्तियों पर getters और setters का उपयोग कर अक्सर बस काम नहीं करेगा, इन गुणों को आंतरिक रूप से विशेष हैंडलिंग के कारण। उदाहरण के लिए, यह टेक्स्ट value संपत्ति के साथ काम नहीं करेगा। मैं एक ही नाव में होने के लिए innerHTML की अपेक्षा करता हूं।

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