【问题标题】:padStart() not working in IE11padStart() 在 IE11 中不起作用
【发布时间】:2019-01-14 02:48:48
【问题描述】:

我正在使用 angularjs 1.7.2 和 kendo ui scheduler。除了 IE 11 中的 padStart() 部分外,几乎所有浏览器中的所有路由都运行良好。 当使用 padStart 代码时,会出现此错误

TypeError:对象不支持属性或方法“padStart”

let ret = '#' + ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0');

有没有办法我们可以处理这个问题或实现 padStart

的替代方法

【问题讨论】:

    标签: javascript angularjs cross-browser internet-explorer-11


    【解决方案1】:

    IE 11 不支持此功能。请看这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart#Browser_compatibility

    您正在寻找的是填补浏览器缺失功能的 polyfill。 以下代码也取自 developer.mozilla.org 将对您有所帮助:

    // https://github.com/behnammodi/polyfill/blob/master/string.polyfill.js
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
    if (!String.prototype.padStart) {
        String.prototype.padStart = function padStart(targetLength,padString) {
            targetLength = targetLength>>0; //truncate if number or convert non-number to 0;
            padString = String((typeof padString !== 'undefined' ? padString : ' '));
            if (this.length > targetLength) {
                return String(this);
            }
            else {
                targetLength = targetLength-this.length;
                if (targetLength > padString.length) {
                    padString += padString.repeat(targetLength/padString.length); //append to original to ensure we are longer than needed
                }
                return padString.slice(0,targetLength) + String(this);
            }
        };
    }
    

    编辑:正如 @Plaute 在 cmets 中提到的,函数 repeat 也需要被填充,可以在这里找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

    或者包括这个sn-p:

    if (!String.prototype.repeat) {
      String.prototype.repeat = function(count) {
        'use strict';
        if (this == null) {
          throw new TypeError('can\'t convert ' + this + ' to object');
        }
        var str = '' + this;
        count = +count;
        if (count != count) {
          count = 0;
        }
        if (count < 0) {
          throw new RangeError('repeat count must be non-negative');
        }
        if (count == Infinity) {
          throw new RangeError('repeat count must be less than infinity');
        }
        count = Math.floor(count);
        if (str.length == 0 || count == 0) {
          return '';
        }
        // Ensuring count is a 31-bit integer allows us to heavily optimize the
        // main part. But anyway, most current (August 2014) browsers can't handle
        // strings 1 << 28 chars or longer, so:
        if (str.length * count >= 1 << 28) {
          throw new RangeError('repeat count must not overflow maximum string size');
        }
        var maxCount = str.length * count;
        count = Math.floor(Math.log(count) / Math.log(2));
        while (count) {
           str += str;
           count--;
        }
        str += str.substring(0, maxCount - str.length);
        return str;
      }
    }
    

    或者,要解决 String.prototype.repeat 依赖项,请使用以下行:

    padString += Array.apply(null, Array(targetLength)).map(function(){ return padString; }).join("");
    

    【讨论】:

    • 函数repeat在IE 11中不存在,也必须添加,看developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 确实如此。感谢您的补充:)
    • IE 11 一团糟 :)
    • 如果您处于 IE 11 的 F12 控制台模式,则存在一个问题。顶部的兼容性/版本框可能会指示版本 10。即使使用 polyfill,也会出现问题。您需要将其更改为版本 11。但是,请注意,如果您的用户将您的网站置于兼容模式,它可能仍会中断。
    • @Wade 我刚刚将代码放入,它在 IE10 中工作。也许 IE10 的最新兼容性更新已经解决了这个问题,这意味着我希望它们也在 IE11 中?我并不特别在意,因为 IE10 很少使用,但它是我最慢的 IE 测试机。
    猜你喜欢
    • 2016-03-11
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2018-10-19
    • 2023-03-09
    • 2016-01-03
    相关资源
    最近更新 更多