ChatGPT解决这个技术问题 Extra ChatGPT

JavaScript 中的 .trim() 在 IE 中不起作用

我尝试将 .trim() 应用于我的一个 JavaScript 程序中的字符串。它在 Mozilla 下运行良好,但在 IE8 中尝试时显示错误。有谁知道这里发生了什么?无论如何我可以让它在IE中工作吗?

代码:

var ID = document.getElementByID('rep_id').value.trim();

错误显示:

Message: Object doesn't support this property or method
Line: 604
Char: 2
Code: 0
URI: http://test.localhost/test.js
我看不到您计算机上存储的内容。您可以将 test.js 上传到存储网站吗?另外,我需要查看实际的 trim() 函数以查看问题所在。谢谢!
@ItzWarty "whatever ".trim() 在 IE8 上试试。
我在 Google 上搜索了 trim() 的 IE8 兼容性,当我发现它不受支持时简直不敢相信。感谢您清除它。我正要问和你问的一样。

B
Ben Rowe

添加以下代码以向字符串添加修剪功能。

if(typeof String.prototype.trim !== 'function') {
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, ''); 
  }
}

好答案。请注意,根据一项基准,在 Firefox 2 中,replace(/^\s\s*/, '').replace(/\s\s*$/, '') 应该比 replace(/^\s+|\s+$/, '') 快 3 倍:blog.stevenlevithan.com/archives/faster-trim-javascript
另请注意,replace(/^\s+|\s+$/, '') 仅删除前导空格或尾随空格,这不是修剪函数所期望的行为。如果要删除前导空格和尾随空格,则需要使用 replace(/^\s+|\s+$/g, '')
对我来说似乎有点傻。不是每个 js 框架都提供了一个实用的 trim() 函数吗?如果这是您唯一的问题,那很好,但是 IE 有很多“不同”的方式,这将使库在短期内有价值。
@Stephen 是的,你是对的,但问题不在于框架。它是关于 javascript 和修剪的。
如果您不使用 jQuery,这是一个很好的解决方案。但如果不是, $.trim() 似乎是一个更好的解决方案,因为它使您的脚本更简单一些。
d
double-beep

看起来这个功能没有在 IE 中实现。如果您使用的是 jQuery,则可以改用 $.trim()(尽管自 jQuery 3.5 起已弃用它)。


现在,我喜欢 jQuery,但只为 .trim() 导入它似乎有点过头了
我同意。这就是为什么我说“如果你使用 jQuery ...” =)
@Erik 这将是 Jin 会遇到的唯一 IE 问题吗?无需使用库的浏览器清理功能,我就可以编写很多有用的 javascript。
请注意 $.trim() 与 $(<element>.val().trim() 不同 - 更多信息在这里:stackoverflow.com/questions/4315570/…
S
Sampson

jQuery:

$.trim( $("#mycomment").val() );

有人使用 $("#mycomment").val().trim();,但这不适用于 IE。


谢谢你的完美答案,这让我们在这个烂摇摇欲坠的旧浏览器桥上遇到了很多麻烦:)
一个很好的例子说明为什么使用 jQuery。
先生,这种方法是跨浏览器的吗?
@toha,跨浏览器是jQuery的关键之一
正确的先生。我猜。谢谢
I
Iain Collins

不幸的是,trim() 没有跨浏览器的 JavaScript 支持。

如果您不使用 jQuery(它有一个 .trim() 方法),您可以使用以下方法为字符串添加修剪支持:

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
    return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
    return this.replace(/\s+$/,"");
}

E
Erik

https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/String/Trim

这是对 javascript 的最新添加,IE 不支持它。


k
kaichanvong

在尝试从输入中修剪一个值然后询问它是否等于无时,我遇到了类似的问题:

if ($(this).val().trim() == "")

然而,这给 IE6 - 8 的工作带来了麻烦。令人讨厌的是,我试图像这样改变它:

   var originalValue = $(this).val();

但是,使用 jQuery 的 trim 方法,在所有浏览器中都非常适合我..

var originalValueTrimmed = $.trim($(this).val());              
            if (originalValueTrimmed  == "") { ... }

C
Community

我已经编写了一些代码来实现修剪功能。

LTRIM(左修剪):

function ltrim(s)
{
    var l=0;
    while(l < s.length && s[l] == ' ')
    {   l++; }
    return s.substring(l, s.length);
} 

RTRIM(右修剪):

function rtrim(s)
{
    var r=s.length -1;
    while(r > 0 && s[r] == ' ')
    {   r-=1;   }
    return s.substring(0, r+1);
 }

TRIM(修剪两侧):

function trim(s)
{
    return rtrim(ltrim(s));
}

或者

我们也可以使用正则表达式。

function trimStr(str) {
  return str.replace(/^\s+|\s+$/g, '');
}

Useful Explanation


您的老式搜索和销毁代码无法处理 \t\r\n 等。只有 spaces。如果您不想真正努力手动处理所有事情,Regexp 会更好。
W
Will V King

我们可以从网上获取官方代码!参考这个:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim

如果在本机不可用,则在任何其他代码之前运行以下代码将创建 trim()。 if (!String.prototype.trim) { (function() { // 确保我们修剪 BOM 和 NBSP var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/ g; String.prototype.trim = function() { return this.replace(rtrim, ''); }; })(); }

更多:我刚刚发现有一个支持EcmaScript 5的js项目:https://github.com/es-shims/es5-shim通过阅读源代码,我们可以获得更多关于trim的知识。

defineProperties(StringPrototype, { // http://blog.stevenlevithan.com/archives/faster-trim-javascript // http://perfectionkills.com/whitespace-deviations/ trim: function trim() { if (typeof this = == 'undefined' || this === null) { throw new TypeError("can't convert " + this + ' to object'); } return String(this).replace(trimBeginRegexp, '').replace( trimEndRegexp, ''); } }, hasTrimWhitespaceBug);


S
Sampson

我认为 JavaScript 标准中没有本机 trim() 方法。也许 Mozilla 提供了一个,但如果你想要一个在 IE 中,你需要自己编写它。 this page 上有几个版本。


M
Mark

我在 IE9 中遇到了同样的问题但是,当我在之前的第一行使用以下标记声明支持的 html 版本时

<!DOCTYPE html>
<HTML>
<HEAD>...
.
.

问题已解决。


J
Jobelle

这是因为拼写错误 getElementByID。将其更改为 getElementById


S
Stephen P
var res = function(str){
    var ob; var oe;
    for(var i = 0; i < str.length; i++){
        if(str.charAt(i) != " " && ob == undefined){ob = i;}
        if(str.charAt(i) != " "){oe = i;}
    }
    return str.substring(ob,oe+1);
}

当你可以使用简单的替换时为什么要循环,当时间很关键时它也非常糟糕,尝试在平均大小的文本上调用这个方法 200 次并调用 jQuery 提供的其他实现,你会看到我在说什么: )
因为在某些情况下,循环比正则表达式更快。请参阅 JW 在他的答案中发布的一些基准的链接,尤其是那里的评论(因为原始基准已经很老了)。
S
Sampson

刚刚发现 IE 停止支持 trim(),可能是在最近的 Windows 更新之后。如果你使用dojo,你可以使用dojo.string.trim(),它可以跨平台工作。


F
FuzzyJulz

此问题可能是由 IE 在 Intranet 站点上使用兼容模式引起的。有两种方法可以解决这个问题,您可以更新 IE 以在本地机器上不使用兼容模式(在 IE11 中:工具-> 兼容性视图设置-> 取消选中在兼容性视图中显示内网站点)

更好的是,您可以更新网页中的元标记。加入:

...
<head>
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
...

这是什么意思?它告诉 IE 使用最新的兼容模式。 MSDN: Specifying legacy document modes 中提供了更多信息