我在一个网站中使用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()?
我没想到的其他想法?
答案 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)不会引发错误。