Передать параметр в функцию обратного вызова - PullRequest
10 голосов
/ 02 ноября 2009

мой код

// делаем запрос ajax и получаем ответ JSON

for (var i = 0; i < data.results.length; i++) {  
    result = data.results[i];
    // do stuff and create google maps marker    
    marker = new google.maps.Marker({  
        position: new google.maps.LatLng(result.lat, result.lng),   
        map: map,  
        id: result.id  
    });  
    google.maps.event.addListener(marker, 'click', function() {  
        createWindow(marker.id); //<==== this doesn't work because marker always points to the last results when this function is called
    });  

}

Как это решить?

Ответы [ 4 ]

24 голосов
/ 03 ноября 2009

Попробуйте это:

with ({ mark: marker }) {
    google.maps.event.addListener(mark, 'click', function() {  
        createWindow(mark.id);
    });
}

Пример, демонстрирующий использование with:

for (var i = 0; i < 10; i++) {
    setTimeout(function() { console.log(i); }, 1000);
}

Выше будет протоколировать 10 десять раз.

for (var i = 0; i < 10; i++) {
    with ({ foo: i }) {
        setTimeout(function() { console.log(foo); }, 1000);
    }
}

Это будет регистрировать 0 до 9, по желанию, благодаря with, вводящему новую область.

JavaScript 1.7 имеет оператор let, который лучше, но пока он не получил широкой поддержки, вы можете использовать with.

И используйте var для своих переменных.

4 голосов
/ 02 ноября 2009

Классическая проблема закрытия снова наносит удар!

  google.maps.event.addListener(marker, 'click', function(id) {
    return function(){
      createWindow(id); //<==== this doesn't work because marker always points to the last results when this function is called
    }
  }(marker.id));     
1 голос
/ 01 августа 2013

попробуйте это

var marker = new Array();
for (var i = 0; i < data.results.length; i++) {  
    result = data.results[i];
    // do stuff and create google maps marker    
    marker[i] = new google.maps.Marker({  
        position: new google.maps.LatLng(result.lat, result.lng),   
        map: map,  
        id: result.id  
    });  
    google.maps.event.addListener(marker[i], 'click', example(marker[i].id));  

}

создать новую функцию

function example(my_window){
    return function(){
        createWindow(my_window);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...