如何替换jQuery $ .trim()?

时间:2019-01-15 01:02:00

标签: javascript jquery polyfills

我在一个网站中使用jQuery,该网站具有内置String.trim()的polyfill。该站点过去经常在IE 8中运行,并且需要使用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, "" );
    },

到目前为止,这实际上并不是什么大问题,但是我使用的是Datatables plugin for jQuery,它在很多地方都用$.trim()来调用不是字符串,例如数字或数组。 IE 11和Chrome(我们定位的浏览器)中的本机代码知道只会返回$.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(),但这没用。

有没有办法将String.prototype.trim()返回其本机代码?

是否可以重新定义$ .trim()?

我没想到的其他想法?

3 个答案:

答案 0 :(得分:1)

您可以覆盖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>

答案 1 :(得分:1)

使用$.trim()简单覆盖jQuery的String.prototype.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>

答案 2 :(得分:0)

基于杰克·巴什福德的回答,我想到了这一点。

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)不会引发错误。