繁体   English   中英

如何从函数内部设置javascript变量?

[英]How to set javascript variable from the inside of a function?

请看下面的代码。 当i == 0的值时,警报1根据逻辑打印变量值。 但是,如果我尝试打印值(警报2),它只会显示“ undefined,undefined”。 我的问题是,要使第二个警报(警报2)中的值与警报1相同,我将需要进行哪些更改?

var testPoint = [];

function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map_canvas"));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(52.5271463402545, -1.50573921491311), 8, G_HYBRID_MAP);

    GDownloadUrl("controllers/gmap_genxml2.php", function(data) {
      var xml = GXml.parse(data);
      var markers = xml.documentElement.getElementsByTagName("marker");
      for (var i = 0; i < markers.length; i++) {
        if(i == 0) {
            testPoint["lat"] = parseFloat(markers[i].getAttribute("lat"));
            testPoint["lng"] = parseFloat(markers[i].getAttribute("lng"));

            /********* ALERT 1 ***********/
            alert(testPoint["lat"]+" "+testPoint["lng"]);
            /********* ALERT 1 End ***********/
        }
        var name = markers[i].getAttribute("name");
        var address = markers[i].getAttribute("address");
        var type = markers[i].getAttribute("type");
        var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                                parseFloat(markers[i].getAttribute("lng")));
        var marker = createMarker(point, name, address, type);
        map.addOverlay(marker);
      }
    });

    /********* ALERT 2 ******************/
    alert(testPoint["lat"]+" "+testPoint["lng"]);
    /********* ALERT 2 Start ***********/
  }
}

谢谢您的帮助。 迪杰

您必须意识到很多JavaScript是基于事件的。 这是正在发生的事情:

GDownloadUrl进行回调。 第二个参数是在请求完成时将调用的函数。 不会立即被调用。 这个很重要。 关闭对GDownloadUrl的调用GDownloadUrl ,Javascript继续运行。 它不等待请求完成。 实际上,如果您同时保留两个警报,您将看到警报2将在警报1之前触发。因此,如果要对这些变量进行特定处理,则应将该代码移至一个函数,然后从GDownloadUrl回调中调用它。 这只是JavaScript的工作方式,您会习惯它。

这两个对象键lat和lng仅在GDownloadUrl调用的回调函数中赋值。

您必须等待它执行一次,然后才能获得正确的值。

我建议您在此回调函数的末尾移动警报2。

您正在传递一个指向另一个函数调用的函数指针。 那不一定会使代码执行。 时间可能不对。 当调用该函数(很好)时,您的ALERT 1正在发生,但是实际上在该函数被调用之前正在执行ALERT 2!

在打印testPoint的内容之前,请尝试延迟1秒。

    testPoint = [];

    // This global var is introduced to mark that testPoint values are not yet loaded.
    var isLoaded = false;

    function load() {

    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map_canvas"));
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
        map.setCenter(new GLatLng(52.5271463402545, -1.50573921491311), 8, G_HYBRID_MAP);

    GDownloadUrl("controllers/gmap_genxml2.php", function(data) {
      var xml = GXml.parse(data);
      var markers = xml.documentElement.getElementsByTagName("marker");
      for (var i = 0; i < markers.length; i++) {
        if(i == 0) {
                testPoint["lat"] = parseFloat(markers[i].getAttribute("lat"));
                testPoint["lng"] = parseFloat(markers[i].getAttribute("lng"));

                /********* ALERT 1 ***********/
                alert(testPoint["lat"]+" "+testPoint["lng"]);
                /********* ALERT 1 End ***********/

                // Set it to true to indicate that testPoint array is already loaded.
                isLoaded = true;
        }
        var name = markers[i].getAttribute("name");
        var address = markers[i].getAttribute("address");
        var type = markers[i].getAttribute("type");
        var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                                parseFloat(markers[i].getAttribute("lng")));
        var marker = createMarker(point, name, address, type);
        map.addOverlay(marker);
      }
    });

    /********* ALERT 2 ******************/
     // Try to alert testPoint each 0.5 sec until we can successfully do it.
     function alert2() {
         // if testPoint is loaded - then alert it, if not then try in 0.5 sec.
         if (isLoaded) {
              alert(testPoint["lat"]+" "+testPoint["lng"])
         } else {
              setTimeout(alert2, 500);
         }
     };

     alert2();
    /********* ALERT 2 Start ***********/
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM