I have a situation whereby, i need to create buttons dynamically and i need to attached an onclick event to each of them.
All of the above is done fine. However, when one of the button is clicked, the function that is called i.e (animate(poly,map)) uses the last known value of poly and map as parameters.
I stuck with this problem since this morning.
Please help. Thanks
for(var k=0;k<arr_altern.length;k++){
my_div=create_div_interchange(arr[i],1,78,visited_bus,interchange_arr,arr_altern[k],null, my_interchange_array);
$('#results').append(my_div);
var x='animate';
var v='#animater';
v+=div_id;
x+=div_id;
map=create_map(div_id);
var poly=retrieve_results_edges(bus_stops_visited,map);
var strVar="";
strVar += "<span class=\"animate\">";
strVar += "<input type=\"button\" id="+x+" name=\"animate\" value=\"Animate\" \/>";
strVar += "<\/span>";
$(v).append(strVar);
document.getElementById(x).onclick=function test(){
animate(poly,map);
}
set_map(map);
set_polyline_color(my_traversed_edge,map);
}
UPDATE SOLUTION:
i've replaced
document.getElementById(x).onclick=function test(){
animate(poly,map);
}
BY
$('#'+x).bind('click',{poly:poly,map:map}, function(event) {
animate(event.data.poly,event.data.map)
});
You are declaring the
mapvariable without thevarkeyword so it’s being created in the global scope, so there is only onemapvariable that gets it’s value over-written each loop.Running your code inside of an IIFE (Immediately-Invoked Function Expression) will create a new scope for the code within it. This allows you to declare variables at the time of running and they will hold their value into the future (for instance they will be available to event handlers that fire in the future). Notice I used the
varkeyword when declaring all the variables so they are created in the current scope.Update
You could also use
$.each()to scope your code: