.trim () у JavaScript не працює в IE


460

Я спробував застосувати .trim()рядок в одній із моїх програм JavaScript. У Mozilla він працює добре, але з’являється помилка, коли я спробую це в IE8. Хтось знає, що тут відбувається? Чи все-таки я можу змусити його працювати в IE?

код:

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

відображення помилок:

Повідомлення: Об'єкт не підтримує цю властивість чи метод
Рядок: 604
Чар: 2
Код: 0
URI: http: //test.localhost/test.js

2
Я не бачу, що зберігається на вашому комп’ютері. Чи можете ви завантажити файл test.js на веб-сайт сховища? Також мені потрібно переглянути фактичну функцію trim (), щоб побачити, що не так. Дякую!
Warty

6
@ItzWarty "whatever ".trim()спробуйте це на IE8.
Дан Розенстарк


8
Я шукав сумісність з IEG8 для 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
Даніель Вассалло

92
Зауважте також, що replace(/^\s+|\s+$/, '')видаляються лише провідні чи кінцеві пробіли, що не є поведінкою, яка очікується від функції обрізки. Якщо ви хочете видалити як провідні, так і проміжні пробіли, які потрібно використовувати replace(/^\s+|\s+$/g, '').
Массіміліано Флірі

1
Здається мені трохи нерозумно. Чи не кожен js фреймворк забезпечує функцію обрізки () утиліти? Якщо це єдине питання, яке ви маєте, то добре, але Є багато способів того, що IE є "різним", що зробить бібліотеку вартістю в короткий термін.
Стівен

6
@Stephen Так, ти прав, але питання не в рамках. йдеться про javascript & trim.
Бен Роу

3
Це гарне рішення, якщо ви не використовуєте jQuery. Але якщо ні, $ .trim () здається набагато кращим рішенням, оскільки він робить ваш сценарій трохи простішим.
NLemay

203

Схоже, що ця функція не реалізована в IE. Якщо ви використовуєте jQuery, ви можете використовувати його $.trim()замість ( http://api.jquery.com/jQuery.trim/ ).


17
Зараз я люблю jQuery, але імпорт його лише для .trim () здається непосильним
Ерік,

71
Я згоден. Ось чому я сказав "якщо ви використовуєте jQuery ..." =)
jrummell

@ Ерік це буде єдиною проблемою IE, з якою збирається зіткнутися Джин? Немало корисного JavaScript, який я можу писати, не використовуючи функції дезінфекції браузера бібліотеки.
Стівен

8
Зауважте, що $ .trim () відрізняється від $ (<element> .val (). Trim () - більше інформації тут: stackoverflow.com/questions/4315570/…
самі

57

jQuery:

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

Хтось використовує, $("#mycomment").val().trim();але це не працює на IE.


1
Дякую за ідеальну відповідь, яка врятувала нам багато головних болів тут, на цьому гнилому хиткому старому браузерному мосту :)
Awerealis

1
Чудовий приклад того, чому jQuery.
Ендрю Пламмер

Це метод крос-браузера, сер?
тога

2
@toha, перехресний браузер - одна з ключових речей про jQuery
Raystorm

Виправте сер. Я вважаю. Спасибі
toha

34

На жаль, для веб-переглядача JavaScript підтримка trim () не існує.

Якщо ви не використовуєте 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>...
.
.

Проблема була вирішена.


1

Це через помилку помилки друку getElementBy ID . Змініть його на 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
Навіщо робити цикл, коли ви можете використовувати просту заміну, також її дуже погано, коли час є критичним, спробуйте зателефонувати цьому методу в 200 разів середнього розміру тексту та викликати іншу реалізацію, надану jQuery, і ви побачите, про що я говорю: )
Dany Khalife

1
Тому що в деяких випадках цикл швидше, ніж повторне виведення. Дивіться посилання, яке JW розмістив у своїй відповіді на деякі орієнтири, особливо коментарі там (оскільки початковий показник досить старий).
Ерік

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: Вказання застарілих режимів документування

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.