Skip to content

TypeError: n[o].content.replaceAll is not a function

🏷️ 前端

今天发现前端网页的脚本在安卓手机飞书内嵌的浏览器中没有运行,导致页面一直卡在 loading 的状态。由于看不到控制台的日志,只好把错误消息打印到了页面上:

TypeError: n[o].content.replaceAll is not a function

replaceAll 方法是在 ES2021 / ES12 中加入的[1],很可能是飞书内嵌的浏览器还不支持这个方法。

此时可以通过添加 String.prototype.replaceAll 原型方法来避免这个报错[2]

javascript
if (typeof(String.prototype.replaceAll) != "function") {
    String.prototype.replaceAll = function (s1, s2) {
        return this.replace(new RegExp(s1, "gm"), s2);
    }
}

另外在排查时还发现了一个比较奇怪的现象:如果因为某种原因(比如手机网络信号不好),导致某个 js 文件(如 jquery.min.js )下载失败,那么很可能在一段时间内,飞书和微信内嵌的浏览器会一直当作这个文件加载不了(相当于即使文件没加载成功也缓存了下来)。由于是偶发的,暂时也没法确定是不是由于内嵌浏览器本地缓存导致的。对于这种情况暂时还没找到什么好的解决方法。


关于遗留的问题,如果真的是前端缓存问题导致的,以 jQuery 未成功加载为例可以考虑使用如下方式:

javascript
try {
    if (typeof (loadJS) == "function" && typeof($) == "undefined") {
        loadJS('/dist/js/jquery.min.js?v=' + Math.random(), () => { doSomething() });
    }
} catch (e) {}

function loadJS(url, callback) {
    const script = document.createElement('script'),
        fn = callback || function () { };
    script.type = 'text/javascript';

    //IE
    if (script.readyState) {
        script.onreadystatechange = function () {
            if (script.readyState == 'loaded' || script.readyState == 'complete') {
                script.onreadystatechange = null;
                fn();
            }
        };
    } else {
        //其他浏览器
        script.onload = function () {
            fn();
        };
    }
    script.src = url;
    document.getElementsByTagName('head')[0].appendChild(script);
}

这个只是设想的解决方案,暂时还未验证过。这种方式缺点也很明显,只能验证一个 js 文件,如果有多个则每个都要单独验证。


  1. 怎么修复 "replaceAll is not a function" JavaScript Error? ↩︎

  2. 解决js中replaceAll浏览器不兼容问题 ↩︎