.trim () in JavaScript non funziona in IE


460

Ho provato ad applicare .trim()una stringa in uno dei miei programmi JavaScript. Funziona bene con Mozilla, ma viene visualizzato un errore quando lo provo in IE8. Qualcuno sa cosa sta succedendo qui? Posso comunque farlo funzionare in Internet Explorer?

codice:

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

visualizzazione dell'errore:

Messaggio: l'oggetto non supporta questa proprietà o metodo
Linea: 604
Char: 2
Codice: 0
URI: http: //test.localhost/test.js

2
Non riesco a vedere cosa è memorizzato sul tuo computer. Potresti caricare test.js su un sito Web di archiviazione? Inoltre, ho bisogno di vedere l'attuale funzione trim () per vedere cosa c'è che non va. Grazie!
Warty,

6
@ItzWarty "whatever ".trim()provalo su IE8.
Dan Rosenstark,


8
Ho cercato su Google IE8 compatibilità trim()e non credevo ai miei occhi quando ho capito che non era supportato. Grazie per averlo chiarito. Stavo per chiedere lo stesso di quello che hai chiesto.
Mathias Lykkegaard Lorenzen,

Risposte:


773

Aggiungi il seguente codice per aggiungere la funzionalità di taglio alla stringa.

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

8
Buona risposta. Si noti che replace(/^\s\s*/, '').replace(/\s\s*$/, '')dovrebbe essere circa 3 volte più veloce rispetto replace(/^\s+|\s+$/, '')a Firefox 2, secondo un benchmark: blog.stevenlevithan.com/archives/faster-trim-javascript
Daniel Vassallo

92
Si noti inoltre che replace(/^\s+|\s+$/, '')rimuove solo gli spazi iniziali o finali, che non è il comportamento previsto da una funzione di taglio. Se si desidera rimuovere gli spazi iniziali e finali, è necessario utilizzare replace(/^\s+|\s+$/g, '').
Massimiliano Fliri

1
Mi sembra un po 'sciocco. Ogni framework js non fornisce una funzione utility trim ()? Se questo è l'unico problema che hai, va bene, ma ci sono molti modi in cui IE è "diverso" che renderà utile una libreria nel breve periodo.
Stephen,

6
@Stephen Sì, hai ragione, ma la domanda non riguarda i framework. si tratta di javascript e trim.
Ben Rowe,

3
Questa è una buona soluzione se non usi jQuery. Ma in caso contrario, $ .trim () sembra essere una soluzione molto migliore, poiché mantiene lo script un po 'più semplice.
NL,

203

Sembra che quella funzione non sia implementata in IE. Se si utilizza jQuery, è possibile utilizzare $.trim()invece ( http://api.jquery.com/jQuery.trim/ ).


17
Ora, adoro jQuery, ma importarlo solo per .trim () sembra eccessivo
Erik

71
Sono d'accordo. Ecco perché ho detto "se stai usando jQuery ..." =)
jrummell il

@Erik sarà questo l'unico problema con IE in cui Jin si imbatterà? Non c'è molto utile JavaScript che posso scrivere senza dover utilizzare le funzioni di sanificazione del browser di una libreria.
Stephen,

8
Si noti che $ .trim () è diverso da $ (<element> .val (). Trim () - maggiori informazioni qui: stackoverflow.com/questions/4315570/…
sami,

57

jQuery:

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

Qualcuno usa $("#mycomment").val().trim();ma questo non funzionerà su IE.


1
Grazie per una risposta perfetta che ci ha risparmiato molti mal di testa qui su questo vecchio Browser-Bridge marcio e traballante :)
Awerealis

1
Un ottimo esempio del perché jQuery.
Andrew Plummer,

Quel metodo è cross browser, signore?
toha

2
@toha, essere cross-browser è una delle cose chiave di jQuery
Raystorm il

Signore corretto. Suppongo. Grazie
toha il

34

Sfortunatamente non esiste il supporto JavaScript cross-browser per trim ().

Se non stai usando jQuery (che ha un metodo .trim ()) puoi usare i seguenti metodi per aggiungere il supporto di trim alle stringhe:

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

Ho avuto un problema simile quando provavo a tagliare un valore da un input e poi chiedevo se era uguale a niente:

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

Tuttavia, questo ha gettato una chiave inglese in IE6 - 8. Abbastanza fastidiosamente ho provato a variarlo in questo modo:

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

Tuttavia, usando il metodo trim di jQuery, funziona perfettamente per me in tutti i browser.

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

5

Ho scritto del codice per implementare la funzionalità di taglio.

LTRIM (tagliare a sinistra):

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

RTRIM (tagliare a destra):

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

TRIM (tagliare entrambi i lati):

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

O

Espressione regolare è anche disponibile che possiamo usare.

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

Spiegazione utile


3
Cerca il tuo vecchia scuola e distruggere il codice non gestisce \t, \r, \ne così via. Solo spaces. Regexp è meglio se non hai voglia di impegnarti a gestire manualmente tutto.
CodeAngry,

4

Possiamo ottenere il codice ufficiale da Internet! Segnala questo:

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

L'esecuzione del codice seguente prima di qualsiasi altro codice creerà trim () se non è nativamente disponibile.

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

per di più: ho appena scoperto che esiste un progetto js per supportare EcmaScript 5: https://github.com/es-shims/es5-shim leggendo il codice sorgente, possiamo ottenere maggiori informazioni su 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

Non credo che esista un trim()metodo nativo nello standard JavaScript. Forse Mozilla ne fornisce uno, ma se ne vuoi uno in IE, dovrai scriverlo tu stesso. Ci sono alcune versioni in questa pagina .


3

Ho avuto lo stesso problema in IE9 Tuttavia quando ho dichiarato la versione html supportata con il seguente tag sulla prima riga prima del

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

Il problema è stato risolto


1

Ciò è dovuto all'errore di battitura getElementBy ID . Modificalo 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
Perché fare un ciclo quando puoi usare un semplice rimpiazzo, anche se è molto brutto quando il tempo è cruciale, prova a chiamare questo metodo 200 volte su un testo di dimensioni medie e chiama l'altra implementazione fornita da jQuery e vedrai di cosa sto parlando: )
Dany Khalife,

1
Perché in alcuni casi un ciclo è più veloce di una regexp. Vedi il link che JW ha pubblicato nella sua risposta per alcuni benchmark, in particolare i commenti lì (poiché il benchmark originale è piuttosto vecchio).
Eric,

0

Ho appena scoperto che IE non supporta più trim(), probabilmente dopo un recente aggiornamento di Windows. Se usi dojo, puoi usarlo dojo.string.trim(), funziona su più piattaforme.


0

Questo problema può essere causato da IE utilizzando la modalità di compatibilità sui siti Intranet. Esistono due modi per risolverlo, è possibile aggiornare IE per non utilizzare la modalità di compatibilità sul proprio computer locale (in IE11: Strumenti-> Impostazioni visualizzazione compatibilità -> Deseleziona Visualizza siti intranet in Visualizzazione compatibilità)

Meglio ancora, puoi aggiornare i meta tag nella tua pagina web. Aggiungere:

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

Cosa significa questo? Sta dicendo a IE di utilizzare l'ultima modalità di compatibilità. Ulteriori informazioni sono disponibili in MSDN: specifica delle modalità documento legacy

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.