Javascript substr问题

Ozi*_*aev 1 javascript

我正在尝试创建一个跨浏览器animationListener,并且该substr函数存在问题!

function animationEventListener(elem, listener, callback){
       if(!elem){return;}

    if(listener.length < 0){ console.error("Add event type listener"); }

    listener = listener.toLowerCase();

    var _prefix = ["", "o", "webkit", "MS"];
    var _anmkeyword = new String("animation");
    var _keywordlength = _anmkeyword.length;
    var _nlistener;

    for(var i = 0; i < 4; i++){
        if(_prefix[i] == "MS" || _prefix[i] == "webkit"){
            var _ol = _keywordlength + 1;
            _nlistener = listener.substr(0, 1).toUpperCase() 
                + listener.substr(1, listener.length - (listener.length - _keywordlength)-1) 
                + listener.substr(9, 10).toUpperCase() 
                + listener.substr(_keywordlength+1, listener.length);
        }    
        console.log(_prefix[i] + listener + "\n" + _nlistener);
    }

}
Run Code Online (Sandbox Code Playgroud)

试试你看到:

 listener = "animationend";
 listener.substr(9, 10);    // returns "end";
Run Code Online (Sandbox Code Playgroud)

为什么?

Lix*_*Lix 6

substr函数的第二个参数是要提取的字符数(长度).第一个参数设置从哪里开始.您可以在文档中阅读更多内容.

所以你的代码行:listener.substr( 9, 10 );基本上说"从第9个索引给我10个字符".但是,由于在第9个索引之后根本没有10个字符,因此该命令将返回它可以执行的所有字符串的其余部分.

要在第9个索引之后只提取一个字符,您只需使用以下命令:

listener.substr( 9, 1 );
Run Code Online (Sandbox Code Playgroud)

或者,如果要在两个索引之间提取字符串,可以使用以下substring()函数:

listener.substring( 9, 10 );
Run Code Online (Sandbox Code Playgroud)


Mar*_*der 5

substr和之间的区别substring是:

text.substr(a, b); //a=index to start, b=amount of letters to capture

text.substring(a, b); //a=index to start, b=index to stop 
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下你可以使用:

listener.substr(9, 1); 
Run Code Online (Sandbox Code Playgroud)

要么

listener.substring(9, 10);
Run Code Online (Sandbox Code Playgroud)