.trim () di JavaScript tidak berfungsi di IE

460

Saya mencoba menerapkan .trim()ke string di salah satu program JavaScript saya. Ini berfungsi dengan baik di bawah Mozilla, tetapi kesalahan ditampilkan ketika saya mencobanya di IE8. Adakah yang tahu apa yang sedang terjadi di sini? Apakah ada cara agar saya dapat membuatnya berfungsi di IE?

kode:

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

tampilan kesalahan:

Pesan: Objek tidak mendukung properti atau metode ini
Baris: 604
Char: 2
Kode: 0
URI: http: //test.localhost/test.js
Jin Yong
sumber
2
Saya tidak bisa melihat apa yang disimpan di komputer Anda. Bisakah Anda mengunggah test.js ke situs web penyimpanan? Juga, saya perlu melihat fungsi trim () yang sebenarnya untuk melihat apa yang salah. Terima kasih!
Warty
6
@ItzWarty "whatever ".trim()mencobanya di IE8.
Dan Rosenstark
8
Saya mencari Google untuk kompatibilitas IE8 trim(), dan tidak akan percaya mata saya ketika saya tahu itu tidak didukung. Terima kasih sudah membereskannya. Saya akan bertanya sama seperti yang Anda minta.
Mathias Lykkegaard Lorenzen

Jawaban:

773

Tambahkan kode berikut untuk menambahkan fungsionalitas trim ke string.

if(typeof String.prototype.trim !== 'function') {
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, ''); 
  }
}
Ben Rowe
sumber
8
Jawaban yang bagus. Catatan yang replace(/^\s\s*/, '').replace(/\s\s*$/, '')seharusnya sekitar 3 kali lebih cepat daripada replace(/^\s+|\s+$/, '')di Firefox 2, menurut salah satu patokan: blog.stevenlevithan.com/archives/faster-trim-javascript
Daniel Vassallo
92
Perhatikan juga bahwa replace(/^\s+|\s+$/, '')hanya menghilangkan spasi awal atau akhir, yang bukan perilaku yang diharapkan dari fungsi trim. Jika Anda ingin menghapus spasi awal dan spasi tambahan, Anda harus menggunakan replace(/^\s+|\s+$/g, '').
Massimiliano Fliri
1
Agak konyol bagi saya. Tidakkah setiap kerangka kerja js menyediakan fungsi trim utilitas ()? Jika ini adalah satu-satunya masalah yang Anda miliki, baiklah, tetapi ada banyak cara bahwa IE "berbeda" yang akan membuat perpustakaan bernilai-sementara dalam jangka pendek.
Stephen
6
@Stephen Ya Anda benar, tetapi pertanyaannya bukan tentang kerangka kerja. ini tentang javascript & trim.
Ben Rowe
3
Ini adalah solusi yang bagus jika Anda tidak menggunakan jQuery. Tetapi jika tidak, $ .trim () tampaknya menjadi solusi yang jauh lebih baik, karena membuat skrip Anda sedikit lebih sederhana.
NLemay
203

Sepertinya fungsi itu tidak diterapkan di IE. Jika Anda menggunakan jQuery, Anda bisa menggunakan $.trim()( http://api.jquery.com/jQuery.trim/ ).

Jrummell
sumber
17
Sekarang, saya suka jQuery, tetapi mengimpornya hanya untuk .trim () tampaknya berlebihan
Erik
71
Saya setuju. Itu sebabnya saya mengatakan "jika Anda menggunakan jQuery ..." =)
jrummell
@Erik apakah ini akan menjadi satu-satunya masalah IE yang akan dialami Jin? Tidak ada banyak javascript berguna yang dapat saya tulis tanpa harus menggunakan fungsi sanitasi peramban perpustakaan.
Stephen
8
Harap perhatikan bahwa $ .trim () berbeda dari $ (<element> .val (). Trim () - info lebih lanjut di sini: stackoverflow.com/questions/4315570/…
sami
57

jQuery:

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

Seseorang menggunakan $("#mycomment").val().trim();tetapi ini tidak akan bekerja pada IE.

Dan
sumber
1
Terima kasih atas jawaban sempurna yang telah menyelamatkan kami dari banyak sakit kepala di Browser-Bridge tua yang rapuh ini :)
Awerealis
1
Sebuah contoh bagus mengapa jQuery.
Andrew Plummer
Apakah itu metode lintas peramban, Pak?
toha
2
@ toha, menjadi peramban silang adalah salah satu hal utama tentang jQuery
Raystorm
Pak benar. Saya tebak. Terima kasih
toha
34

Sayangnya tidak ada dukungan JavaScript lintas browser untuk trim ().

Jika Anda tidak menggunakan jQuery (yang memiliki metode .trim ()), Anda dapat menggunakan metode berikut untuk menambahkan dukungan trim ke string:

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+$/,"");
}
Iain Collins
sumber
8

Saya memiliki masalah serupa ketika mencoba memangkas nilai dari input dan kemudian bertanya apakah itu sama dengan apa-apa:

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

Namun ini melemparkan kunci pas dalam karya untuk IE6 - 8. Cukup mengganggu saya mencoba untuk var seperti:

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

Namun, menggunakan metode trim jQuery, berfungsi sempurna untuk saya di semua browser ..

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

Saya telah menulis beberapa kode untuk mengimplementasikan fungsionalitas trim.

LTRIM (trim kiri):

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

RTRIM (trim kanan):

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

TRIM (rapikan kedua sisi):

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

ATAU

Ekspresi reguler juga tersedia yang dapat kita gunakan.

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

Penjelasan yang Berguna

shiv.mymail
sumber
3
Mencari sekolah tua Anda dan menghancurkan kode tidak menangani \t, \r, \ndan semacamnya. Hanya spaces. Regexp lebih baik jika Anda merasa tidak benar-benar berupaya untuk menangani semuanya secara manual.
CodeAngry
4

Kami bisa mendapatkan kode resmi Dari internet! Lihat ini:

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

Menjalankan kode berikut sebelum kode lain akan membuat trim () jika tidak tersedia secara asli.

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

untuk lebih lanjut: Saya baru saja menemukan ada proyek js untuk mendukung EcmaScript 5: https://github.com/es-shims/es5-shim dengan membaca kode sumber, kita bisa mendapatkan lebih banyak pengetahuan tentang 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);
Will V King
sumber
3

Saya tidak berpikir ada trim()metode asli dalam standar JavaScript. Mungkin Mozilla memasok satu, tetapi jika Anda menginginkannya di IE, Anda harus menulis sendiri. Ada beberapa versi di halaman ini .

JW.
sumber
3

Saya memiliki masalah yang sama di IE9 Namun ketika saya menyatakan versi html yang didukung dengan tag berikut di baris pertama sebelum

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

Masalahnya telah diatasi.

Menandai
sumber
1

Ini karena kesalahan ketik getElementBy ID . Ubah untuk getElementById

Jobelle
sumber
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);
}
Dhaval dave
sumber
1
Mengapa melakukan perulangan ketika Anda dapat menggunakan penggantian sederhana, juga sangat buruk ketika waktu sangat penting, coba panggil metode ini 200 kali pada teks ukuran rata-rata dan panggil implementasi lain yang disediakan oleh jQuery dan Anda akan melihat apa yang saya bicarakan: )
Dany Khalife
1
Karena dalam beberapa kasus, loop lebih cepat daripada regexp. Lihat tautan yang diposting JW dalam jawabannya untuk beberapa tolok ukur, terutama komentar di sana (karena tolok ukur asli sudah cukup lama).
Eric
0

Baru tahu bahwa IE berhenti mendukung trim(), mungkin setelah pembaruan windows baru-baru ini. Jika Anda menggunakan dojo, Anda bisa menggunakannya dojo.string.trim(), itu berfungsi lintas platform.

David Zhao
sumber
0

Masalah ini dapat disebabkan oleh IE menggunakan mode kompatibilitas di situs intranet. Ada dua cara untuk menyelesaikan ini, Anda dapat memperbarui IE untuk tidak menggunakan mode kompatibilitas pada mesin lokal Anda (di IE11: Tools-> Pengaturan Tampilan Kompatibilitas -> Hapus centang Tampilkan situs intranet di Tampilan Kompatibilitas)

Lebih baik lagi Anda dapat memperbarui meta tag di halaman web Anda. Menambahkan:

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

Apa artinya ini? Ia memberi tahu IE untuk menggunakan mode kompatibilitas terbaru. Informasi lebih lanjut tersedia di MSDN: Menentukan mode dokumen lawas

FuzzyJulz
sumber