Javascript Array addEventListener

前端 未结 2 907
闹比i
闹比i 2021-01-06 11:52

Interactive map with buttons in the shape of states, each button has the state abbreviation as an id, when a button/state is clicked I would like to fire the function \"stat

相关标签:
2条回答
  • 2021-01-06 12:26

    You have a scoping issue. Javascript is not block-scoped; it is function-scoped. Basically, you must create a new function whenever you wish to create a new variable in a loop.

    The most elegant way to do so is as follows:

    stateList.map(function(abbrev){
        $(abbrev).mousedown(function(){stateSelect(abbrev)});
    });
    

    If you are not using jQuery, merely replace $(abbrev).mousedown with document.getElementById(abbrev).addEventListener.

    (Just to preempt the people who go "map isn't standard"; it is in the javascript ECMA-262 standard 5th edition which has support from all browser vendors. If one is paranoid about supporting older browsers, one can just $.map.)

    Here is how one would do so using a for loop; it's a bit uglier but it demonstrates the necessity of creating new closures via functions:

    for(var i=0; i<stateList.length; i++)
        (function(i){
            $(stateList[i]).mousedown(...);
        })(i);
    

    Like I said, a bit uglier than necessary; you could also do this which is slightly less ugly, but is basically the same thing:

    function createListener(abbrev) {
        $(abbrev).mousedown(...);
    }
    for(var i=0; i<stateList.length; i++)
        createListener(stateList[i]);
    
    0 讨论(0)
  • 2021-01-06 12:43

    Because when the handler runs, it looks up the value of i, which is wherever it was after the loop finished.

    You need to scope the i variable in a function:

    function listenerForI( i ) {
        document.getElementById(stateList[i]).addEventListener('mousedown', function() {stateSelect(stateList[i])}, false);
    }
    for (var i = 0; i < stateList.length; i++) {
        listenerForI( i );
    }
    

    Now the i referenced by the handler will be the parameter to the listenerForI function that was invoked. As such, that i will reference the value that was passed in from the for loop.

    0 讨论(0)
提交回复
热议问题