JavaScriptの.trim()がIEで機能しない


460

.trim()JavaScriptプログラムの1つで文字列に適用しようとしました。Mozillaでも問題なく動作しますが、IE8で実行しようとするとエラーが表示されます。ここで何が起こっているのか誰か知っていますか?とにかく私はそれをIEで動作させることができますか?

コード:

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

エラー表示:

メッセージ:オブジェクトはこのプロパティまたはメソッドをサポートしていません
ライン:604
文字:2
コード:0
URI:http://test.localhost/test.js

2
コンピューターに何が保存されているのかわかりません。test.jsをストレージWebサイトにアップロードできますか?また、何が問題なのかを確認するには、実際のtrim()関数を確認する必要があります。ありがとう!
Warty

6
@ItzWarty "whatever ".trim()はIE8で試してみてください。
Dan Rosenstark、2010


8
のIE8との互換性についてGoogleで検索しtrim()ましたが、サポートされていないことがわかったとき、自分の目を信じませんでした。解決してくれてありがとう。私はあなたが尋ねたのと同じように尋ねるつもりでした。
Mathias Lykkegaard Lorenzen 2013

回答:


773

文字列にトリム機能を追加するには、次のコードを追加します。

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

8
いい答えです。注replace(/^\s\s*/, '').replace(/\s\s*$/, '')約3倍速くよりべきであるreplace(/^\s+|\s+$/, '')1つのベンチマークによると、Firefoxの2:blog.stevenlevithan.com/archives/faster-trim-javascript
ダニエルVassallo氏

92
また、replace(/^\s+|\s+$/, '')先頭または末尾のスペースのみが削除されることに注意してください。これは、トリム関数から予期される動作ではありません。先頭と末尾の両方のスペースを削除する場合は、を使用する必要がありますreplace(/^\s+|\s+$/g, '')
Massimiliano Fliri、2010

1
私には少しばかげているようです。すべてのjsフレームワークがユーティリティのtrim()関数を提供しているわけではありませんか?これが唯一の問題である場合は問題ありませんが、IEが「異なる」ため、短期的にはライブラリを価値のあるものにする多くの方法があります。
スティーブン

6
@Stephenはい、あなたは正しいですが、問題はフレームワークに関するものではありません。それはjavascriptとトリムについてです。
Ben Rowe

3
jQueryを使用しない場合、これは優れたソリューションです。しかし、そうでない場合、$。trim()はスクリプトを少しシンプルにするため、はるかに優れたソリューションのようです。
NLemay 2013

203

その関数はIEに実装されていないようです。jQueryを使用している場合は、$.trim()代わりに使用できます(http://api.jquery.com/jQuery.trim/)。


17
今、私はjQueryを愛していますが、.trim()のためだけにそれをインポートすることはやり過ぎのようです
Erik

71
同意する。それが私が「jQueryを使用している場合...」と言った理由です=)
jrummell

@エリックは、これがジンが遭遇する唯一のIEの問題になるのでしょうか?ライブラリーのブラウザーのサニタイズ機能を使用しなくても、私が書くことができる有用なJavaScriptはそれほど多くありません。
スティーブン

8
。:ここに詳細情報- $ .trimは().val $(<要素>()からの差分であることに注意してください(トリム)してくださいstackoverflow.com/questions/4315570/...
サミ

57

jQuery:

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

誰かが使用して$("#mycomment").val().trim();いますが、これはIEでは機能しません。


1
この腐った不安定な古いブラウザブリッジに関する多くの頭痛の種を救ってくれた完璧な答えをありがとう:)
Awerealis 2013年

1
なぜjQueryなのかを示す良い例。
Andrew Plummer

その方法はブラウザ間ですか?
16年

2
@toha、クロスブラウザーであることはjQuery
Raystorm '27

正解です。私は推測する。ありがとう
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にしようとしました:

   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 2013年

4

インターネットから公式コードを入手できます!これを参照してください:

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は、 ソースコードを読むことによって、我々はトリムについてのより多くの知識を得ることができます。

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でも同じ問題がありましたが、サポートされるHTMLバージョンを次のタグで宣言してから、

<!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

1
ループが正規表現よりも高速な場合があるためです。JWがいくつかのベンチマーク、特にそこにあるコメントについて彼の回答に投稿したリンクを参照してください(元のベンチマークはかなり古いため)。
Eric

0

trim()たぶん、最近のWindowsの更新後に、IEがのサポートを停止することがわかりました。dojoを使用する場合、を使用できdojo.string.trim()ます。クロスプラットフォームで動作します。


0

この問題は、IEがイントラネットサイトで互換モードを使用していることが原因である可能性があります。これを解決するには2つの方法があり、ローカルマシンで互換モードを使用しないようにIEを更新できます(IE11の場合:[ツール]-> [互換表示設定]-> [互換表示でイントラネットサイトを表示する]チェックボックスをオフにします)

さらに良いことに、あなたはあなたのウェブページのメタタグを更新することができます。加える:

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

これは何を意味するのでしょうか?最新の互換モードを使用するようにIEに指示しています。詳細については、MSDN:従来のドキュメントモードの指定をご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.