【问题标题】:.trim() in JavaScript not working in IEJavaScript 中的 .trim() 在 IE 中不起作用
【发布时间】:2011-01-19 11:18:11
【问题描述】:

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

代码:

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

错误显示:

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

【问题讨论】:

  • 我看不到您计算机上存储的内容。您可以将 test.js 上传到存储网站吗?另外,我需要查看实际的 trim() 函数以查看问题所在。谢谢!
  • @ItzWarty "whatever ".trim() 在 IE8 上试试。
  • 我在 Google 上搜索了 trim() 的 IE8 兼容性,当我发现它不受支持时我不敢相信自己的眼睛。感谢您清除它。我打算和你问的一样问。

标签: javascript internet-explorer trim


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在 IE 中似乎没有实现该功能。如果您使用的是 jQuery,则可以使用 $.trim() 代替(尽管自 jQuery 3.5 起已弃用)。

      【讨论】:

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

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

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

      【讨论】:

      • 好答案。请注意,replace(/^\s\s*/, '').replace(/\s\s*$/, '') 应该比 Firefox 2 中的 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() 似乎是一个更好的解决方案,因为它可以让你的脚本更简单一些。
      【解决方案5】:

      很遗憾,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+$/,"");
      }
      

      【讨论】:

        【解决方案6】:
        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 在他的答案中发布的链接以获取一些基准,尤其是那里的 cmets(因为原始基准已经很老了)。
        【解决方案7】:

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

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

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

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

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

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            jQuery:

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

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

            【讨论】:

            • 感谢您的完美回答,让我们在这个破旧、摇摇欲坠的旧浏览器桥上省了很多麻烦 :)
            • 为什么 jQuery 的一个很好的例子。
            • 这种方法可以跨浏览器吗,先生?
            • @toha,跨浏览器是jQuery的关键之一
            • 正确的先生。我猜。谢谢
            【解决方案10】:

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

            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 会更好。
            【解决方案11】:

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

            之前的第一行使用以下标记声明支持的 html 版本时
            <!DOCTYPE html>
            <HTML>
            <HEAD>...
            .
            .
            

            问题已解决。

            【讨论】:

              【解决方案12】:

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

              https://developer.mozilla.org/en-US/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);
              

              【讨论】:

                【解决方案13】:

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

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

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

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

                【讨论】:

                  【解决方案14】:

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

                  【讨论】:

                    猜你喜欢
                    • 2018-10-04
                    • 2014-04-22
                    • 1970-01-01
                    • 2017-11-16
                    • 2012-01-20
                    • 2016-01-21
                    • 2015-06-17
                    • 2012-09-09
                    • 1970-01-01
                    相关资源
                    最近更新 更多