【问题标题】:How to solve in IE11: Object doesn't support property or method 'padStart'如何在 IE11 中解决:对象不支持属性或方法 'padStart'
【发布时间】:2019-08-21 14:57:03
【问题描述】:

我的代码可以将时间间隔(总和和平均值)转换为“hh:mm:ss”格式,在任何地方都很好,除了在 IE 11 中出现此错误:

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

如何重写此代码以使其正常工作?

var times = [3600000, 60000, 1000];

function formatTime(avg) {
    return times.map(function (t) {
        var value = Math.floor(avg / t);
        avg %= t;
        return value;
    }).map(function (v) {
        return v.toString().padStart(2, 0);
    }).join(':');
}

console.log(formatTime(32939000)); // 09:08:59

padStart(2, 0) 在最后一个 return 语句中被调用。如何让它在 IE11 中运行?

【问题讨论】:

标签: javascript arrays internet-explorer-11


【解决方案1】:

对于您的特定案例——您正在处理具有 1 位或 2 位数字的时间部分(小时、分钟、秒)——您可以替换:

return v.toString().padStart(2, 0);

与:

return ("0" + v).slice(-2);

...为什么不在第一次迭代中这样做,这样您就可以避免额外的map

var times = [3600000, 60000, 1000];

function formatTime(avg) {
    return times.map(function (t) {
        var value = Math.floor(avg / t);
        avg %= t;
        return ("0" + value).slice(-2);
    }).join(':');
}

console.log(formatTime(32939000)); // 09:08:59

另一种方法是先进行连接,然后使用\b\d\b 作为正则表达式来识别单个数字并使用replace 插入缺失的零:

.join(':').replace(/\b\d\b/g, "0$&");

var times = [3600000, 60000, 1000];

function formatTime(avg) {
    return times.map(function (t) {
        var value = Math.floor(avg / t);
        avg %= t;
        return value;
    }).join(':').replace(/\b\d\b/g, "0$&");
}

console.log(formatTime(32939000)); // 09:08:59

【讨论】:

  • 这对我来说是更清洁的解决方案。谢谢
【解决方案2】:

根据 MDN 的 padStart 文档,Internet Explorer 不支持该功能。但是,他们还提供了一个polyfill,如果它丢失了,它将添加padStart。只需将代码块添加到程序的开头,您就会在任何浏览器中看到padStart

// https://github.com/uxitten/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);
        }
    };
}

(以上代码属于公有领域,MDN's about page。)

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多