क्यों सूचकांकOf एक सरणी IE8 पर काम नहीं करता है?


294

नीचे दिया गया कार्य ओपेरा, फ़ायरफ़ॉक्स और क्रोम पर ठीक काम करता है। हालाँकि, IE8 में यह if ( allowed.indexOf(ext[1]) == -1)भाग पर विफल रहता है ।

क्या किसी को पता है क्यों? क्या कोई स्पष्ट गलती है?

function CheckMe() {
    var allowed = new Array('docx','xls','xlsx', 'mp3', 'mp4', '3gp', 'sis', 'sisx', 'mp3', 'wav', 'mid', 'amr', 'jpg', 'gif', 'png', 'jpeg', 'txt', 'pdf', 'doc', 'rtf', 'thm', 'rar', 'zip', 'htm', 'html', 'css', 'swf', 'jar', 'nth', 'aac', 'cab', 'wgz');
    var fileinput=document.getElementById('f');
    var ext = fileinput.value.toLowerCase().split('.');
    if ( allowed.indexOf(ext[1]) == -1) 
    {
        document.getElementById('uploadsec').innerHTML = document.getElementById('uploadsec').innerHTML;
        alert('This file type is not allowed!');
    }
}

5
बढ़िया सवाल, बढ़िया जवाब। मुझे वही देने के लिए धन्यवाद जो मुझे चाहिए था।
हार्डवेयरगुए

जवाबों:


488

IE9 से पहले IE के संस्करणों में .indexOf()ऐरे के लिए कोई फ़ंक्शन नहीं है , सटीक कल्पना संस्करण को परिभाषित करने के लिए, इसका उपयोग करने की कोशिश करने से पहले इसे चलाएं:

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

यह एमडीएन से संस्करण है , जिसका उपयोग फ़ायरफ़ॉक्स / स्पाइडरमोंकी में किया जाता है। IE जैसे अन्य मामलों में, यह .indexOf()उस मामले में जोड़ देगा जो यह गायब है ... मूल रूप से IE8 या इस बिंदु पर नीचे।


2
इस चेतावनी पर ध्यान दें कि यदि आप (या पुस्तकालयों का उपयोग करते हैं) / के लिए वाक्यविन्यास में / का उपयोग कर एंउंटरेट एंज़ेट (उदा। के लिए (arrayname में) stmt;) है कि इस विधि के रूप में अच्छी तरह से enumerated किया जाएगा। इसका कारण यह है कि अंतर्निहित गुण / के लिए उपयोगकर्ता द्वारा परिभाषित नहीं हैं, लेकिन हैं।
स्पेन ट्रेन

5
@ माइक - यह एक अलग समस्या है ... आपको किसी सरणी for...inको पुनरावृत्त करने के लिए लूप का उपयोग नहीं करना चाहिए , इसका उपयोग केवल एन्यूमरेशन के लिए किया जाना चाहिए ।
निक Craver

3
@ माइक - आप इसके लिए अधिक कारणों के लिए एक सरणी पर पुनरावृति करते हैं..जैसे कि आपके परिणाम ब्राउज़रों में सही क्रम में हो। for..inकिसी सरणी पर उपयोग करने से केवल समस्याएँ पैदा होंगी, यह केवल एक कन्वेंशन नहीं है..यह अनपेक्षित उपयोग और एक गलत है। आदेश और चाबी दोनों पूरी तरह से निर्दिष्ट नहीं हैं, वे कार्यान्वयन निर्भर ... उदाहरण के लिए आईई जाएगा गणना के क्रम में सरणी आइटम वे थे जोड़ा , उनकी सूचकांक द्वारा नहीं। हालाँकि, आप अनुक्रमणिका द्वारा सही ढंग से पुनरावृति कर सकते हैं ।
निक Craver

1
और जो तत्वों की गणना करने और एक सूचकांक का उपयोग करने के बीच अंतर को दिखाता है। यही कारण है कि हमारे पास दोनों अवधारणाएं हैं। आप किसी लिंक की गई सूची में मानों की गणना कर सकते हैं, या आप लिंक की गई सूची को क्रॉल कर सकते हैं और मानों को एक से दूसरे पर लौटा सकते हैं। एक एक गणितीय अवधारणा है, एक एक प्रक्रियात्मक निर्देश है।
jcolebrand

1
@ पॉइन्टी हाँ! और जब से कई खोज "क्यों IEO सरणी सरणी IE8 पर काम नहीं करता है?" निचले परिष्कार स्तर पर WRT से js तक हो सकता है, यह उत्तर के लिए एक कोरोलरी के रूप में इंगित करने के लिए सहायक हो सकता है। अगर सभी को पहले से ही कल्पना और कार्यान्वयन के बीच मतभेदों की गहरी समझ थी, तो थ्रेड जैसे कि ये मौजूद नहीं होंगे। @ आप शुद्धता के बारे में मजबूत धारणा बनाते हैं। ऐसे कई ऑपरेशन हैं जिनके लिए ऑर्डर मायने नहीं रखता (उदाहरण के लिए सेट अंतर।) इसके अलावा, मूल टिप्पणी में इंडेक्स अनुक्रम में गणना करने का कोई उल्लेख नहीं किया गया है, बस इसके लिए / में उपयोगकर्ता डीईएन fn शामिल हैं।
स्पेन ट्रेन

152

यदि आप jQuery का उपयोग कर रहे हैं, तो आप इसके बजाय $ .inArray () का उपयोग कर सकते हैं ।


7
मैं मानता हूं कि यह अधिक उपयोगी है। यह JQuery का उपयोग करने के मुख्य कारणों में से एक है - यह क्रॉस ब्राउज़र असंगतताओं को कम करने के लिए बहुत कुछ करता है।
cw24

17

यदि आप jQuery का उपयोग कर रहे हैं और संगतता समस्याओं के बारे में चिंता किए बिना indexOf का उपयोग करना चाहते हैं, तो आप यह कर सकते हैं:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(val) {
        return jQuery.inArray(val, this);
    };
}

यह तब मददगार होता है जब आप इसका उपयोग indexOfकरते रहना चाहते हैं लेकिन जब यह उपलब्ध नहीं होता है तो एक वापसी प्रदान करते हैं।


हां, शायद इसलिए कि उन्होंने jQuery ¯_ (_) _ / j को शामिल नहीं किया है यह वैध वाक्यविन्यास है।

10

वास्तव में पूरी तरह से स्पष्टीकरण और समाधान के लिए, न केवल indexOf के लिए, बल्कि IE में अनुपलब्ध अन्य सरणी फ़ंक्शन StackOverflow प्रश्न को इंटरनेट एक्सप्लोरर (indexOf, forEach, आदि) में जावास्क्रिप्ट ऐरे फ़ंक्शन को ठीक करता है।


5

यदि आप इसका उपयोग करना चाहते हैं तो कृपया $ .inArray से सावधान रहें। मुझे अभी पता चला है कि $ .inArray केवल "ऐरे" के साथ काम करता है, स्ट्रिंग के साथ नहीं। इसलिए यह फ़ंक्शन IE8 में काम नहीं करेगा!

JQuery एपीआई भ्रम पैदा करता है

$ .InArray () विधि JavaScript के मूल .indexOf () पद्धति के समान है जिसमें यह -1 मिलता है जब यह एक मैच नहीं मिलता है। यदि सरणी में पहला तत्व मान से मेल खाता है, तो .inArray () रिटर्न 0 है

-> वे इसे "समान" नहीं कहना चाहिए। चूंकि IndexOf "स्ट्रिंग" का भी समर्थन करता है!


16
इसे कहते हैं inArray। यह काफी निश्चित रूप से केवल सरणियों पर लागू होता है। इसलिए यह "समान" है और "समान" नहीं है।
tandrewnichols

अच्छा नोट है। अजीब तथ्य indexOfएक स्ट्रिंग वस्तु में पूरी तरह से IE में पाया जाता है, जबकि indexOfऐरे प्रोटोटाइप में IE <= 8. में नहीं पाया जाता है
adi518

आप इसे सरणी प्रोटोटाइप से जोड़ रहे हैं ताकि इसके तार प्रभावित न हों।
काग्रोनिक

3

समस्या

IE <= 8 में केवल indexOf()सरणियों के लिए एक विधि नहीं है ।


समाधान

यदि आपको indexOfIE <= 8 में आवश्यकता है, तो आपको निम्नलिखित पॉलीफ़िल का उपयोग करने पर विचार करना चाहिए , जो एमडीएन में अनुशंसित है :

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(searchElement, fromIndex) {
        var k;
        if (this == null) {
            throw new TypeError('"this" is null or not defined');
        }
        var o = Object(this);
        var len = o.length >>> 0;
        if (len === 0) {
            return -1;
        }
        var n = +fromIndex || 0;
        if (Math.abs(n) === Infinity) {
            n = 0;
        }
        if (n >= len) {
            return -1;
        }
        k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
        while (k < len) {
            if (k in o && o[k] === searchElement) {
                return k;
            }
            k++;
        }
        return -1;
    };
}

न्यूनतम:

Array.prototype.indexOf||(Array.prototype.indexOf=function(r,t){var n;if(null==this)throw new TypeError('"this" is null or not defined');var e=Object(this),i=e.length>>>0;if(0===i)return-1;var a=+t||0;if(Math.abs(a)===1/0&&(a=0),a>=i)return-1;for(n=Math.max(a>=0?a:i-Math.abs(a),0);i>n;){if(n in e&&e[n]===r)return n;n++}return-1});

1

यदि यह मौजूद नहीं है तो आप फ़ंक्शन को बदलने के लिए इसका उपयोग कर सकते हैं:

<script>
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(elt /*, from*/) {
        var len = this.length >>> 0;

        var from = Number(arguments[1]) || 0;
        from = (from < 0) ? Math.ceil(from) : Math.floor(from);
        if (from < 0)
            from += len;

        for (; from < len; from++) {
            if (from in this && this[from] === elt)
                return from;
        }
        return -1;
    };
}
</script>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.