2009-02-26 8 views
7

मैंने अपने प्रोटोटाइप का उपयोग करके एचटीएमएल तत्व बनाने और विस्तार करने के लिए एक पैटर्न पकाया। यह गैर-यानी ब्राउज़र में एक आकर्षण की तरह काम करता है। उदाहरण कोड @jsbin पाया जा सकता है (पेज स्रोत देखें)क्या आईई (<8) में एचटीएमएल तत्व के प्रोटोटाइप का पर्दाफाश करने का कोई तरीका नहीं है?

इस पद्धति का लाभ गति होना चाहिए (तरीकों तत्वों प्रोटोटाइप श्रृंखला में हैं, इसलिए वे एक बार संदर्भित)। आपने सही अनुमान लगाया है: आईई नहीं जाना। आईई < 8 में एचटीएमएल तत्वों का प्रोटोटाइप छिपा हुआ/सुलभ नहीं है, इसलिए आपके द्वारा बनाए गए प्रत्येक तत्व के लिए, आपको फिर से गैर मानक विधियों का संदर्भ देना होगा (यदि आप पैटर्न को गहन रूप से उपयोग करते हैं तो आपको बहुत सारे पॉइंटर्स के साथ छोड़ना होगा)। मैंने समाधान के लिए वेब की खोज की है, लेकिन केवल जटिल कामकाज पाए गए हैं। क्या वास्तव में आईई में एक HTML तत्व प्रोटोटाइप तक पहुंचने का कोई तरीका नहीं है?

+0

उपलब्ध HTML तत्वों के प्रोटोटाइप IE8 में है? यदि हां, तो इसका उपयोग कैसे किया जाता है? – Helephant

+0

जहां तक ​​मैं समझ गया, यह है। और इसे प्रोटोटाइप के माध्यम से एक्सेस किया जाता है (जैसे document.getElementById ('someelement')। प्रोटोटाइप)। इस बीच मैंने लीक मुक्त जावास्क्रिप्ट का उपयोग करने में सक्षम होने के लिए एक डोम-रैपर लिखा था। – KooiInc

+0

@ हेल्फ़ेंट हां, यह सुलभ है। उदाहरण के लिए, आप 'Element.prototype' तक पहुंच सकते हैं और इसमें विधियां जोड़ सकते हैं। यह [डोम लिविंग स्टैंडर्ड] (https://dom.spec.whatwg.org/) के नवीनतम संस्करण द्वारा गारंटीकृत है, जो 'एलिमेंट' जैसी चीजों को परिभाषित करता है [WebIDL] (http://www.w3.org/टीआर/वेबआईडीएल) इंटरफेस, जो इसके साथ स्पष्ट प्रभाव डालता है कि उन्हें वैश्विक दायरे में सुलभ होना चाहिए और उनके प्रोटोटाइप को संशोधित किया जाना चाहिए। –

उत्तर

12

नहीं, और न ही यह गारंटी है कि आप सामान्य रूप से जावास्क्रिप्ट में डीओएम ऑब्जेक्ट्स प्रोटोटाइप के साथ परेशान हो सकते हैं। डीओएम ऑब्जेक्ट्स ईसीएमएस्क्रिप्ट स्पेक का हिस्सा नहीं हैं; वे किसी भी ब्राउज़र में मूल जावास्क्रिप्ट ऑब्जेक्ट्स (और पारंपरिक रूप से बोल नहीं रहे हैं) नहीं हो सकते हैं।

यही कारण है कि ढांचे के अपने स्वयं के 'कंटेनर' रैपर वर्ग होते हैं।

इसके अलावा आप मूल टीएस ऑब्जेक्ट्स के बावजूद 't.el.constructor' पर भरोसा नहीं कर सकते हैं। 'कन्स्ट्रक्टर' एक मानक संपत्ति नहीं है, आईई में उपलब्ध नहीं है, और यहां तक ​​कि मोज़िला में ऐसा नहीं करता है जो आप सोच सकते हैं। से बचें।

+0

इनमें से अधिकतर अप्रचलित है, और मुझे यकीन नहीं है कि पोस्ट किए जाने पर भी यह सब सच था। पुराने [डोम लेवल 3] (http://www.w3.org/TR/DOM-Level-3-Core/ecma-script-binding.html) और वर्तमान [डोम लिविंग स्टैंडर्ड] (http: // www .w3.org/TR/dom /) इंटरफेस निर्दिष्ट करते समय * रचनाकारों * के लिए स्पष्ट संदर्भ बनाते हैं, और [ईसीएमएस्क्रिप्ट 3] (http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ ECMA-262,% 203 वीं% 20edition,% 20December% 201999.pdf) (खंड 4.2.1) और [ECMAScript 5] (http://www.ecma-international.org/ecma-262/5.1/#sec- देखना 4.3.4) चश्मे निर्देश देते हैं कि एक निर्माता के पास 'प्रोटोटाइप' संपत्ति होती है। –

+0

इसके अतिरिक्त, कन्स्ट्रक्टर प्रॉपर्टी * * ईसीएमएस्क्रिप्ट 3 में मूल वस्तुओं के लिए specced था; बस CTRL-F '.constructor' या http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999 में' निर्माता property' के लिए .pdf। वे ECMAScript 5 में specced रहते हैं यह * है * सही लगते हैं, हालांकि, वहाँ कोई सामान्य नियम है कि एक निर्माता के 'prototype' संपत्ति एक' constructor' संपत्ति वापस निर्माता की ओर इशारा करते होना आवश्यक है कि, तो मुझे लगता मेजबान वस्तुओं एक मूर्खतापूर्ण हो सकता था तकनीकी रूप से spec का उल्लंघन किए बिना 'कन्स्ट्रक्टर' संपत्ति, लेकिन व्यवहार में वे नहीं करते हैं। –

+0

इसके अतिरिक्त, [डोम लिविंग स्टैंडर्ड] (http://www.w3.org/TR/dom/) के नवीनतम संस्करण में, सभी डोम ऑब्जेक्ट्स को समझदारी से व्यवहार करने की गारंटी दी जाती है, क्योंकि उन्हें [WebIDL] का उपयोग करके घोषित किया जाता है (http://www.w3.org/TR/WebIDL), जो अन्य चीजों के साथ निर्देशित करता है कि एक इंटरफ़ेस ऑब्जेक्ट वैश्विक ऑब्जेक्ट की संपत्ति के रूप में मौजूद होना चाहिए जब तक कि 'NoInterfaceObject' निर्दिष्ट नहीं किया जाता है, और प्रोटोटाइप ऑब्जेक्ट्स में' कन्स्ट्रक्टर होना चाहिए 'इंटरफ़ेस ऑब्जेक्ट को इंगित करने वाली गुण। तो 200 9 में कितनी छोटी कल्पना अस्पष्टता बनी रही और अब यह पता चला। –

4

हां वास्तव में ऐसा करने का कोई तरीका नहीं है।

आईई तत्व COM वस्तुओं पर आधारित हैं जो वास्तव में आर्बिटरी सदस्यों को उनके इंटरफेस में जोड़ने की अनुमति नहीं देते हैं (COM में, इंटरफेस एक अनुबंध होते हैं और कभी नहीं बदलना चाहिए)। इन इंटरफेस के कार्यान्वयन को जावास्क्रिप्ट द्वारा विस्तारित नहीं किया जा सकता है, तत्व केवल प्रोटोटाइप नहीं हैं।

आईई जावास्क्रिप्ट के साथ काम करने के लिए डिज़ाइन किया गया एक विशेष इंटरफ़ेस जोड़ता है ताकि नए सदस्यों को एक विशिष्ट उदाहरण में जोड़ा जा सके, लेकिन आप 'क्लास' में कोई नया सदस्य नहीं जोड़ सकते हैं क्योंकि इसके साथ कोई प्रोटोटाइप नहीं है।

0

आलेख HTMLElement doesnt work in IE से निम्नलिखित, कट और पेस्ट किया गया। उदाहरण आईई और फ़ायरफ़ॉक्स में पूरी तरह से काम करता है।

<html> 
<head> 
    <script type="text/javascript" src="DOMElement.js"></script> 
    <script type="text/javascript"> 

     var DOMElement = 
     { 
      extend: function(name,fn) 
      { 
       if(!document.all) 
        eval("HTMLElement.prototype." + name + " = fn"); 
       else 
       { 
        // 
        // IE doesn't allow access to HTMLElement 
        // so we need to override 
        // *document.createElement 
        // *document.getElementById 
        // *document.getElementsByTagName 
        // 

        //take a copy of 
        //document.createElement 
        var _createElement = document.createElement; 

        //override document.createElement 
        document.createElement = function(tag) 
        { 
         var _elem = _createElement(tag); 
         eval("_elem." + name + " = fn"); 
         return _elem; 
        } 

        //take copy of 
        //document.getElementById 
        var _getElementById = document.getElementById; 

        //override document.getElementById 
        document.getElementById = function(id) 
        { 
         var _elem = _getElementById(id); 
         eval("_elem." + name + " = fn"); 
         return _elem; 
        } 

        //take copy of 
        //document.getElementsByTagName 
        var _getElementsByTagName = document.getElementsByTagName; 

        //override document.getElementsByTagName 
        document.getElementsByTagName = function(tag) 
        { 
         var _arr = _getElementsByTagName(tag); 
         for(var _elem=0;_elem<_arr.length;_elem++) 
          eval("_arr[_elem]." + name + " = fn"); 
         return _arr; 
        } 
       } 
      } 
     }; 

     DOMElement.extend("foo",function(){alert('bar')}); 
     DOMElement.extend("about","DOMElement v0.1") 
     DOMElement.extend("contents",function(){return this.innerHTML}) 
     var elem = document.createElement("div"); 
     elem.foo(); 

     onload = function() 
     { 
      var elem2 = document.getElementById("myDiv"); 
      alert(elem2.about); 

      var divs = document.getElementsByTagName("div"); 
      for(var i=0;i<divs.length;i++) 
       alert(divs[i].contents()) 
     } 

    </script> 
</head> 
<body> 

    <div id="myDiv">hi</div> 
    <div id="div2">there</div> 

</body> 
</html> 

प्रयास करें यह सादर

+3

शैतान 'eval' का प्रयोग न करें !!!!! उदाहरण के लिए, 'eval (" _ elem। "+ Name +" = fn ") के बजाय;' _elem [name] = fn; 'का उपयोग करें – Oriol

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

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