[英]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.