.trim () in JavaScript funktioniert nicht im IE


460

Ich habe versucht, .trim()eine Zeichenfolge in einem meiner JavaScript-Programme anzuwenden . Unter Mozilla funktioniert es einwandfrei, aber ein Fehler wird angezeigt, wenn ich es in IE8 versuche. Weiß jemand, was hier los ist? Kann ich es trotzdem im IE zum Laufen bringen?

Code:

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

Fehleranzeige:

Nachricht: Das Objekt unterstützt diese Eigenschaft oder Methode nicht
Zeile: 604
Char: 2
Code: 0
URI: http: //test.localhost/test.js

2
Ich kann nicht sehen, was auf Ihrem Computer gespeichert ist. Könnten Sie test.js auf eine Speicherwebsite hochladen? Außerdem muss ich die eigentliche trim () -Funktion sehen, um zu sehen, was falsch ist. Vielen Dank!
Warty

6
@ItzWarty "whatever ".trim()versuchen Sie das auf IE8.
Dan Rosenstark


8
Ich habe nach IE8-Kompatibilität gegoogelt trim()und traute meinen Augen nicht, als ich herausfand, dass es nicht unterstützt wurde. Danke, dass du das geklärt hast. Ich wollte dasselbe fragen, wie Sie gefragt haben.
Mathias Lykkegaard Lorenzen

Antworten:


773

Fügen Sie den folgenden Code hinzu, um der Zeichenfolge Trimmfunktionen hinzuzufügen.

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

8
Gute Antwort. Beachten Sie, dass replace(/^\s\s*/, '').replace(/\s\s*$/, '')dies replace(/^\s+|\s+$/, '')laut einem Benchmark etwa dreimal schneller sein sollte als in Firefox 2: blog.stevenlevithan.com/archives/faster-trim-javascript
Daniel Vassallo

92
Beachten Sie auch, dass replace(/^\s+|\s+$/, '')nur führende oder nachfolgende Leerzeichen entfernt werden. Dies ist nicht das Verhalten, das von einer Trimmfunktion erwartet wird. Wenn Sie sowohl führende als auch nachfolgende Leerzeichen entfernen möchten, müssen Sie diese verwenden replace(/^\s+|\s+$/g, '').
Massimiliano Fliri

1
Kommt mir ein bisschen albern vor. Bietet nicht jedes js-Framework eine Utility-Funktion trim ()? Wenn dies das einzige Problem ist, das Sie haben, ist das in Ordnung, aber es gibt viele Möglichkeiten, wie der IE "anders" ist, wodurch sich eine Bibliothek kurzfristig lohnt.
Stephen

6
@ Stephen Ja, Sie haben Recht, aber die Frage bezieht sich nicht auf Frameworks. Es geht um Javascript & Trim.
Ben Rowe

3
Dies ist eine gute Lösung, wenn Sie jQuery nicht verwenden. Wenn nicht, scheint $ .trim () eine viel bessere Lösung zu sein, da es Ihr Skript ein bisschen einfacher hält.
NLemay

203

Es sieht so aus, als ob diese Funktion im IE nicht implementiert ist. Wenn Sie jQuery verwenden, können Sie $.trim()stattdessen ( http://api.jquery.com/jQuery.trim/ ) verwenden.


17
Nun, ich liebe jQuery, aber es nur für .trim () zu importieren scheint übertrieben
Erik

71
Genau. Deshalb sagte ich "wenn Sie jQuery verwenden ..." =)
jrummell

@Erik wird dies das einzige IE-Problem sein, auf das Jin stoßen wird? Es gibt nicht viel nützliches Javascript, das ich schreiben kann, ohne die Browser-Desinfektionsfunktionen einer Bibliothek verwenden zu müssen.
Stephen

8
Bitte beachten Sie, dass $ .trim () von $ (<element> .val (). Trim () abweicht
sami

57

jQuery:

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

Jemand verwendet, $("#mycomment").val().trim();aber dies funktioniert nicht im IE.


1
Vielen Dank für eine perfekte Antwort, die uns hier auf dieser faulen, wackeligen alten Browser-Brücke viele Kopfschmerzen
erspart hat

1
Ein gutes Beispiel dafür, warum jQuery.
Andrew Plummer

Ist diese Methode browserübergreifend, Sir?
Toha

2
@toha, Cross-Browser zu sein, ist eines der wichtigsten Dinge über jQuery
Raystorm

Richtig, Sir. Ich vermute. Danke
toha

34

Leider gibt es keine browserübergreifende JavaScript-Unterstützung für trim ().

Wenn Sie jQuery (mit der Methode .trim ()) nicht verwenden, können Sie Zeichenfolgen mithilfe der folgenden Methoden Trimmunterstützung hinzufügen:

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

Ich hatte ein ähnliches Problem, als ich versuchte, einen Wert aus einer Eingabe zu kürzen und dann zu fragen, ob er gleich nichts ist:

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

Dies warf jedoch einen Schraubenschlüssel in die Arbeit für IE6 - 8. Ärgerlicherweise hatte ich versucht, es so zu variieren:

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

Die Verwendung der Trimmmethode von jQuery funktioniert jedoch in allen Browsern perfekt für mich.

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

5

Ich habe Code geschrieben, um die Trimmfunktionalität zu implementieren.

LTRIM (links trimmen):

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

RTRIM (rechts trimmen):

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

TRIM (beidseitig trimmen):

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

ODER

Es steht auch ein regulärer Ausdruck zur Verfügung, den wir verwenden können.

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

Nützliche Erklärung


3
Ihre alte Schule Code suchen und zerstören nicht verarbeitet \t, \r, \nund so weiter . Nur spaces. Regexp ist besser, wenn Sie nicht wirklich die Mühe machen möchten, alles manuell zu handhaben.
CodeAngry

4

Wir können offiziellen Code aus dem Internet erhalten! Verweisen Sie darauf:

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

Wenn Sie den folgenden Code vor einem anderen Code ausführen, wird trim () erstellt, wenn er nicht nativ verfügbar ist.

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

Für mehr: Ich habe gerade festgestellt, dass es ein js-Projekt zur Unterstützung von EcmaScript 5 gibt: https://github.com/es-shims/es5-shim Durch Lesen des Quellcodes können wir mehr über Trim erfahren .

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

Ich glaube nicht, dass es trim()im JavaScript-Standard eine native Methode gibt . Vielleicht liefert Mozilla eine, aber wenn Sie eine im IE wollen, müssen Sie sie selbst schreiben. Es gibt einige Versionen auf dieser Seite .


3

Ich hatte das gleiche Problem in IE9. Als ich jedoch die unterstützte HTML-Version mit dem folgenden Tag in der ersten Zeile vor dem deklarierte

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

Das Problem wurde behoben.


1

Dies liegt an einem Tippfehler getElementBy ID . Ändern Sie es in 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
Warum eine Schleife erstellen, wenn Sie ein einfaches Ersetzen verwenden können, auch wenn die Zeit sehr knapp ist? Versuchen Sie, diese Methode 200-mal bei durchschnittlich großem Text aufzurufen und die andere von jQuery bereitgestellte Implementierung aufzurufen, und Sie werden sehen, wovon ich spreche: )
Dany Khalife

1
Denn in einigen Fällen ist eine Schleife schneller als ein regulärer Ausdruck. Unter dem Link, den JW in seiner Antwort gepostet hat, finden Sie einige Benchmarks, insbesondere die Kommentare dort (da der ursprüngliche Benchmark ziemlich alt ist).
Eric

0

Ich habe gerade herausgefunden, dass der IE die Unterstützung nicht mehr unterstützt trim(), wahrscheinlich nach einem kürzlich durchgeführten Windows-Update. Wenn Sie Dojo verwenden, können Sie es verwenden dojo.string.trim(), es funktioniert plattformübergreifend.


0

Dieses Problem kann durch den IE verursacht werden, der den Kompatibilitätsmodus auf Intranetsites verwendet. Es gibt zwei Möglichkeiten, dies zu beheben. Sie können entweder den IE aktualisieren, um den Kompatibilitätsmodus auf Ihrem lokalen Computer nicht zu verwenden (in IE11: Extras-> Einstellungen für die Kompatibilitätsansicht -> Deaktivieren Sie die Option Intranetsites in der Kompatibilitätsansicht anzeigen).

Besser noch, Sie können die Meta-Tags auf Ihrer Webseite aktualisieren. Hinzufügen:

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

Was bedeutet das? Der IE wird angewiesen, den neuesten Kompatibilitätsmodus zu verwenden. Weitere Informationen finden Sie in MSDN: Festlegen älterer Dokumentmodi

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.