新用戶登錄我有一個谷歌地圖是將進行地理定位的用戶和放置標記在地圖上。 我想要在新用戶加載地圖時添加新標記。 爲此,我使用套接字io。使用socket io來標記添加到谷歌地圖時
但是預期的結果沒有發生! 用戶並沒有看到彼此和標記似乎繼續產生瀏覽器保持打開的時間越長。
REPO AT https://github.com/Stacca/geo-socket
讚賞任何建議,謝謝!
我的節點服務器看起來是這樣的..
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var path = require("path")
var port = process.env.PORT || 3000
var http = require('http').Server(app);
app.use(express.static(__dirname + '/'));
app.get('/', function (req, res) {
res.sendFile(path.join(__dirname + '/app/index.html'));
});
var io = require('socket.io')(http);
io.on('connection', function(socket){
console.log('a user connected');
socket.on('marker', function(data) {
console.log('marker latitude: ' + data.lat + ', marker longitude:' +
data.lng);
socket.broadcast.emit('show-marker', data);
});
});
http.listen(3000, function(){
console.log('five minute catch up is on port 3000');
});
module.exports = server;
我的JS文件
"use strict";
var map;
var markers = []
function initialize() {
var mapOptions = {
zoom: 16
};
map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
google.maps.event.addDomListener(window, 'load', initialize);
google.maps.event.addDomListener(window, "resize", function() {
var center = map.getCenter();
google.maps.event.trigger(map, "resize");
map.setCenter(center);
});
if(navigator.geolocation) {
navigator.geolocation.watchPosition(function(position) {
var pos = new google.maps.LatLng(position.coords.latitude,
position.coords.longitude);
var infowindow = new google.maps.InfoWindow({
map: map,
position: pos,
content: 'You are here'
});
map.setCenter(pos);
}, function() {
handleNoGeolocation(true);
});
} else {
// Browser doesn't support Geolocation
handleNoGeolocation(false);
}
}
function handleNoGeolocation(errorFlag) {
if (errorFlag) {
var content = 'Error: The Geolocation service failed.';
} else {
var content = 'Error: Your browser doesn\'t support geolocation.';
}
var options = {
map: map,
position: new google.maps.LatLng(60, 105),
content: content
};
var infowindow = new google.maps.InfoWindow(options);
map.setCenter(options.position);
}
google.maps.event.addDomListener(window, 'load', initialize);
// listen for Marker event
google.maps.event.addListener(map, 'load', function(event) {
var marker = addMarker(event.latLng);
socket.emit('marker', {
'lat': marker.position.k,
'lng': marker.position.D
});
});
// Add a marker to the map
function addMarker(location) {
var marker = new google.maps.Marker({
position: location,
map: map
});
markers.push(marker);
console.log(location);
console.log("marker: " + marker.position.k + " " + marker.position.D);
return marker;
}
//Listens for other users markers
socket.on('show-marker', addMarker);
HTML
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet"
href="bower_components/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="app/styles/main.css">
<!-- Internal map style (cant remove)-->
<style type="text/css">
html, body, #map-canvas { height: 90%; margin: 0; padding: 0;}
</style>
<!-- Public API -->
<script src="https://maps.googleapis.com/maps/api/js?
v=3.exp&signed_in=false"></script>
<div id="map-canvas"></div>
<!-- build:js(.) scripts/vendor.js -->
<!-- bower:js -->
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/angular/angular.js"></script>
<script src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
<script src="bower_components/angular-animate/angular-animate.js">
</script>
<script src="bower_components/angular-cookies/angular-cookies.js">
</script>
<script src="bower_components/angular-resource/angular-resource.js">
</script>
<script src="bower_components/angular-route/angular-route.js"></script>
<script src="bower_components/angular-sanitize/angular-sanitize.js">
</script>
<script src="bower_components/angular-touch/angular-touch.js"></script>
<!-- build:js({.tmp,app}) scripts/scripts.js -->
<script src="app/scripts/app.js"></script>
<script src="app/scripts/controllers/main.js"></script>
<script src="app/scripts/map.js"></script>
<script src="app/scripts/controllers/about.js"></script>
<!-- socket scripts -->
<script src="/socket.io/socket.io.js"></script>
<script> var socket = io();</script>
</body>
</html>
你能以測試的行爲提供HTML樣本? 該代碼似乎是正確的,這是你具體的問題?您還需要考慮以下情況: 1)存儲實際標記的列表,因此當用戶第一次進入該網站時,它將添加所有活動的標記。 2)當用戶從套接字退出時刪除標記。 – ecarrizo
是的,謝謝。現在附加HTML。問題是新用戶(即localhost 3000上的新瀏覽器)不會生成新標記。 – Stacca
爲了讓它正常工作(可以運行應用程序,但似乎從未調用過addMarker(也許地圖事件永不會觸發),所以我開始在'info'窗口顯示時調用socket.emit,服務器獲取套接字消息,但似乎客戶端沒有收到任何時候emmit'show-marker'。 我會深入看看下午晚上。sry。 – ecarrizo