"Об'єкт не підтримує властивість або метод" знайти "" в IE


78
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

    <script>

        $(document).ready(function () {


            var data = [{
                "Id": "SWE",
                "Country": "Sweden",
                "Population": 9592552
            }, {
                "Id": "NOR",
                "Country": "Norway",
                "Population": 5084190
            }];


            function display(e) {
                alert("E" + e);
                var countryData = data.find(function (element, index, array) {
                    return element.Id === e;
                });
                alert(countryData.Population);
            }
            display('SWE');


        });


    </script>
</head>
</html>

Опублікований вище код працює належним чином у Firefox та Chrome, але я отримую повідомлення про помилку в Internet Explorer. Повідомлення про помилку:

Об'єкт не підтримує властивість або метод "знайти"


З якою версією IE ви тестуєте? Крім того, це в стандартному режимі, режимі сумісності чи примхах?
Сімба

привіт @Simba, я використовую версію IE 11.0.9660.18321
GOPAL YADAV

для перевірки того, які браузери підтримують які функції, caniuse.com дуже корисний, лише для подальшого використання.
Рейчел Галлен

Відповіді:


50

Ось робота навколо. Ви можете використовувати фільтр замість пошуку; але фільтр повертає масив відповідних об'єктів. findповертає лише перший збіг всередині масиву. Отже, чому б не використовувати фільтр наступним чином;

data.filter(function (x) {
         return x.Id === e
    })[0];

3
Нещодавно зіткнувся з цією проблемою у проекті, і загальним консенсусом було використання @ babel / polyfill. Пройшовши цей шлях і виявивши, поліфіл насправді створив кілька дивних помилок, тому нам довелося його витягнути. Однак це рішення, будучи цілеспрямованим, вирішило проблему без будь-яких побічних ефектів. Просто, чисто, прямо до справи. Дякую!
Девід Васкес,

4
Найпростіша, найчистіша, рівноцінна робота для тих, хто повинен залишатися сумісним з IE11, дякую!
Марк Сіго,

1
основна різниця між функціями filter () та find () - це filter () пройти весь масив і find () лише для першого появи. Це обхідне рішення може спричинити деякі проблеми з продуктивністю.
Філіп Ковач,

43

Як уже згадувалося array.find(), IE не підтримує.

Однак ви можете прочитати про Polyfill тут:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find#Polyfill

Цей метод був доданий до специфікації ECMAScript 2015 і, можливо, ще не доступний у всіх реалізаціях JavaScript. Однак ви можете заповнити Array.prototype.find наступним фрагментом:

Код:

// https://tc39.github.io/ecma262/#sec-array.prototype.find
if (!Array.prototype.find) {
  Object.defineProperty(Array.prototype, 'find', {
    value: function(predicate) {
     // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If IsCallable(predicate) is false, throw a TypeError exception.
      if (typeof predicate !== 'function') {
        throw new TypeError('predicate must be a function');
      }

      // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
      var thisArg = arguments[1];

      // 5. Let k be 0.
      var k = 0;

      // 6. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kValue be ? Get(O, Pk).
        // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. If testResult is true, return kValue.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return kValue;
        }
        // e. Increase k by 1.
        k++;
      }

      // 7. Return undefined.
      return undefined;
    }
  });
}

40

Ви використовуєте array.find()метод JavaScript . Зверніть увагу, що це стандартний JS і не має нічого спільного з jQuery. Насправді весь ваш код у питанні взагалі не використовує jQuery.

Ви можете знайти документацію array.find()тут: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find

Якщо ви прокрутите внизу цієї сторінки, ви помітите, що вона містить інформацію про підтримку браузера, і ви побачите, що в ній зазначено, що IE не підтримує цей метод.

Як не дивно, найкращим способом цього буде використання jQuery, який має подібні функції, які підтримуються у всіх браузерах.


Друга альтернатива - прокрутити свій власний цикл for, якщо з якихось незрозумілих причин вам не дозволено використовувати jQuery
Стефан,

22
Або просто зробітьarray.filter()[0]
Рок Бургар

4
lol'd на "Як не дивно, найкращим способом обійти це використання jQuery" :)
Іван Дурст,

33

Array.prototype.find не підтримується в жодній версії IE

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find


9
І на сторінці є корисний
поліфіл

1
Polyfill просто прекрасно працює, він перевіряє , якщо prototype.find не визначений, а потім він визначає властивість до Array.prototype: Object.defineProperty (Array.prototype, «знайти», {Дякую!
Лео

5

Я вирішив ту ж проблему, додавши поліфіл наступним чином:

<script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=default,Array.prototype.includes,Array.prototype.find"></script>

Поліфіл - це шматок коду (як правило, JavaScript в Інтернеті), який використовується для забезпечення сучасних функціональних можливостей у старих браузерах, які не підтримують його.

Сподіваюся, хтось вважає це корисним.



-7

Підтримка Array.findметодів для браузерів Microsoft розпочалася з Edge .

У таблиці сумісності W3Schools зазначено, що підтримка розпочалася з версії 12, тоді як таблиця сумісності Can I Use говорить, що підтримка була невідомою між версіями 12 і 14, оскільки офіційно підтримується, починаючи з версії 15.


14
IE12 не існує. Браузер, на який ви дивитесь із синім логотипом "e", тепер називається Edge і значно відрізняється від свого попередника IE.
Сімба
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.