2014-12-01 8 views
7

यदि मैं जावास्क्रिप्ट ऑब्जेक्ट की गुणों को अपरिवर्तनीय बनाना चाहता हूं, तो मैं ऑब्जेक्ट विधियों जैसे defineProperties(), defineProperty(), और freeze() का उपयोग कर सकता हूं। मेरा सवाल है, मैं HTML तत्व विशेषताओं के साथ ऐसा कैसे कर सकता हूं?क्या HTML तत्व विशेषताओं को अपरिवर्तनीय बनाना संभव है?

मैं पहले से ही ऊपर उल्लिखित तरीकों की कोशिश की है, और जब वे सीधे सेट होने से एक तत्व के गुणों को रोकने के लिए इस्तेमाल किया जा सकता है (जैसे elem.id = 'foo';), के रूप में उम्मीद, अंतर्निहित गुण अभी भी setAttribute() के माध्यम से बदला जा सकता है।

"नहीं, यह संभव नहीं है" का उत्तर स्वीकार्य होगा, लेकिन मैं अभी तक उस प्रभाव के किसी भी निश्चित बयान में नहीं आया हूं।

+1

अब तक यह जावास्क्रिप्ट में समर्थित नहीं है लेकिन ECMAScript 5 जावास्क्रिप्ट लाइब्रेरी से अपरिवर्तनीय गुणों का समर्थन कर सकता है। –

+1

आप उस तत्व पर 'setAttribute() 'को फिर से परिभाषित करने के लिए एक त्रुटि फेंक सकते हैं। यह काम कर सकता है, हालांकि मैंने कोशिश नहीं की है। – iamnotmaynard

+1

@iamnotmaynard: आप अभी भी 'otherElement.setAttribute.call (thatElement, ...) 'का उपयोग कर सकते हैं, यदि कोई पर्याप्त निर्धारित है ...: पी हालांकि, यह सरल गलतियों के खिलाफ सुरक्षा करेगा, भले ही यह दुर्भावनापूर्ण उपयोगकर्ताओं के खिलाफ अप्रभावी हो। निर्भर करता है कि ओपी को वास्तव में क्या चाहिए। – Amadan

उत्तर

3

आप पुरानी विशेषता मान को पुनर्स्थापित करने के लिए उत्परिवर्तन पर्यवेक्षकों का उपयोग कर सकते हैं।

new MutationObserver(callback) 
    .observe(elem, {attributes: true, attributeOldValue: true}); 

function callback(mutations, observer) { 
    var target = mutations[0].target; 
    observer.disconnect(); 
    mutations.forEach(function(mutation) { 
     target.setAttribute(mutation.attributeName, mutation.oldValue); 
    }); 
    observer.observe(target, {attributes: true, attributeOldValue: true}); 
} 

जो अनंत लूप से बचने के लिए जरूरी हैं observer.disconnect से जुड़े सुझाव के लिए @DoctorDestructo के लिए धन्यवाद।

+0

यह एक अनंत लूप की तरह दिखता है, लेकिन मुझे विचार पसंद है। – Amadan

+0

मुझे [MutationObserver] (https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) के साथ कोई अनुभव नहीं है, लेकिन यह आशाजनक दिखता है। DefineProperty() जैसे "सेट-इट-एंड-भूल-इट" समाधान की अनुपस्थिति में, यह सबसे अच्छा विकल्प हो सकता है। – DoctorDestructo

+0

मैंने इसका एक भिन्नता परीक्षण किया और पाया कि यह स्क्रिप्ट चल रहा है, जबकि बाद में विशेषता मूल्यों को वापस नहीं करता है। तो यह वास्तव में अपरिवर्तनीयता के भ्रम पैदा नहीं करता है। मुझे यकीन नहीं है कि इसे एक व्यवहार्य विकल्प के रूप में समाप्त करता है, हालांकि। एक और बात यह जानना है कि उत्परिवर्तन ऑब्सर्वर IE में समर्थित नहीं है <11. – DoctorDestructo

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