Skip to content

Commit 8b31490

Browse files
authored
calculating the position of map container in real time fix #1383 (#1384)
* Calculate map in real time_ containerDOM position fix #1383 * map position ci test * _updateDomPosition * update map dom position ci * fix ci * update map checksize * fix lint
1 parent dc043d6 commit 8b31490

File tree

4 files changed

+122
-41
lines changed

4 files changed

+122
-41
lines changed

src/map/Map.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import Coordinate from '../geo/Coordinate';
2222
import Layer from '../layer/Layer';
2323
import Renderable from '../renderer/Renderable';
2424
import SpatialReference from './spatial-reference/SpatialReference';
25+
import { computeDomPosition } from '../core/util/dom';
2526

2627
const TEMP_COORD = new Coordinate(0, 0);
2728
/**
@@ -1340,6 +1341,8 @@ class Map extends Handlerable(Eventable(Renderable(Class))) {
13401341
if (watched['width'] === oldWidth && watched['height'] === oldHeight) {
13411342
return this;
13421343
}
1344+
// refresh map's dom position
1345+
computeDomPosition(this._containerDOM);
13431346
const center = this.getCenter();
13441347

13451348
if (!this.options['fixCenterOnResize']) {

src/map/handler/Map.GeometryEvents.js

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -113,39 +113,39 @@ const EVENTS =
113113
* @property {Event} domEvent - dom event
114114
*/
115115
'touchend';
116-
/**
117-
* mouseenter event for geometry
118-
* @event Geometry#mouseenter
119-
* @type {Object}
120-
* @property {String} type - mouseenter
121-
* @property {Geometry} target - the geometry fires mouseenter
122-
* @property {Coordinate} coordinate - coordinate of the event
123-
* @property {Point} containerPoint - container point of the event
124-
* @property {Point} viewPoint - view point of the event
125-
* @property {Event} domEvent - dom event
126-
*/
127-
/**
128-
* mouseover event for geometry
129-
* @event Geometry#mouseover
130-
* @type {Object}
131-
* @property {String} type - mouseover
132-
* @property {Geometry} target - the geometry fires mouseover
133-
* @property {Coordinate} coordinate - coordinate of the event
134-
* @property {Point} containerPoint - container point of the event
135-
* @property {Point} viewPoint - view point of the event
136-
* @property {Event} domEvent - dom event
137-
*/
138-
/**
139-
* mouseout event for geometry
140-
* @event Geometry#mouseout
141-
* @type {Object}
142-
* @property {String} type - mouseout
143-
* @property {Geometry} target - the geometry fires mouseout
144-
* @property {Coordinate} coordinate - coordinate of the event
145-
* @property {Point} containerPoint - container point of the event
146-
* @property {Point} viewPoint - view point of the event
147-
* @property {Event} domEvent - dom event
148-
*/
116+
/**
117+
* mouseenter event for geometry
118+
* @event Geometry#mouseenter
119+
* @type {Object}
120+
* @property {String} type - mouseenter
121+
* @property {Geometry} target - the geometry fires mouseenter
122+
* @property {Coordinate} coordinate - coordinate of the event
123+
* @property {Point} containerPoint - container point of the event
124+
* @property {Point} viewPoint - view point of the event
125+
* @property {Event} domEvent - dom event
126+
*/
127+
/**
128+
* mouseover event for geometry
129+
* @event Geometry#mouseover
130+
* @type {Object}
131+
* @property {String} type - mouseover
132+
* @property {Geometry} target - the geometry fires mouseover
133+
* @property {Coordinate} coordinate - coordinate of the event
134+
* @property {Point} containerPoint - container point of the event
135+
* @property {Point} viewPoint - view point of the event
136+
* @property {Event} domEvent - dom event
137+
*/
138+
/**
139+
* mouseout event for geometry
140+
* @event Geometry#mouseout
141+
* @type {Object}
142+
* @property {String} type - mouseout
143+
* @property {Geometry} target - the geometry fires mouseout
144+
* @property {Coordinate} coordinate - coordinate of the event
145+
* @property {Point} containerPoint - container point of the event
146+
* @property {Point} viewPoint - view point of the event
147+
* @property {Event} domEvent - dom event
148+
*/
149149

150150
class MapGeometryEventsHandler extends Handler {
151151

@@ -200,8 +200,7 @@ class MapGeometryEventsHandler extends Handler {
200200
if (!actual) {
201201
return;
202202
}
203-
const containerPoint = getEventContainerPoint(actual, map._containerDOM),
204-
coordinate = map.containerPointToCoordinate(containerPoint);
203+
const containerPoint = getEventContainerPoint(actual, map._containerDOM);
205204
if (eventType === 'touchstart') {
206205
preventDefault(domEvent);
207206
}
@@ -229,7 +228,7 @@ class MapGeometryEventsHandler extends Handler {
229228
},
230229
'count': 1,
231230
'containerPoint': containerPoint,
232-
'onlyVisible' : map.options['onlyVisibleGeometryEvents'],
231+
'onlyVisible': map.options['onlyVisibleGeometryEvents'],
233232
'layers': layers
234233
};
235234
const callback = fireGeometryEvent.bind(this);
@@ -269,8 +268,8 @@ class MapGeometryEventsHandler extends Handler {
269268

270269
const oldTargets = this._prevOverGeos && this._prevOverGeos.geos;
271270
this._prevOverGeos = {
272-
'geos' : geometries,
273-
'geomap' : geoMap
271+
'geos': geometries,
272+
'geomap': geoMap
274273
};
275274
if (oldTargets && oldTargets.length > 0) {
276275
for (let i = oldTargets.length - 1; i >= 0; i--) {
@@ -311,7 +310,7 @@ class MapGeometryEventsHandler extends Handler {
311310

312311
Map.mergeOptions({
313312
'geometryEvents': true,
314-
'onlyVisibleGeometryEvents' : true
313+
'onlyVisibleGeometryEvents': true
315314
});
316315

317316
Map.addOnLoadHook('addHandler', 'geometryEvents', MapGeometryEventsHandler);

src/renderer/map/MapCanvasRenderer.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class MapCanvasRenderer extends MapRenderer {
3939
if (!this.map) {
4040
return false;
4141
}
42+
this._updateDomPosition(framestamp);
4243
delete this._isViewChanged;
4344
const map = this.map;
4445
map._fireEvent('framestart');
@@ -784,12 +785,22 @@ class MapCanvasRenderer extends MapRenderer {
784785
this.context = this.canvas.getContext('2d');
785786
}
786787

788+
_updateDomPosition(framestamp) {
789+
if (this._checkPositionTime === undefined) {
790+
this._checkPositionTime = framestamp;
791+
}
792+
if (framestamp - this._checkPositionTime >= 500) {
793+
// refresh map's dom position
794+
computeDomPosition(this.map._containerDOM);
795+
this._checkPositionTime = framestamp;
796+
}
797+
return this;
798+
}
799+
787800
_checkSize() {
788801
if (!this.map) {
789802
return;
790803
}
791-
// refresh map's dom position
792-
computeDomPosition(this.map._containerDOM);
793804
this.map.checkSize();
794805
}
795806

test/map/MapPositionSpec.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
describe('Map.Position', function () {
2+
3+
var container;
4+
var eventContainer;
5+
var map;
6+
var center = new maptalks.Coordinate(118.846825, 32.046534);
7+
var point = new maptalks.Point(100, 475);
8+
var expectPoint = new maptalks.Point(92, 467);
9+
var offetY = 300;
10+
var position = [8, 8, 1, 1];
11+
12+
beforeEach(function () {
13+
document.body.style.cssText = 'height:2500px;';
14+
container = document.createElement('div');
15+
container.style.width = '400px';
16+
container.style.height = '500px';
17+
container.style.background = '#000';
18+
document.body.appendChild(container);
19+
var option = {
20+
zoomAnimation: false,
21+
zoom: 17,
22+
center: center
23+
};
24+
map = new maptalks.Map(container, option);
25+
eventContainer = map._panels.canvasContainer;
26+
// eventContainer = map._containerDOM;
27+
});
28+
29+
afterEach(function () {
30+
delete map._env;
31+
map.remove();
32+
REMOVE_CONTAINER(container);
33+
document.body.style.cssText = '';
34+
});
35+
36+
37+
it('page not scroll map position', function (done) {
38+
map.on('mousedown click', function (e) {
39+
expect(map._containerDOM.__position).to.be.eql(position);
40+
expect(e.containerPoint).to.closeTo(expectPoint);
41+
});
42+
map._containerDOM.__position = position;
43+
setTimeout(function () {
44+
happen.mousedown(eventContainer, {
45+
'clientX': point.x,
46+
'clientY': point.y
47+
});
48+
done();
49+
}, 100);
50+
});
51+
52+
it('page scroll map position', function (done) {
53+
map.on('mousedown click', function (e) {
54+
expect(map._containerDOM.__position).to.be.eql([position[0], position[1] - offetY, position[2], position[3]]);
55+
expect(e.containerPoint).to.closeTo(expectPoint);
56+
});
57+
map._containerDOM.__position = position;
58+
window.scrollTo(0, offetY);
59+
var offsetPoint = point.copy().sub(0, offetY);
60+
setTimeout(function () {
61+
happen.mousedown(eventContainer, {
62+
'clientX': offsetPoint.x,
63+
'clientY': offsetPoint.y
64+
});
65+
done();
66+
}, 1000);
67+
});
68+
});

0 commit comments

Comments
 (0)