में __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
पर कॉल जोड़ें, लेकिन ऐसा लगता है कि कन्स्ट्रक्टर के लिए समर्थन सामान्य नहीं है, इसलिए मैं जानना चाहता हूं कि कोई विकल्प है या नहीं।
वास्तविक उत्पादन कोड में \ _ \ _ defineSetter \ _ \ _ का उपयोग न करें - यह गैर-मानक है और कई ब्राउज़रों के उपयोगकर्ताओं को बहिष्कृत कर सकता है। – Ryan
मानक समकक्ष 'defineProperty' सही है? फिर भी, छुपा संपत्ति का संदर्भ देने की समस्या मौजूद है ... – BruceBerry
नहीं, यह अभी भी वास्तव में एक मानक नहीं है। आपको इसका उपयोग नहीं करना चाहिए क्योंकि इसमें पुराने ब्राउज़र शामिल नहीं हैं। बेशक, यदि आप कुछ गैर-महत्वपूर्ण कर रहे हैं और यह शानदार तरीके से घटता है, तो यह ठीक है। लेकिन ऐसा लगता है कि यह आपके मामले में नहीं होगा। – Ryan