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


460

我试图申请 .trim()我的一个JavaScript程序中的字符串。在Mozilla下它可以正常工作,但是当我在IE8中尝试时会显示错误。有人知道这是怎么回事吗?无论如何,我可以使其在IE中工作吗?

码:

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

错误显示:

消息:对象不支持此属性或方法
线:604
字符:2
代码:0
URI:http://test.localhost/test.js

2
我看不到您计算机上存储的内容。您可以将test.js上传到存储网站吗?另外,我需要查看实际的trim()函数,以查看出了什么问题。谢谢!
Warty 2010年

6
@ItzWarty "whatever ".trim()在IE8上尝试一下。
丹·罗森斯塔克


8
我通过Google搜索了IE8的兼容性trim(),当我发现它不受支持时,我不敢相信。感谢您清除此问题。我要问的和你问的一样。
Mathias Lykkegaard Lorenzen

Answers:


773

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

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

8
好答案。请注意,根据一项基准测试,该replace(/^\s\s*/, '').replace(/\s\s*$/, '')速度应该比replace(/^\s+|\s+$/, '')Firefox 2 快3倍:blog.stevenlevithan.com/archives/faster-trim-javascript
Daniel Vassallo 2010年

92
还请注意,replace(/^\s+|\s+$/, '')仅删除前导或尾随空格,这不是修剪功能所期望的行为。如果要同时删除前导空格和尾随空格,则需要使用replace(/^\s+|\s+$/g, '')
Massimiliano Fliri 2010年

1
对我来说似乎有点傻。并非每个js框架都提供实用的trim()函数吗?如果这是您唯一的问题,那就很好了,但是IE有很多“不同的”方式,它们会使图书馆在短期内值得。
斯蒂芬,

6
@Stephen是的,您是正确的,但问题不在于框架。这是关于JavaScript和修剪。
Ben Rowe

3
如果您不使用jQuery,这是一个不错的解决方案。但是,如果不是这样,$。trim()似乎是一个更好的解决方案,因为它使您的脚本更加简单。
NLemay

203

似乎该功能未在IE中实现。如果您使用的是jQuery,则可以$.trim()改用(http://api.jquery.com/jQuery.trim/)。


17
现在,我喜欢jQuery,但仅将其导入.trim()似乎过大了
Erik 2010年

71
我同意。这就是为什么我说“如果您使用的是jQuery ...” =)
jrummell 2010年

@Erik这将是Jin会遇到的唯一IE问题吗?我无需使用库的浏览器卫生功能就可以编写很多有用的JavaScript。
斯蒂芬,

8
请注意,$。trim()与$(<element> .val()。trim()的区别-这里的更多信息:stackoverflow.com/questions/4315570/…–
萨米

57

jQuery的:

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

有人使用,$("#mycomment").val().trim();但这在IE上不起作用。


1
谢谢您提供完美的答案,这使我们免于在这个烂旧的旧浏览器桥上头疼:)
Awerealis 2013年

1
为什么使用jQuery的一个很好的例子。
Andrew Plummer 2014年

主席先生,这种方法是否可以跨浏览器使用?
toha

2
@toha,成为跨浏览器是jQuery
Raystorm

正确的先生。我猜。谢谢
Toha

34

不幸的是,没有对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+$/,"");
}


8

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

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

但是,这在IE6-8中投入了麻烦。够烦人的是,我试图像这样修改它:

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

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

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

5

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

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, '');
}

有用的解释


3
你的老同学搜索和摧毁代码不处理\t\r\n和这样的。只有spaces。如果您不想真正地手动处理所有事情,则Regexp会更好。
CodeAngry

4

我们可以从互联网上获得官方代码!请参考以下内容:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/trim

如果本地不可用,则在其他任何代码之前运行以下代码将创建trim()。

if (!String.prototype.trim) {
  (function() {
    // Make sure we trim BOM and 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);

3

我认为trim()JavaScript标准中没有本地方法。也许Mozilla提供了一种,但是如果您想在IE中使用一种,则需要自己编写。此页面上有几个版本。


3

我在IE9中遇到了同样的问题,但是当我在

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

问题已解决。


1

这是由于拼写错误getElementBy ID引起的。将其更改为getElementById


0
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);
}

1
为什么在可以使用简单替换操作时进行循环处理,当时间紧迫时也很糟糕,尝试在平均大小的文本上调用此方法200次,并调用jQuery提供的其他实现,您会明白我在说什么: )
Dany Khalife 2011年

1
因为在某些情况下,循环比正则表达式快。请参阅JW在他的答案中发布的一些基准测试的链接,尤其是那里的评论(因为原始基准测试很旧)。
埃里克

0

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


0

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

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

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

这是什么意思?它告诉IE使用最新的兼容模式。MSDN中提供了更多信息:指定旧文档模式

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.