JavaScript'te .trim () IE'de çalışmıyor


460

Başvurmaya çalıştım .trim()JavaScript programlarımdan birinde bir dizeye . Mozilla altında iyi çalışıyor, ancak IE8'de denediğimde bir hata görüntüleniyor. Burada neler olduğunu bilen var mı? IE'de çalıştırabilir yine de var mı?

kod:

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

hata göstergesi:

İleti: Nesne bu özelliği veya yöntemi desteklemiyor
Satır: 604
Karakter: 2
Kod: 0
URI: http: //test.localhost/test.js

2
Bilgisayarınızda nelerin depolandığını göremiyorum. Test.js'yi bir depolama web sitesine yükleyebilir misiniz? Ayrıca, neyin yanlış olduğunu görmek için gerçek trim () işlevini görmem gerekiyor. Teşekkürler!
Warty

6
@ItzWarty "whatever ".trim()bunu IE8'de deneyin.
Dan Rosenstark


8
IE8 uyumluluğu için Googled trim()ve desteklenmediğini anladığımda gözlerime inanmazdım. Temizlediğiniz için teşekkürler. Sorduğun gibi soracaktım.
Mathias Lykkegaard Lorenzen

Yanıtlar:


773

Dizeye kırpma işlevi eklemek için aşağıdaki kodu ekleyin.

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

8
İyi cevap. Bir karşılaştırmaya göre, Firefox 2'den replace(/^\s\s*/, '').replace(/\s\s*$/, '')yaklaşık 3 kat daha hızlı olması gerektiğini unutmayın replace(/^\s+|\s+$/, ''): blog.stevenlevithan.com/archives/faster-trim-javascript
Daniel Vassallo

92
Ayrıca, replace(/^\s+|\s+$/, '')yalnızca kesme işlevinden beklenen davranış olmayan ön veya arka boşlukları da kaldırdığına dikkat edin. Hem önde gelen hem de arkadaki boşlukları kaldırmak istiyorsanız kullanmanız gerekir replace(/^\s+|\s+$/g, '').
Massimiliano Fliri

1
Bana biraz aptalca geliyor. Her js çerçevesi bir yardımcı program trim () işlevi sağlamaz mı? Bu tek sorun varsa, o zaman para cezası, ama IE "farklı" bir yolu vardır kısa vadede bir süre değer bir kütüphane yapacak.
Stephen

6
@Stephen Evet haklısınız, ancak soru çerçevelerle ilgili değil. javascript & trim ile ilgili.
Ben Rowe

3
JQuery kullanmıyorsanız bu iyi bir çözümdür. Ama değilse, $ .trim () çok daha iyi bir çözüm gibi görünüyor, çünkü senaryonuzu biraz daha basit tutuyor.
NLemay

203

Bu işlev IE'de uygulanmamış gibi görünüyor. JQuery kullanıyorsanız, $.trim()bunun yerine kullanabilirsiniz ( http://api.jquery.com/jQuery.trim/ ).


17
Şimdi, jQuery'yi seviyorum, ama sadece .trim () için içe aktarma overkill gibi görünüyor
Erik

71
Katılıyorum. Bu yüzden dedim ki "jQuery kullanıyorsanız ..." =)
jrummell

@Erik bu Jin'in karşılaşacağı tek IE sorunu mu olacak? Bir kütüphanenin tarayıcı temizleme işlevlerini kullanmak zorunda kalmadan yazabileceğim pek çok kullanışlı javascript yok.
Stephen

8
Not $ .trim () o $ dan fark olduğunu lütfen (<eleman> .val () () Döşeme - Daha fazla bilgi burada:. Stackoverflow.com/questions/4315570/...
sami

57

jQuery:

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

Birisi kullanır $("#mycomment").val().trim();ama bu IE üzerinde çalışmaz.


1
Bu çürük titrek eski Tarayıcı Köprüsünde bize birçok baş ağrısını kurtaran mükemmel bir cevap için teşekkür ederim :)
Awerealis

1
Neden jQuery harika bir örnek.
Andrew Plummer

Bu yöntem çapraz tarayıcı mı efendim?
toha

2
@toha, çapraz tarayıcı olmak jQuery
Raystorm

Doğru efendim. Sanırım. Teşekkürler
toha

34

Ne yazık ki trim () için çapraz tarayıcı JavaScript desteği yoktur.

JQuery (.trim () yöntemine sahip) kullanmıyorsanız, dizelere kırpma desteği eklemek için aşağıdaki yöntemleri kullanabilirsiniz:

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

Bir girişten bir değeri kesip sonra hiçbir şeye eşit olup olmadığını sormaya çalışırken benzer bir sorun vardı:

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

Ancak bu IE6 - 8 çalışmalarında bir somun anahtarı attı.

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

Ancak, jQuery trim yöntemini kullanarak, tüm tarayıcılarda benim için mükemmel çalışır.

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

5

Trim işlevselliğini uygulamak için bazı kodlar yazdım.

LTRIM (sola kırpma):

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

RTRIM (sağa kırpma):

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

TRIM (her iki tarafı da kırpın):

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

VEYA

Kullanabileceğimiz düzenli ifade de mevcuttur.

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

Yararlı Açıklama


3
Eski okul arama ve işlemez kodu yok \t, \r, \nve bu tür. Sadece spaces. Regexp, her şeyi manuel olarak ele alma çabasını gerçekten hissetmiyorsanız daha iyidir.
CodeAngry

4

Resmi kodu internetten alabiliriz! Şuna bakın:

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

Yerel olarak kullanılamıyorsa, aşağıdaki kodu başka bir koddan önce çalıştırmak trim () oluşturur.

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

daha fazla bilgi için: EcmaScript 5'i desteklemek için js projesi olduğunu gördüm: https://github.com/es-shims/es5-shim kaynak kodunu okuyarak, trim hakkında daha fazla bilgi edinebiliriz.

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 standardında yerel bir yöntem olduğunu düşünmüyorum . Belki Mozilla bir tane tedarik eder, ancak IE'de bir tane istiyorsanız, kendiniz yazmanız gerekir. Bu sayfada birkaç sürüm var .


3

Ben IE9 aynı sorunu vardı Ancak ben desteklenen ilk html sürümü aşağıdaki ilk satırda aşağıdaki etiketi ile ilan

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

Sorun çözüldü.


1

Bunun nedeni getElement getElementBy ID hatasıdır . GetElementById için değiştirin


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
Neden basit bir değiştirmeyi kullanabileceğiniz bir döngü yapıyorsunuz, zaman çok dikkatli olduğunda da çok kötü, bu yöntemi ortalama boyut metninde 200 kez çağırmayı ve jQuery tarafından sağlanan diğer uygulamayı çağırmayı deneyin ve neden bahsettiğimi göreceksiniz: )
Dany Khalife

1
Çünkü bazı durumlarda döngü normal ifadeden daha hızlıdır. JW'nin bazı kıyaslamalar için cevabında yayınladığı bağlantıya, özellikle de oradaki yorumlara bakın (orijinal kıyaslama oldukça eski olduğundan).
Eric

0

trim()Muhtemelen son bir Windows güncellemesinden sonra IE'nin desteklemeyi bıraktığını öğrendim . Dojo kullanıyorsanız dojo.string.trim(), kullanabilirsiniz , çapraz platformda çalışır.


0

Bu sorun, intranet sitelerinde uyumluluk modunu kullanan IE'den kaynaklanabilir. Bunu çözmenin iki yolu vardır: IE'yi yerel makinenizde uyumluluk modunu kullanmayacak şekilde güncelleyebilirsiniz (IE11'de: Araçlar-> Uyumluluk Görünümü Ayarları -> Uyumluluk Görünümü'nde Görüntü intranet sitelerinin işaretini kaldırın)

Daha da iyisi, web sayfanızdaki meta etiketleri güncelleyebilirsiniz. Ekle:

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

Ne anlama geliyor? IE'ye en son uyumluluk modunu kullanmasını söylüyor. MSDN'de daha fazla bilgi bulunmaktadır : Eski belge modlarını belirleme

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.