ie-compatibility.js

">

JavaScript - Compatibility with Internet Explorer

2012/12/30

There is a few javascript functions that are very useful but are not implemented on IE: Function.bind, String.trim, Array.indexOf, Array.lastIndexOf and a few more...

I found an script on stackoverflow (lost the link) that tests it those functions exists and, if it doesn't, implement them. Also, as I use console.log for debugging, IE kept claiming console.log doesn't exists, so I added that too (dummy version, just to stop it from complaining).

Here is the script: ie-compatibility.js


 1 'use strict';

 2 

 3 // Add ECMA262-5 method binding if not supported natively

 4 //

 5 if (!('bind' in Function.prototype)) {

 6     Function.prototype.bind= function(owner) {

 7         var that= this;

 8         if (arguments.length<=1) {

 9             return function() {

10                 return that.apply(owner, arguments);

11             };

12         } else {

13             var args= Array.prototype.slice.call(arguments, 1);

14             return function() {

15                 return that.apply(owner, arguments.length===0?

16                     args : args.concat(Array.prototype.slice.call(arguments)));

17             };

18         }

19     };

20 }

21 

22 // Add ECMA262-5 string trim if not supported natively

23 //

24 if (!('trim' in String.prototype)) {

25     String.prototype.trim= function() {

26         return this.replace(/^\s+/, '').replace(/\s+$/, '');

27     };

28 }

29 

30 // Add ECMA262-5 Array methods if not supported natively

31 //

32 if (!('indexOf' in Array.prototype)) {

33     Array.prototype.indexOf= function(find, i) {

34         if (i===undefined) i= 0;

35         if (i<0) i+= this.length;

36         if (i<0) i= 0;

37         for (var n= this.length; i<n; i++)

38             if (i in this && this[i]===find)

39                 return i;

40         return -1;

41     };

42 }

43 if (!('lastIndexOf' in Array.prototype)) {

44     Array.prototype.lastIndexOf= function(find, i) {

45         if (i===undefined) i= this.length-1;

46         if (i<0) i+= this.length;

47         if (i>this.length-1) i= this.length-1;

48         for (i++; i-->0;) 

49             if (i in this && this[i]===find)

50                 return i;

51         return -1;

52     };

53 }

56         for (var i= 0, n= this.length; i<n; i++)

57             if (i in this)

58                 action.call(that, this[i], i, this);

59     };

60 }

61 if (!('map' in Array.prototype)) {

62     Array.prototype.map= function(mapper, that) {

63         var other= new Array(this.length);

64         for (var i= 0, n= this.length; i<n; i++)

65             if (i in this)

66                 other[i]= mapper.call(that, this[i], i, this);

67         return other;

68     };

69 }

70 if (!('filter' in Array.prototype)) {

71     Array.prototype.filter= function(filter, that) {

72         var other= [], v;

73         for (var i=0, n= this.length; i<n; i++)

74             if (i in this && filter.call(that, v= this[i], i, this))

75                 other.push(v);

76         return other;

77     };

78 }

79 if (!('every' in Array.prototype)) {

80     Array.prototype.every= function(tester, that) {

81         for (var i= 0, n= this.length; i<n; i++)

82             if (i in this && !tester.call(that, this[i], i, this))

83                 return false;

84         return true;

85     };

86 }

87 if (!('some' in Array.prototype)) {

88     Array.prototype.some= function(tester, that) {

89         for (var i= 0, n= this.length; i<n; i++)

90             if (i in this && tester.call(that, this[i], i, this))

91                 return true;

92         return false;

93     };

94 }

95 

96 if (!('console' in window)) {

97     window.console = function() {};

98     window.console.log = function() {};

99 }

Toggle Menu
comments powered by Disqus