سؤال

رمز بلدي

// قم بطلب 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
    });  

}

كيفية حل هذا؟

هل كانت مفيدة؟

المحلول

جرب هذا:

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 تقديم نطاق جديد.

جافا سكريبت 1.7 لديه let البيان الذي هو أجمل، ولكن حتى يتم دعم ذلك على نطاق واسع، يمكنك استخدام with.

واستخدام var لمتغيراتك.

نصائح أخرى

ال مشكلة الإغلاق الكلاسيكي تضرب مرة ثانية!

  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));     

جرب هذه

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);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top