Функция JavaScript string.format не работает в IE - PullRequest
3 голосов
/ 28 января 2010

У меня есть JavaScript из этого источника в комментарии к блогу: frogsbrain

Это формататор строк, и он отлично работает в Firefox, Google Chrome, Opera и Safari. Единственная проблема в IE, где скрипт не заменяет вообще. Вывод в обоих тестовых случаях в IE только «привет», ничего более.

Пожалуйста, помогите мне заставить этот скрипт работать в IE, потому что я не гуру Javascript и просто не знаю, с чего начать поиск проблемы.

Я опубликую сценарий здесь для удобства. Все кредиты пока идут на Теренс Хонлес за сценарий.

// usage:
// 'hello {0}'.format('world');
// ==> 'hello world'
// 'hello {name}, the answer is {answer}.'.format({answer:'42', name:'world'});
// ==> 'hello world, the answer is 42.'
String.prototype.format = function() {
    var pattern = /({?){([^}]+)}(}?)/g;
    var args = arguments;

    if (args.length == 1) {
        if (typeof args[0] == 'object' && args[0].constructor != String) {
            args = args[0];
        }
    }

    var split = this.split(pattern);
    var sub = new Array();

    var i = 0;
    for (;i < split.length; i+=4) {
        sub.push(split[i]);
        if (split.length > i+3) {
            if (split[i+1] == '{' && split[i+3] == '}')
                sub.push(split[i+1], split[i+2], split[i+3]);
            else {
                sub.push(split[i+1], args[split[i+2]], split[i+3]);
            }
        }
    }

    return sub.join('')
}

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Я думаю, что проблема в этом.

var pattern = /({?){([^}]+)}(}?)/g;
var split = this.split(pattern);

Функция разделения регулярных выражений Javascript в IE действует иначе, чем в других браузерах.

Пожалуйста, посмотрите мой другой пост в SO

1 голос
/ 28 января 2010

var split = this.split (pattern);

string.split(regexp) во многих случаях нарушается в IE (JScript) и обычно его лучше избегать. В частности:

  • он не включает группы совпадений в выходной массив
  • пропускает пустые строки

    alert ('abbc'.split (/ (b) /)) // a, c

Казалось бы, проще использовать replace, чем split:

String.prototype.format= function(replacements) {
    return this.replace(String.prototype.format.pattern, function(all, name) {
        return name in replacements? replacements[name] : all;
    });
}
String.prototype.format.pattern= /{?{([^{}]+)}}?/g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...