Administrator
2022-09-14 58d006e05dcf2a20d0ec5367dd03d66a61db6849
提交 | 用户 | 时间
58d006 1 GMaps.prototype.createMarker = function(options) {
A 2   if (options.lat == undefined && options.lng == undefined && options.position == undefined) {
3     throw 'No latitude or longitude defined.';
4   }
5
6   var self = this,
7       details = options.details,
8       fences = options.fences,
9       outside = options.outside,
10       base_options = {
11         position: new google.maps.LatLng(options.lat, options.lng),
12         map: null
13       };
14
15   delete options.lat;
16   delete options.lng;
17   delete options.fences;
18   delete options.outside;
19
20   var marker_options = extend_object(base_options, options),
21       marker = new google.maps.Marker(marker_options);
22
23   marker.fences = fences;
24
25   if (options.infoWindow) {
26     marker.infoWindow = new google.maps.InfoWindow(options.infoWindow);
27
28     var info_window_events = ['closeclick', 'content_changed', 'domready', 'position_changed', 'zindex_changed'];
29
30     for (var ev = 0; ev < info_window_events.length; ev++) {
31       (function(object, name) {
32         if (options.infoWindow[name]) {
33           google.maps.event.addListener(object, name, function(e){
34             options.infoWindow[name].apply(this, [e]);
35           });
36         }
37       })(marker.infoWindow, info_window_events[ev]);
38     }
39   }
40
41   var marker_events = ['animation_changed', 'clickable_changed', 'cursor_changed', 'draggable_changed', 'flat_changed', 'icon_changed', 'position_changed', 'shadow_changed', 'shape_changed', 'title_changed', 'visible_changed', 'zindex_changed'];
42
43   var marker_events_with_mouse = ['dblclick', 'drag', 'dragend', 'dragstart', 'mousedown', 'mouseout', 'mouseover', 'mouseup'];
44
45   for (var ev = 0; ev < marker_events.length; ev++) {
46     (function(object, name) {
47       if (options[name]) {
48         google.maps.event.addListener(object, name, function(){
49           options[name].apply(this, [this]);
50         });
51       }
52     })(marker, marker_events[ev]);
53   }
54
55   for (var ev = 0; ev < marker_events_with_mouse.length; ev++) {
56     (function(map, object, name) {
57       if (options[name]) {
58         google.maps.event.addListener(object, name, function(me){
59           if(!me.pixel){
60             me.pixel = map.getProjection().fromLatLngToPoint(me.latLng)
61           }
62           
63           options[name].apply(this, [me]);
64         });
65       }
66     })(this.map, marker, marker_events_with_mouse[ev]);
67   }
68
69   google.maps.event.addListener(marker, 'click', function() {
70     this.details = details;
71
72     if (options.click) {
73       options.click.apply(this, [this]);
74     }
75
76     if (marker.infoWindow) {
77       self.hideInfoWindows();
78       marker.infoWindow.open(self.map, marker);
79     }
80   });
81
82   google.maps.event.addListener(marker, 'rightclick', function(e) {
83     e.marker = this;
84
85     if (options.rightclick) {
86       options.rightclick.apply(this, [e]);
87     }
88
89     if (window.context_menu[self.el.id]['marker'] != undefined) {
90       self.buildContextMenu('marker', e);
91     }
92   });
93
94   if (marker.fences) {
95     google.maps.event.addListener(marker, 'dragend', function() {
96       self.checkMarkerGeofence(marker, function(m, f) {
97         outside(m, f);
98       });
99     });
100   }
101
102   return marker;
103 };
104
105 GMaps.prototype.addMarker = function(options) {
106   var marker;
107   if(options.hasOwnProperty('gm_accessors_')) {
108     // Native google.maps.Marker object
109     marker = options;
110   }
111   else {
112     if ((options.hasOwnProperty('lat') && options.hasOwnProperty('lng')) || options.position) {
113       marker = this.createMarker(options);
114     }
115     else {
116       throw 'No latitude or longitude defined.';
117     }
118   }
119
120   marker.setMap(this.map);
121
122   if(this.markerClusterer) {
123     this.markerClusterer.addMarker(marker);
124   }
125
126   this.markers.push(marker);
127
128   GMaps.fire('marker_added', marker, this);
129
130   return marker;
131 };
132
133 GMaps.prototype.addMarkers = function(array) {
134   for (var i = 0, marker; marker=array[i]; i++) {
135     this.addMarker(marker);
136   }
137
138   return this.markers;
139 };
140
141 GMaps.prototype.hideInfoWindows = function() {
142   for (var i = 0, marker; marker = this.markers[i]; i++){
143     if (marker.infoWindow){
144       marker.infoWindow.close();
145     }
146   }
147 };
148
149 GMaps.prototype.removeMarker = function(marker) {
150   for (var i = 0; i < this.markers.length; i++) {
151     if (this.markers[i] === marker) {
152       this.markers[i].setMap(null);
153       this.markers.splice(i, 1);
154
155       if(this.markerClusterer) {
156         this.markerClusterer.removeMarker(marker);
157       }
158
159       GMaps.fire('marker_removed', marker, this);
160
161       break;
162     }
163   }
164
165   return marker;
166 };
167
168 GMaps.prototype.removeMarkers = function(collection) {
169   var collection = (collection || this.markers);
170
171   for (var i = 0;i < this.markers.length; i++) {
172     if(this.markers[i] === collection[i]) {
173       this.markers[i].setMap(null);
174     }
175   }
176
177   var new_markers = [];
178
179   for (var i = 0;i < this.markers.length; i++) {
180     if(this.markers[i].getMap() != null) {
181       new_markers.push(this.markers[i]);
182     }
183   }
184
185   this.markers = new_markers;
186 };