如何替换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) 时不会抛出错误.
我在一个网站中使用 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) 时不会抛出错误.