JavaScript endsWith is not working in IEv10?
Asked Answered
I

4

17

I'm trying to compare two strings in JavaScript using endsWith(), like

var isValid = string1.endsWith(string2);

It's working fine in Google Chrome and Mozilla. When comes to IE it's throwing a console error as follows

SCRIPT438: Object doesn't support property or method 'endsWith' 

How can I resolve it?

Influx answered 31/5, 2016 at 11:24 Comment(0)
N
22

Method endsWith() not supported in IE. Check browser compatibility here.

You can use polyfill option taken from MDN documentation:

if (!String.prototype.endsWith) {
  String.prototype.endsWith = function(searchString, position) {
      var subjectString = this.toString();
      if (typeof position !== 'number' || !isFinite(position) 
          || Math.floor(position) !== position || position > subjectString.length) {
        position = subjectString.length;
      }
      position -= searchString.length;
      var lastIndex = subjectString.indexOf(searchString, position);
      return lastIndex !== -1 && lastIndex === position;
  };
}
Nonah answered 31/5, 2016 at 11:25 Comment(2)
It helps to know that this script can be placed anywhere. Ideally it is loaded as the page loads too so that it is made available to all other functionsCopeland
Find the simplified answer here #37544876Influx
I
18

I found the simplest answer,

All you need do is to define the prototype

 if (!String.prototype.endsWith) {
   String.prototype.endsWith = function(suffix) {
     return this.indexOf(suffix, this.length - suffix.length) !== -1;
   };
 }
Influx answered 31/5, 2016 at 11:53 Comment(1)
Kudos. Anyway, I think string.indexOf(suffix, string.length - suffix.length) !== -1; is sufficient, since altering the prototype is a bad ideaOutlet
V
2

It's generally bad practise to extend the prototype of a native JavaScript object. See here - Why is extending native objects a bad practice?

You can use a simple check like this that will work cross-browser:

var isValid = (string1.lastIndexOf(string2) == (string1.length - string2.length))
Vouge answered 5/5, 2017 at 3:48 Comment(0)
H
0

Reaction on an old issue: Elaborating on alternative for endsWith() in IE11.

To avoid that string1 = "a", string2 = "bc"; would return true:

var isValid = (string1.lastIndexOf(string2) == (string1.length - string2.length) && string1.lastIndexOf(string2) >= 0);
Hodges answered 4/9, 2019 at 12:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.