代码之家  ›  专栏  ›  技术社区  ›  Sebastian P.R. Gingter

javascript string.format函数在IE中不起作用

  •  3
  • Sebastian P.R. Gingter  · 技术社区  · 14 年前

    我在博客评论中有一个来自此源的javascript: frogsbrain

    它是一个字符串格式化程序,在Firefox、Google Chrome、Opera和Safari中运行良好。 唯一的问题是在IE中,脚本根本没有替换。在IE中,两个测试用例的输出都只是“hello”,没有更多。

    请帮助我让这个脚本在IE中工作,因为我不是JavaScript专家,我只是不知道从哪里开始搜索这个问题。

    为了方便起见,我会把剧本贴在这里。所有学分转到 Terence Honles 到目前为止的剧本。

    // 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 回复  |  直到 14 年前
        1
  •  3
  •   Community Paul Sweatte    7 年前

    我认为问题出在这个问题上。

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

    javascript的regex split函数在IE中的作用与其他浏览器不同。

    请看一下我的另一个 post 在这样

        2
  •  1
  •   bobince    14 年前

    var split=this.split(模式);

    string.split(regexp) 在IE(JScript)上以许多方式被破坏,通常最好避免。特别地:

    • 它不包括输出数组中的匹配组
    • 它省略了空字符串

      alert('a b b c'.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;