इंटरनेट एक्सप्लोरर (इंडेक्सऑफ, फॉरएच, आदि) में जावास्क्रिप्ट ऐरे कार्यों को ठीक करना [बंद]


137

के रूप में विस्तृत कहीं और , और नहीं तो जाहिरा तौर पर अच्छी तरह से जाना जाता है, इंटरनेट एक्सप्लोरर (निश्चित रूप से संस्करण 7, और कुछ मामलों में, संस्करण 8) पर प्रमुख कार्य, विशेष रूप से लागू नहीं करते Arrayहैं (जैसे forEach, indexOfआदि)।

यहाँ और वहाँ कई वर्कअराउंड हैं, लेकिन मैं अपनी साइट पर कार्यान्वयन का एक उचित, कैनोनिकल सेट को कॉपी और पेस्ट करने के बजाय गुना करना चाहता हूं या अपने स्वयं के कार्यान्वयन पर हैक करना चाहता हूं। मैंने js-methods को पाया है , जो आशाजनक लगता है, लेकिन मैंने सोचा कि मैं यहाँ यह देखने के लिए पोस्ट करूँगा कि क्या कोई और लाइब्रेरी अत्यधिक अनुशंसित है। विविध मानदंडों के एक जोड़े:

  • लाइब्रेरी को केवल उन कार्यों के लिए एक संचालन नहीं होना चाहिए जो एक ब्राउज़र के लिए पहले से ही कार्यान्वयन हैं ( js-methodsयहां काफी अच्छा करने के लिए प्रकट होता है)।
  • गैर- GPL , कृपया, हालांकि LGPL स्वीकार्य है।

जवाबों:


220

कई एमडीसी फॉलबैक कार्यान्वयन का उपयोग करते हैं (उदाहरण के लिए indexOf के लिए )। वे आम तौर पर कड़ाई से मानकों-आज्ञाकारी हैं, यहां तक ​​कि सभी तर्कों के प्रकारों को स्पष्ट रूप से जांचने की सीमा तक।

दुर्भाग्य से, जबकि यह स्पष्ट है कि लेखक इस कोड को तुच्छ और स्वतंत्र रूप से प्रयोग करने योग्य मानते हैं, इसको लिखने में स्पष्ट लाइसेंस-अनुदान नहीं लगता है। एक पूरे के रूप में विकि सीसी एट्रीब्यूशन-शेयरएलाइक है, अगर यह एक स्वीकार्य लाइसेंस है (हालांकि सीसी कोड के लिए डिज़ाइन नहीं किया गया है)।

सामान्य तौर पर js- विधियाँ ठीक लगती हैं, लेकिन कार्य के रूप में होने के किनारों के चारों ओर मानकों के अनुरूप नहीं है (जैसे कि अपरिभाषित सूची आइटम, कार्य जो सूची को म्यूट करते हैं)। यह अन्य यादृच्छिक गैर-मानक तरीकों से भी भरा हुआ है, जिसमें कुछ संदिग्ध लोगों जैसे डोडी स्ट्रिपटैग और अपूर्ण यूटीएफ -8 कोडेक (जो कि थोड़ा अनावश्यक भी है, unescape(encodeURIComponent)ट्रिक दिया गया है ) शामिल हैं।

इसके लायक क्या है, यहां मैं क्या उपयोग करता हूं (जिसे मैं सार्वजनिक डोमेन में जारी करता हूं, अगर इसे सभी के लिए कॉपीराइट योग्य कहा जा सकता है)। यह MDC संस्करणों की तुलना में थोड़ा छोटा है क्योंकि यह टाइप-सूँघने का प्रयास नहीं करता है कि आपने मूर्खतापूर्ण तरीके से कुछ नहीं किया है जैसे कि नॉन-फंक्शन कॉलबैक या नॉन-पूर्णांक इंडेक्स, लेकिन इसके अलावा यह मानक-अनुरूप होने का प्रयास करता है। (मुझे पता है अगर मैं कुछ भी याद किया है; ;-))

'use strict';

// Add ECMA262-5 method binding if not supported natively
//
if (!('bind' in Function.prototype)) {
    Function.prototype.bind= function(owner) {
        var that= this;
        if (arguments.length<=1) {
            return function() {
                return that.apply(owner, arguments);
            };
        } else {
            var args= Array.prototype.slice.call(arguments, 1);
            return function() {
                return that.apply(owner, arguments.length===0? args : args.concat(Array.prototype.slice.call(arguments)));
            };
        }
    };
}

// Add ECMA262-5 string trim if not supported natively
//
if (!('trim' in String.prototype)) {
    String.prototype.trim= function() {
        return this.replace(/^\s+/, '').replace(/\s+$/, '');
    };
}

// Add ECMA262-5 Array methods if not supported natively
//
if (!('indexOf' in Array.prototype)) {
    Array.prototype.indexOf= function(find, i /*opt*/) {
        if (i===undefined) i= 0;
        if (i<0) i+= this.length;
        if (i<0) i= 0;
        for (var n= this.length; i<n; i++)
            if (i in this && this[i]===find)
                return i;
        return -1;
    };
}
if (!('lastIndexOf' in Array.prototype)) {
    Array.prototype.lastIndexOf= function(find, i /*opt*/) {
        if (i===undefined) i= this.length-1;
        if (i<0) i+= this.length;
        if (i>this.length-1) i= this.length-1;
        for (i++; i-->0;) /* i++ because from-argument is sadly inclusive */
            if (i in this && this[i]===find)
                return i;
        return -1;
    };
}
if (!('forEach' in Array.prototype)) {
    Array.prototype.forEach= function(action, that /*opt*/) {
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this)
                action.call(that, this[i], i, this);
    };
}
if (!('map' in Array.prototype)) {
    Array.prototype.map= function(mapper, that /*opt*/) {
        var other= new Array(this.length);
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this)
                other[i]= mapper.call(that, this[i], i, this);
        return other;
    };
}
if (!('filter' in Array.prototype)) {
    Array.prototype.filter= function(filter, that /*opt*/) {
        var other= [], v;
        for (var i=0, n= this.length; i<n; i++)
            if (i in this && filter.call(that, v= this[i], i, this))
                other.push(v);
        return other;
    };
}
if (!('every' in Array.prototype)) {
    Array.prototype.every= function(tester, that /*opt*/) {
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this && !tester.call(that, this[i], i, this))
                return false;
        return true;
    };
}
if (!('some' in Array.prototype)) {
    Array.prototype.some= function(tester, that /*opt*/) {
        for (var i= 0, n= this.length; i<n; i++)
            if (i in this && tester.call(that, this[i], i, this))
                return true;
        return false;
    };
}

अन्य ECMA262-5 तरीकों को यहां लागू नहीं किया गया है, जिनमें Array reduce/ reduceRight, JSON वाले और कुछ नए Objectतरीके शामिल हैं जिन्हें JS कार्यों के रूप में मज़बूती से लागू किया जा सकता है।


5
उस पॉइंटर के लिए धन्यवाद - अन्य लिंक जो मैंने mozdev में देखे हैं, जहां ऐसे इम्प्लांट मिल सकते हैं, बासी थे। FYI करें, कोड
MIT-

1
दिलचस्प है, अगर मैं एक js फ़ाइल का संदर्भ लेता हूं जिसमें MDC ECMA262-5 सभी शामिल हैं, जो कि jquery 1.4.2 से पहले निकलता है, तो jquery टूट जाती है - जैसे कि सभी चयनकर्ता विफल हो जाते हैं, वापस लौटते हैं। Jquery के बाद अपेक्षित व्यवहार की ओर बढ़ने के कारण MDC को स्थानांतरित करना। बहुत अजीब।
cemerick

यही कारण है कि है उत्सुक! उस पर गौर करेंगे (क्या आपके पास परीक्षण का मामला है?) ... मैं तुरंत नहीं सोच सकता कि ऐसा क्यों हो सकता है, हालांकि लाइन 72 पर jQuery को क्या संदेह है।
bobince

4
नोट: अधिकांश ब्राउज़रों में जहां इन स्टब्स की आवश्यकता होती है, यदि आप "(किसी दिन इंडेक्स में) {...}" करते हैं, तो आपको चेक के रूप में somearray.hasOwnProperty (इंडेक्स) का उपयोग करने की आवश्यकता होगी। IE <= 8 के JS इंजन में इसमें array.prototype एक्सटेंशन शामिल होंगे। Google ऐडवर्ड्स async कोड ऐसा नहीं करता है। अंडरस्कोर, या किसी अन्य लाइब्रेरी की कार्यक्षमता का उपयोग करने के लिए सबसे अच्छा है जो इस पर मानकीकृत है।
ट्रैकर 1

1
यह IE 8 के लिए सबसे तेज़ इंडेक्सऑफ़ () कार्यान्वयन है जो मुझे मिल सकता है। धन्यवाद!
एलेक्स डेनिसेंको

27

Underscore.js पर एक नज़र डालें ।


2
ES5Shim और अन्य स्टब्स (MDC की तरह) से अन्य परिणाम भी होते हैं। इस प्रकार के कार्यों के लिए अंडरस्कोर या किसी अन्य लाइब्रेरी का उपयोग करना सबसे अच्छा है, जो कि जहां उपलब्ध है वहां आंतरिक तरीकों का उपयोग करेगा।
ट्रैकर 1

Underscore.js var arrest = ['a', 'a1', 'b'] _.filter (arr, function, (a) {रिटर्न a.indexOf ('a'> -1);})
sri_bb

9

क्रिश कोवल ने एक छोटी सी लाइब्रेरी तैयार की है जो ECMAScript 5 कार्यों के लिए एक शिम का काम करती है जो ब्राउज़र के कार्यान्वयन से गायब हो सकता है। कुछ कार्यों को अन्य लोगों द्वारा गति के लिए अनुकूलित करने और ब्राउज़र बग्स के आसपास काम करने के लिए कई बार संशोधित किया गया है। कार्यों को विनिर्देश का अनुसरण करने के लिए लिखा जाता है जितना संभव हो सके।

es5-shim.js को MIT लाइसेंस के तहत जारी किया गया था, Array.prototype एक्सटेंशन शीर्ष के पास हैं और आप उन कार्यों को काट और हटा सकते हैं जिनकी आपको बहुत आसानी से आवश्यकता नहीं है। मैं यह भी सुझाव देता हूं कि आप स्क्रिप्ट को छोटा करें क्योंकि टिप्पणियां इसे जितना बड़ा होना चाहिए उतना बड़ा बनाती हैं।


1

'प्रमुख कार्यों को लागू नहीं करने से' वास्तव में आप का अर्थ है 'ECMA 262 3'rd ed' के अनुरूप? :)

आपके द्वारा बताए जा रहे तरीके नए 5'th संस्करण का हिस्सा हैं - इसका समर्थन नहीं करने वाले ब्राउज़रों के लिए आप निम्न 'शिम' का उपयोग कर सकते हैं जो 3'rd को 5'th http://github.com/kriskowal/narwhal- में विस्तारित करता है lib / ब्लॉब / नाउल-lib / lib / वैश्विक-es5.js


1
यह एक अच्छी शुरुआत है, लेकिन एमडीसी से नहीं लिए गए कार्यान्वयन में काफी कुछ त्रुटियां हैं। जैसे। सरणी विधियों में से कई उनके कॉलबैक में पर्याप्त तर्क पारित नहीं करती हैं, और कॉलबैक फ़ंक्शन में सरणी उत्परिवर्तन के मामले में काफी सही कार्य नहीं करती हैं।
bobince

मैं js को एक अधिक समझदार / न्यूनतम-सक्षम भाषा बनाने के लिए जो कुछ भी प्राप्त कर सकता हूं, ले लूंगा। </
स्नार्क

1

वे स्क्रिप्ट मेरे परीक्षणों में अच्छी तरह से काम नहीं करती हैं। मैं एमडीएन दस्तावेजों के आधार पर एक ही कार्य करता हूं ।

Internet Explorer 8 में बहुत अधिक समस्याएं हल की गई हैं। उदाहरण के लिए कोड को देखें ।


0

अंडरस्कोर के साथ। js

var arr=['a','a1','b'] _.filter(arr, function(a){ return a.indexOf('a') > -1; })

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.