如何替换jQuery$.trim()?

How to replace jQuery $.trim()?

我在一个网站中使用 jQuery,该网站具有内置 String.trim() 的 polyfill。网站过去经常在 IE 8 中使用 运行 并且需要 polyfill,但现在不需要了。不幸的是,我无法从页面中删除 polyfill——我没有权限触摸它,我也没有办法删除它——所以这段代码运行秒之前我可以控制:

String.prototype.trim = function() {
    return this.replace(/^\s\s*/, "").replace(/\s\s*$/, "")
}

然后 jQuery 出现并执行此操作,没有意识到本地 String.trim 已经搞砸了:

// Use native String.trim function wherever possible
trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
    function( text ) {
        return text == null ?
            "" :
            core_trim.call( text );
    } :

    // Otherwise use our own trimming functionality
    function( text ) {
        return text == null ?
            "" :
            ( text + "" ).replace( rtrim, "" );
    },

到目前为止,这并不是什么大问题,但我正在为 jQuery 使用 Datatables plugin,它在很多地方调用 $.trim()不是字符串的数据,例如数字或数组。 IE 11 和 Chrome(我们的目标浏览器)中的本机代码只知道 return $.trim(6) 的值,但 polyfill 不知道。

我尝试用一​​个应该有效的函数重新定义原型:

String.prototype.trim = function(){
   if(typeof this.valueOf(this) === 'string'){
       return this.replace(/^\s\s*/, "").replace(/\s\s*$/, "");
   } else {
       return this.valueOf(this);
   }
} 

但这没有用,因为 jQuery 已经使用 polyfill 进行了扩展,并且对原型的进一步更改不会改变 jQuery 正在使用的内容。

我尝试按照 this thread 重新定义 $.trim(),但没有成功。

有没有办法 return String.prototype.trim() 到它的本地代码?

有没有办法重新定义 $.trim()?

我没有想到的其他想法?

您可以覆盖 jQuery 个核心方法

(function(){
    var string = "       TRIM ME      ";
    console.log(jQuery.trim(string));
    // Define overriding method.
    jQuery.trim = function(string){
        return string;
    }
    console.log(jQuery.trim(string));
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

只需使用 String.prototype.trim() 覆盖 jQuery 的 $.trim(),然后使用您的函数覆盖 String.prototype.trim()

var trimText = "       Some text       ";

String.prototype.trim = function() {
  return this.replace(/^\s\s*/, "").replace(/\s\s*$/, "")
}

$.trim = function(string) {
  return String.prototype.trim(string);
}

trimText = trimText.trim();

console.log(trimText);
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>

根据 Jack Bashford 的回答,我想到了这个。

String.prototype.trim = function(){
  if(typeof this.valueOf(this) === 'string'){
    return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
  } else {
    return this.valueOf(this);
  }
};

$.trim = function(e){
    return String.prototype.trim.call(e);
};

部分原始问题是我需要修复它,以便在调用 $.trim(number) 或 $.trim(array) 时不会抛出错误.