-4

My 3000 lines of code execute just fine in chrome and Firefox with zero errors reported.

However, in IE11 (where the code MUST run), I get an error saying that the method ‘from’ is not supported at the following line:

var inputsArray = Array.from(document.querySelectorAll('input.input' + b));

How can I resolve this?

The HTML file contains the correct compatibility mode for edge so that’s not the issue.

Sweepster
  • 1,829
  • 4
  • 27
  • 66
  • 3
    You can try adding `Polyfill` https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from – Eddie May 23 '19 at 14:19
  • 2
    `var inputsArray = Array.prototype.slice.call(document.querySelectorAll('input.input' + b));` – Patrick Roberts May 23 '19 at 14:19
  • 1
    This really isn't a question for Stack Overflow. IE 11 stopped getting updates years ago and doesn't support any of the new ECMAScript APIs. You could have just Googled this. – Scott Marcus May 23 '19 at 14:21
  • @ScottMarcus Iagree with you. still I got hundreds of clients that still require us to deliver IE11 compatible sites. – CodeHacker May 23 '19 at 14:23
  • 2
    @CodeHacker That has nothing to do with what kinds of questions are appropriate for Stack Overflow. The issue is real, but Stack Overflow isn't for any old question you may have. We expect that you'll do research before posting and a simple Google search on this would have provided the answer. – Scott Marcus May 23 '19 at 14:25
  • @ScottMarcus I’m not an idiot. I did do a google search and found NOTHING relating to this specific issue, only other methods and IE11 still gets updates and is supported until 2025. – Sweepster May 23 '19 at 15:49
  • Also, the related question box doesn’t show up on iOS so I had no way of identifying “already answered” questions. – Sweepster May 23 '19 at 15:51
  • @Sweepster No one called you anything, so please calm down. IE 11 has not and will not be updated to support new ECMAScript standards. You are most-likely referring to security and platform updates, not capabilities. And, a Google search for ["Array.from alternatives in IE11"](https://www.google.com/search?q=Array.from+alternative+in+IE+11&rlz=1C1GCEU_enUS839US839&oq=Array.from+alternative+in+IE+11&aqs=chrome..69i57j33.7473j0j7&sourceid=chrome&ie=UTF-8) turns up the answer (already posted here on SO). – Scott Marcus May 23 '19 at 16:03
  • Okay but lecturing me about IE11 doesn’t change the fact that the code must function in IE11. I can’t force the work environment to change. I googled “IE11 does not support method ‘from’” and got no results, yet lo and behold this very question shows up as the very first result. The same results do not appear for all users around the world so to fault the user for not finding an answer puts a huge assumption on google working the same for everyone, which is not the case. – Sweepster May 23 '19 at 16:51

2 Answers2

1

Short answer

Use a polyfill. Mozilla provide one on the Array.from page.

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

Further help

Other good sites to use are to check whether functionality is available in specific browser versions.

steadweb
  • 15,364
  • 3
  • 33
  • 47
1

The Array​.from method does not work at all in IE. Check the MDN page for compatibility.

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

You can use the polyfill to make it work:

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

From the documentation:

Array.from was added to the ECMA-262 standard in the 6th edition (ES2015); as such it may not be present in other implementations of the standard. You can work around this by inserting the following code at the beginning of your scripts, allowing use of Array.from in implementations that don't natively support it. This algorithm is exactly the one specified in ECMA-262, 6th edition, assuming Object and TypeError have their original values and that callback.call evaluates to the original value of Function.prototype.call. In addition, since true iterables can not be polyfilled, this implementation does not support generic iterables as defined in the 6th edition of ECMA-262.

Here is the suggested polyfill from the documentation:

// Production steps of ECMA-262, Edition 6, 22.1.2.1
if (!Array.from) {
  Array.from = (function() {
    var toStr = Object.prototype.toString;
    var isCallable = function(fn) {
      return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
    };
    var toInteger = function(value) {
      var number = Number(value);
      if (isNaN(number)) {
        return 0;
      }
      if (number === 0 || !isFinite(number)) {
        return number;
      }
      return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
    };
    var maxSafeInteger = Math.pow(2, 53) - 1;
    var toLength = function(value) {
      var len = toInteger(value);
      return Math.min(Math.max(len, 0), maxSafeInteger);
    };

    // The length property of the from method is 1.
    return function from(arrayLike /*, mapFn, thisArg */ ) {
      // 1. Let C be the this value.
      var C = this;

      // 2. Let items be ToObject(arrayLike).
      var items = Object(arrayLike);

      // 3. ReturnIfAbrupt(items).
      if (arrayLike == null) {
        throw new TypeError('Array.from requires an array-like object - not null or undefined');
      }

      // 4. If mapfn is undefined, then let mapping be false.
      var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
      var T;
      if (typeof mapFn !== 'undefined') {
        // 5. else
        // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
        if (!isCallable(mapFn)) {
          throw new TypeError('Array.from: when provided, the second argument must be a function');
        }

        // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
        if (arguments.length > 2) {
          T = arguments[2];
        }
      }

      // 10. Let lenValue be Get(items, "length").
      // 11. Let len be ToLength(lenValue).
      var len = toLength(items.length);

      // 13. If IsConstructor(C) is true, then
      // 13. a. Let A be the result of calling the [[Construct]] internal method 
      // of C with an argument list containing the single item len.
      // 14. a. Else, Let A be ArrayCreate(len).
      var A = isCallable(C) ? Object(new C(len)) : new Array(len);

      // 16. Let k be 0.
      var k = 0;
      // 17. Repeat, while k < len… (also steps a - h)
      var kValue;
      while (k < len) {
        kValue = items[k];
        if (mapFn) {
          A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
        } else {
          A[k] = kValue;
        }
        k += 1;
      }
      // 18. Let putStatus be Put(A, "length", len, true).
      A.length = len;
      // 20. Return A.
      return A;
    };
  }());
}
Mr. Polywhirl
  • 42,981
  • 12
  • 84
  • 132