কেন ইন্ডেক্সঅফ একটি অ্যারে IE8 এ কাজ করে না?


294

নীচের ফাংশন অপেরা, ফায়ারফক্স এবং ক্রোমে সূক্ষ্মভাবে কাজ করে। যাইহোক, আই 8 এ এটি 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

আইই 9 এর আগে আই এর সংস্করণগুলিতে .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;
  };
}

এটি ফায়ারফক্স / স্পাইডারমোনকিতে ব্যবহৃত MDN এর সংস্করণ । আই আই এর মতো অন্যান্য .indexOf()ক্ষেত্রে এটি অনুপস্থিত ক্ষেত্রে এটি যুক্ত করবে ... মূলত আইই 8 বা নীচে এই সময়ে।


2
এই সাবধানবাণীটি নোট করুন যে আপনি যদি (বা আপনি ব্যবহার করেন গ্রন্থাগারগুলি) অ্যারে গণনা করার জন্য / ইন সিনট্যাক্স ব্যবহার করেন (উদাহরণস্বরূপ (অ্যারে নেমে আইডেক্স) স্ট্যাম্ট;) যে এই পদ্ধতিটিও গণনা করা হবে। এটি কারণ অন্তর্নির্মিত বৈশিষ্ট্যগুলি জন্য / ইন দ্বারা গণনা করা হয় না তবে ব্যবহারকারী দ্বারা সংজ্ঞায়িত থাকে।
স্পেন ট্রেন

5
@ মাইক - এটি একটি ভিন্ন সমস্যা ... আপনার for...inলুপটি ব্যবহার করা উচিত নয় কোনও অ্যারের পুনরুক্ত , এটি কেবল গণনার জন্য ব্যবহার করা উচিত ।
নিক ক্র্যাভার

3
@ মাইক - আপনি এর জন্য আরও কারণের জন্য একটি অ্যারের মাধ্যমে পুনরাবৃত্তি করুন..আপনার ফলাফলগুলি ব্রাউজারগুলিতে সঠিক ক্রমে পাওয়ার মতো। for..inএকটি অ্যারে ব্যবহার করা কেবল সমস্যা সৃষ্টি করবে, এটি কেবল একটি সম্মেলন নয় ... এটির অনিচ্ছাকৃত ব্যবহার এবং একটি ভুল। অর্ডার এবং কীগুলি উভয়ই সম্পূর্ণ নির্ধারিত নয়, তারা বাস্তবায়ন নির্ভর ... ... উদাহরণস্বরূপ আইই তাদের সূচী দ্বারা নয়, অ্যারে আইটেমগুলিকে তারা যে ক্রমে যুক্ত করা হয়েছিল সেগুলি গণনা করবে । তবে আপনি সূচক দ্বারা অ্যাক্সেস করে সঠিকভাবে পুনরাবৃত্তি করতে পারেন ।
নিক ক্র্যাভার

1
এবং এটি উপাদানগুলি গণনা এবং পুনরাবৃত্তি করতে একটি সূচক ব্যবহার করার মধ্যে পার্থক্য চিত্রিত করে। যে কারণে আমাদের উভয় ধারণা রয়েছে। আপনি একটি লিঙ্কযুক্ত তালিকায় মানগুলি গণনা করতে পারেন, বা আপনি লিঙ্কযুক্ত তালিকার ক্রল করতে পারেন এবং মানগুলি একের পরেরটিতে ফিরিয়ে দিতে পারেন। একটি গাণিতিক ধারণা, একটি হ'ল প্রক্রিয়াগত নির্দেশনা।
jcolebrand

1
হ্যাঁ! এবং যেহেতু অনেকগুলি অনুসন্ধান করছে "কেন ইন্ডেক্সঅফ একটি অ্যারে আইই 8 তে কাজ করে না?" ডাব্লুআরটিটি জেএস-এর থেকে কম পরিশীলিত স্তরে হতে পারে, উত্তরের উত্তম হিসাবে এটি উল্লেখ করা সহায়ক হতে পারে। যদি সবার মধ্যে ইতিমধ্যে বাস্তবায়নগুলির মধ্যে অনুমান এবং পার্থক্য সম্পর্কে গভীর ধারণা থাকে তবে এগুলির মতো থ্রেডের অস্তিত্ব থাকবে না। @ নিক আপনি সঠিকতা সম্পর্কে দৃ strong় অনুমান করেন। অনেকগুলি ক্রিয়াকলাপ রয়েছে যার জন্য অর্ডারটি কোনও বিষয় নয় (উদাহরণস্বরূপ, পার্থক্য নির্ধারণ করুন Also) এছাড়াও, মূল মন্তব্যটি সূচী ক্রমটিতে গণনা করার কোনও উল্লেখ করেনি, কেবলমাত্র / এর জন্য ব্যবহারকারী ডিএফ এফএন এর অন্তর্ভুক্ত রয়েছে।
স্পেন ট্রেন

152

আপনি যদি jQuery ব্যবহার করেন তবে আপনি পরিবর্তে in .inArray () ব্যবহার করতে পারেন ।


7
আমি সম্মত যে এটি আরও দরকারী। এটি জিকুয়েরি ব্যবহারের অন্যতম প্রধান কারণ - ক্রস ব্রাউজারের অসঙ্গতিগুলি হ্রাস করতে এটি অনেক কিছু করে।
cw24

17

আপনি যদি jQuery ব্যবহার করছেন এবং সামঞ্জস্যতা সংক্রান্ত সমস্যা নিয়ে চিন্তা না করে সূচিপত্র ব্যবহার করতে চান, আপনি এটি করতে পারেন:

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

আপনি যখন ব্যবহার চালিয়ে যেতে চান indexOfতবে এটি যখন কার্যকর না হয় তখন একটি ফ্যালব্যাক সরবরাহ করতে এটি সহায়ক ।


হ্যাঁ, সম্ভবত তিনি jQuery include_ (ツ) _ / include অন্তর্ভুক্ত করেননি কারণ এটি বৈধ সিনট্যাক্স।

10

সত্যিকারের পুরো বিশদ বিবরণ এবং কাজের জন্য, কেবলমাত্র ইনডেক্সফের জন্য নয়, আইইয়ের অনুপস্থিত অন্যান্য অ্যারে ফাংশনগুলির জন্যও ইন্টারনেট এক্সপ্লোরারে স্ট্যাকওভারফ্লো প্রশ্নটি ঠিক করে জাভাস্ক্রিপ্ট অ্যারে ফাংশনগুলি পরীক্ষা করে দেখুন (ইনডেক্সফ, ফরএচ ইত্যাদি)


5

আপনি যদি এটি ব্যবহার করতে চান তবে দয়া করে $ .আরএর সাথে সতর্ক হন। আমি সবেমাত্র জানতে পেরেছি যে $ .আরআর কেবল স্ট্রেসের সাথে নয়, "অ্যারে" দিয়ে কাজ করে। এই কারণেই এই ফাংশনটি আইই 8 তে কাজ করবে না!

JQuery এপিআই বিভ্রান্তি তৈরি করে

In .inArray () পদ্ধতিটি জাভাস্ক্রিপ্টের নেটিভ .indexOf () পদ্ধতির মতো যা এটি কোনও ম্যাচ না পেয়ে যখন -1 ফেরায়। অ্যারের মধ্যে প্রথম উপাদানটি মানটির সাথে মিলে গেলে, in .inArray () 0 প্রদান করে

-> তাদের এটি "অনুরূপ" বলা উচিত নয়। যেহেতু সূচিপত্র "স্ট্রিং" সমর্থন করে!


16
এটি বলা হয় inArray। এটি কেবল অ্যারেগুলিতে প্রয়োগ করা বেশ নির্ধারিত বলে মনে হয়। এ কারণেই এটি "অনুরূপ" এবং "অনুরূপ" নয়।
tandrewnichols

ভাল নোট। মজার ঘটনাটি indexOfএকটি স্ট্রিং অবজেক্টের মধ্যে সম্পূর্ণরূপে আইই এর মধ্যে পাওয়া যায়indexOf এবং অ্যারে প্রোটোটাইপটি আইই <= 8. তে পাওয়া যায় না
adi518

আপনি এটি অ্যারে প্রোটোটাইপের সাথে আবদ্ধ করছেন যাতে এটি স্ট্রিংগুলিকে প্রভাবিত করে না।
Kagronick

3

সমস্যাটি

IE <= 8 এ indexOf()অ্যারে করার জন্য কোনও পদ্ধতি নেই।


সমাধান

indexOfআইই <= 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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.