.trim () trong JavaScript không hoạt động trong IE


460

Tôi đã thử áp dụng .trim()một chuỗi trong một trong các chương trình JavaScript của mình. Nó hoạt động tốt trong Mozilla, nhưng một lỗi sẽ hiển thị khi tôi dùng thử trong IE8. Có ai biết những gì đang xảy ra ở đây? Có cách nào tôi có thể làm cho nó hoạt động trong IE không?

mã:

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

hiển thị lỗi:

Thông báo: Đối tượng không hỗ trợ thuộc tính hoặc phương thức này
Dòng: 604
Char: 2
Mã số: 0
URI: http: //test.localhost/test.js

2
Tôi không thể thấy những gì được lưu trữ trên máy tính của bạn. Bạn có thể tải test.js lên một trang web lưu trữ không? Ngoài ra, tôi cần xem hàm trim () thực tế để xem có gì sai. Cảm ơn!
Chiến tranh

6
@ItzWarty "whatever ".trim()hãy thử điều đó trên IE8.
Dan Rosenstark


8
Tôi đã tương thích với IE8 trim()và không tin vào mắt mình khi tôi phát hiện ra nó không được hỗ trợ. Cảm ơn đã xóa nó ra. Tôi sẽ hỏi giống như bạn hỏi.
Mathias Lykkegaard Lorenzen

Câu trả lời:


773

Thêm mã sau đây để thêm chức năng cắt cho chuỗi.

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

8
Câu trả lời tốt. Lưu ý rằng replace(/^\s\s*/, '').replace(/\s\s*$/, '')phải nhanh hơn khoảng 3 lần so với replace(/^\s+|\s+$/, '')Firefox 2, theo một điểm chuẩn: blog.stevenlevithan.com/archives/faster-trim-javascript
Daniel Vassallo

92
Cũng lưu ý rằng replace(/^\s+|\s+$/, '')chỉ xóa các khoảng trắng ở đầu hoặc cuối, đây không phải là hành vi được mong đợi từ chức năng cắt. Nếu bạn muốn loại bỏ cả không gian hàng đầu và dấu vết bạn cần sử dụng replace(/^\s+|\s+$/g, '').
Massimiliano Fliri

1
Có vẻ hơi ngớ ngẩn với tôi. Không phải mọi khung công tác js đều cung cấp hàm trim () tiện ích? Nếu đây là vấn đề duy nhất bạn gặp phải, thì tốt thôi, nhưng có rất nhiều cách mà IE "khác biệt" sẽ khiến thư viện trở nên đáng giá trong thời gian ngắn.
Stephen

6
@Stephen Có bạn đúng, nhưng câu hỏi không phải là về khung. đó là về javascript & trim.
Ben Rowe

3
Đây là một giải pháp tốt nếu bạn không sử dụng jQuery. Nhưng nếu không, $ .trim () dường như là một giải pháp tốt hơn nhiều, vì nó giữ cho tập lệnh của bạn đơn giản hơn một chút.
NLemay

203

Có vẻ như chức năng đó không được triển khai trong IE. Nếu bạn đang sử dụng jQuery, bạn có thể sử dụng $.trim()thay thế ( http://api.jquery.com/jQuery.trim/ ).


17
Bây giờ, tôi yêu jQuery, nhưng việc nhập nó chỉ với .trim () có vẻ quá mức
Erik

71
Tôi đồng ý. Đó là lý do tại sao tôi nói "nếu bạn đang sử dụng jQuery ..." =)
jrummell

@Erik đây có phải là vấn đề IE duy nhất mà Jin sẽ gặp phải không? Không có nhiều javascript hữu ích tôi có thể viết mà không phải sử dụng các chức năng khử trùng trình duyệt của thư viện.
Stephen

8
Xin lưu ý rằng $ .trim () khác với $ (<phần tử> .val (). Trim () - thông tin thêm ở đây: stackoverflow.com/questions/4315570/
Lỗi

57

jQuery:

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

Ai đó sử dụng $("#mycomment").val().trim();nhưng điều này sẽ không hoạt động trên IE.


1
Cảm ơn bạn đã có một câu trả lời hoàn hảo đã cứu chúng tôi nhiều vấn đề đau đầu ở đây trên Trình duyệt cũ
rách nát đáng sợ này

1
Một ví dụ tuyệt vời về lý do tại sao jQuery.
Andrew Plummer

Đó có phải là phương pháp chéo trình duyệt không, thưa ông?
toha

2
@toha, trở thành trình duyệt chéo là một trong những điều quan trọng về jQuery
Raystorm

Đúng thưa ngài. Tôi đoán. Cảm ơn
toha

34

Thật không may, không có hỗ trợ JavaScript trên trình duyệt chéo cho trim ().

Nếu bạn không sử dụng jQuery (có phương thức .trim ()), bạn có thể sử dụng các phương thức sau để thêm hỗ trợ cắt cho chuỗi:

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

Tôi gặp vấn đề tương tự khi cố gắng cắt một giá trị từ đầu vào và sau đó hỏi xem nó có bằng không:

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

Tuy nhiên, điều này đã tạo ra một cờ lê trong các tác phẩm cho IE6 - 8. Thật khó chịu, tôi đã cố gắng thay đổi nó như vậy:

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

Tuy nhiên, sử dụng phương pháp cắt của jQuery, hoạt động hoàn hảo đối với tôi trong tất cả các trình duyệt ..

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

5

Tôi đã viết một số mã để thực hiện chức năng cắt.

LTRIM (cắt trái):

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

RTRIM (cắt phải):

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

TRIM (cắt cả hai mặt):

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

HOẶC LÀ

Biểu thức thông thường cũng có sẵn mà chúng ta có thể sử dụng.

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

Giải thích hữu ích


3
Tìm kiếm trường cũ của bạn và tiêu diệt mã không xử lý \t, \r, \nvà như vậy. Chỉ spaces. Regapi sẽ tốt hơn nếu bạn không cảm thấy thực sự nỗ lực để tự xử lý mọi thứ.
CodeAngry

4

Chúng tôi có thể nhận được mã chính thức từ internet! Tham khảo điều này:

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

Chạy mã sau đây trước bất kỳ mã nào khác sẽ tạo trim () nếu nó không có sẵn.

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

để biết thêm: Tôi vừa tìm thấy có dự án js để hỗ trợ EcmaScript 5: https://github.com/es-shims/es5-shim bằng cách đọc mã nguồn, chúng tôi có thể có thêm kiến ​​thức về 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

Tôi không nghĩ có một trim()phương thức riêng trong tiêu chuẩn JavaScript. Có thể Mozilla cung cấp một cái, nhưng nếu bạn muốn một cái trong IE, bạn sẽ cần phải tự viết nó. Có một vài phiên bản trên trang này .


3

Tôi gặp vấn đề tương tự trong IE9 Tuy nhiên khi tôi khai báo phiên bản html được hỗ trợ với thẻ sau trên dòng đầu tiên trước dòng

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

Vấn đề đã được giải quyết.


1

Điều này là do lỗi chính tả getEuityBy ID . Thay đổi nó thành getEuityById


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
Tại sao phải thực hiện một vòng lặp khi bạn có thể sử dụng một thay thế đơn giản, cũng rất tệ khi thời gian rất quan trọng, hãy thử gọi phương thức này 200 lần trên văn bản kích thước trung bình và gọi triển khai khác do jQuery cung cấp và bạn sẽ thấy những gì tôi đang nói về: )
Dany Khalife

1
Bởi vì trong một số trường hợp, một vòng lặp nhanh hơn một biểu thức chính quy. Xem liên kết mà JW đăng trong câu trả lời của anh ấy cho một số điểm chuẩn, đặc biệt là các nhận xét ở đó (vì điểm chuẩn ban đầu khá cũ).
Eric

0

Chỉ cần phát hiện ra rằng IE ngừng hỗ trợ trim(), có thể sau khi cập nhật Windows gần đây. Nếu bạn sử dụng võ đường, bạn có thể sử dụng dojo.string.trim(), nó hoạt động đa nền tảng.


0

Vấn đề này có thể do IE sử dụng chế độ tương thích trên các trang mạng nội bộ. Có hai cách để giải quyết vấn đề này, bạn có thể cập nhật IE để không sử dụng chế độ tương thích trên máy cục bộ của mình (trong IE11: Công cụ-> Cài đặt chế độ xem tương thích -> Bỏ chọn Hiển thị trang web mạng nội bộ trong Chế độ xem tương thích)

Tốt hơn nữa bạn có thể cập nhật các thẻ meta trong trang web của bạn. Thêm vào trong:

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

Điều đó có nghĩa là gì? Nó báo cho IE sử dụng chế độ tương thích mới nhất. Thêm thông tin có sẵn trong MSDN: Chỉ định chế độ tài liệu kế thừa

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.