台灣最大程式設計社群網站
線上人數
1572
 
會員總數:241330
討論主題:186904
歡迎您免費加入會員
討論區列表 >> Java Script/ Node.js >> alert只呼叫1次卻自動執行2次,而且值不同
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
alert只呼叫1次卻自動執行2次,而且值不同
價值 : 80 QP  點閱數:123 回應數:1

樓主

黃若雅
門外漢
0 1
10 0
發送站內信

最近在寫JavaScript時,發現一些問題。我想在google map上標點,並顯示一些資訊,但一直無法成功,我是在getloc(temp)函式中定義資訊,temp是從其他地方取得的值。目前是用alert(temp),它會執行2次,一次的值是undefined,另一次則是正確[code]值,此方法可以讓標點位置的視窗畫面產生正確資訊。但我希望能不要使用alert,但如果不使用,則視窗會顯示undefined,想請問一下該怎麼解決?

[code]
<!doctype html>
<html>
<head>
<style type="text/css">
html, body { height: 100%; margin: 0; padding: 0; }
#map { height: 100%; }
</style>
</head>
<body>
<div id="map"></div>
<script type="text/javascript">

var a = 36;
response.charset = "big5"

function initMap(/*data*/) {
var markers = [];
var infoWindows = [];
var loaction;
var geocoder = new google.maps.Geocoder();
var requestURL = 'https://api.mediatek.com/mcs/v2/devices/DHJz0jYg/datachannels/Temperature/datapoints';
var request = new XMLHttpRequest();
request.open('GET', requestURL);
request.responseType = 'json';
request.send();
request.onload = function getdata() {

var temp = request.response["dataChannels"][0]["dataPoints"][0]["values"]["value"];
getloc(temp);

};


function getloc(temp){

alert(temp);

return info_config = [

temp+
'<h2>國立海洋科技博物館</h2>'+
'<span>空氣品質偵測點2</span><br/>',
];
}

var info_config = getloc();

//建立地圖 marker 的集合
var marker_config = [{
address: '國立海洋科技博物館',
icon:'http://maps.google.com/mapfiles/kml/paddle/ylw-circle.png'
}];

//geocoder主程式
function _geocoder(address, callback){
geocoder.geocode({
address: address
}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
loaction = results[0].geometry.location;
callback(loaction); //用一個 callback 就不用每次多寫上面這段
}
});
}

//使用地址或名稱標出位置
_geocoder('國立海洋科技博物館',function(address){
var map = new google.maps.Map(document.getElementById('map'), {
center: address,
zoom: 14
});

//設定資訊視窗內容
info_config.forEach(function(info_config,i){
infoWindows[i] = new google.maps.InfoWindow({
content: info_config
});
});

//標出 marker
marker_config.forEach(function(marker_config,i){
_geocoder(marker_config.address,function(address){
var marker = {
position:address,
map:map,
icon:marker_config.icon
}
markers[i] = new google.maps.Marker(marker);
markers[i].setMap(map);
markers[i].addListener('click', function() {
infoWindows[i].open(map, markers[i]);
});
});
});
});


}

</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAw4GBc0SEz2fEYs-5Di1LKLmIj_TBE4eQ&callback=initMap">
</script>
</body>
</html>
[/code]

搜尋相關Tags的文章: [ google map ] , [ javascript ] ,
本篇文章發表於2017-11-10 17:21
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
下次麻煩用一下程式標簽,這樣看程式碼是很累的事。

這塈A似乎忘了一件事。
google map其實是採用ajax的方式,也就是屬於後請求的處理。

也就是說,你第一次呼叫getloc。其實google map並還未將資料傳回來。
自然會有空值。

之後請求完成後。會做一次callback的動作。會再呼叫一次getloc。這就是造成你會跳兩次的原因。

demo程式碼,會使用alert的因素是為了測試。你當然要直接改成你要的資訊。

然後要去了解這種ajax式的後處理。善用callback的特性。

以上如果聽不懂再問。我只能說你的重點在於callback不了解。
本篇文章回覆於2017-11-10 17:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.