.trim () ใน JavaScript ไม่ทำงานใน IE


460

ฉันพยายามนำไปใช้.trim()กับสตริงในหนึ่งในโปรแกรม JavaScript ของฉัน มันทำงานได้ดีภายใต้ Mozilla แต่ข้อผิดพลาดจะปรากฏขึ้นเมื่อฉันลองใน IE8 ไม่มีใครรู้ว่าเกิดอะไรขึ้นที่นี่ ฉันสามารถใช้งาน IE ได้ไหม

รหัส:

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

แสดงข้อผิดพลาด:

ข้อความ: วัตถุไม่สนับสนุนคุณสมบัติหรือวิธีการนี้
บรรทัด: 604
Char: 2
รหัส: 0
URI: http: //test.localhost/test.js

2
ฉันไม่เห็นสิ่งที่เก็บไว้ในคอมพิวเตอร์ของคุณ คุณสามารถอัพโหลด test.js ไปยังเว็บไซต์พื้นที่จัดเก็บได้หรือไม่? นอกจากนี้ฉันต้องดูฟังก์ชัน trim () จริงเพื่อดูว่ามีอะไรผิดปกติ ขอบคุณ!
Warty

6
@ItzWarty "whatever ".trim()ลองดูที่ IE8
Dan Rosenstark


8
ฉัน Googled สำหรับความเข้ากันได้กับ IE8 สำหรับtrim()และจะไม่เชื่อสายตาของฉันเมื่อฉันรู้ว่ามันไม่ได้รับการสนับสนุน ขอบคุณสำหรับการล้างออก ฉันจะถามเหมือนที่คุณถาม
Mathias Lykkegaard Lorenzen

คำตอบ:


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+$/, '')ใน Firefox 2 อ้างอิงตามมาตรฐาน: blog.stevenlevithan.com/archives/faster-trim-javascript
Daniel Vassallo

92
โปรดทราบว่าreplace(/^\s+|\s+$/, '')จะลบเฉพาะช่องว่างนำหน้าหรือส่วนท้ายเท่านั้นซึ่งไม่ใช่ลักษณะการทำงานที่คาดไว้จากฟังก์ชันการตัดแต่ง replace(/^\s+|\s+$/g, '')หากคุณต้องการที่จะลบทั้งพื้นที่ชั้นนำและต่อท้ายที่คุณจำเป็นต้องใช้
Massimiliano Fliri

1
ดูเหมือนจะโง่ไปหน่อยสำหรับฉัน กรอบ js ทุกตัวมีฟังก์ชั่นอรรถประโยชน์ trim () หรือไม่ หากนี่เป็นปัญหาเดียวที่คุณมีอยู่ก็โอเค แต่มีหลายวิธีที่ IE "แตกต่าง" ซึ่งจะทำให้ห้องสมุดคุ้มค่าในขณะที่อยู่ในระยะสั้น
สตีเฟ่น

6
@ สตีเฟ่นใช่คุณถูกต้อง แต่คำถามไม่ได้เกี่ยวกับกรอบ มันเกี่ยวกับ javascript & trim
Ben Rowe

3
นี่เป็นทางออกที่ดีถ้าคุณไม่ใช้ jQuery แต่ถ้าไม่ใช่ $. trim () ดูเหมือนจะเป็นทางออกที่ดีกว่ามากเพราะมันทำให้สคริปต์ของคุณง่ายขึ้นเล็กน้อย
NLemay

203

ดูเหมือนว่าฟังก์ชั่นนั้นจะไม่ได้รับการติดตั้งใน IE หากคุณใช้ jQuery คุณสามารถใช้$.trim()แทน ( http://api.jquery.com/jQuery.trim/ )


17
ตอนนี้ฉันรัก jQuery แต่การนำเข้าเพียงเพื่อ. trim () ดูเหมือนจะเกินความเป็นจริง
Erik

71
ฉันเห็นด้วย. นั่นเป็นเหตุผลที่ฉันพูดว่า "ถ้าคุณใช้ jQuery ... " =)
jrummell

@Erik นี่จะเป็นปัญหา IE เดียวที่จินจะพบใช่ไหม จาวาสคริปต์ที่มีประโยชน์มีไม่มากที่ฉันสามารถเขียนได้โดยไม่ต้องใช้ฟังก์ชั่นการกำจัดเบราว์เซอร์ของห้องสมุด
สตีเฟ่น

8
โปรดทราบว่า $. trim () แตกต่างจาก $ (<element> .val (). trim () - ข้อมูลเพิ่มเติมที่นี่: stackoverflow.com/questions/4315570/…
sami

57

jQuery:

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

มีคนใช้$("#mycomment").val().trim();แต่จะไม่ทำงานบน IE


1
ขอบคุณสำหรับคำตอบที่สมบูรณ์แบบซึ่งมีการบันทึกเราปวดหัวมากที่นี่เกี่ยวกับเรื่องนี้เน่าสั่นคลอนเก่าเบราว์เซอร์สะพาน :)
Awerealis

1
ตัวอย่างที่ดีว่าทำไม jQuery
Andrew Plummer

นั่นเป็นวิธีข้ามเบราว์เซอร์ครับ?
toha

2
@toha การเป็นเบราว์เซอร์ข้ามเป็นหนึ่งในสิ่งสำคัญเกี่ยวกับjQuery
Raystorm

ถูกต้องครับ ฉันคิดว่า. ขอบคุณ
toha

34

น่าเสียดายที่ไม่มีการสนับสนุนจาวาสคริปต์สำหรับเบราว์เซอร์ข้าม ()

หากคุณไม่ได้ใช้ 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 originalValue = $(this).val();

อย่างไรก็ตามการใช้วิธีการตัดแต่งของ jQuery ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันในเบราว์เซอร์ทั้งหมด ..

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

4

เราสามารถรับรหัสอย่างเป็นทางการจากอินเทอร์เน็ต! แนะนำสิ่งนี้:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/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, '');
    };
  })();
}

มาก: ฉันเพิ่งพบว่ามีโครงการ js สำหรับการสนับสนุน EcmaScript 5: 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>...
.
.

ปัญหาได้รับการแก้ไขแล้ว



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
เพราะในบางกรณีการวนซ้ำเร็วกว่า regexp ดูลิงค์ที่ JW โพสต์ในคำตอบของเขาสำหรับการวัดประสิทธิภาพโดยเฉพาะความคิดเห็นที่มี (เนื่องจากมาตรฐานเดิมค่อนข้างเก่า)
Eric

0

เพิ่งพบว่า IE หยุดการสนับสนุนtrim()อาจเป็นหลังจากการอัปเดต windows ล่าสุด หากคุณใช้ dojo คุณสามารถใช้dojo.string.trim()มันทำงานข้ามแพลตฟอร์ม


0

ปัญหานี้อาจเกิดจาก IE โดยใช้โหมดความเข้ากันได้บนไซต์อินทราเน็ต มีสองวิธีในการแก้ไขปัญหานี้คุณสามารถอัปเดต 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.