openlayermap
Version:
openlayer Map Component for Vue 2.0
388 lines (360 loc) • 9.28 kB
JavaScript
/**
* @author 胡红勋
* @Date 2017 12-25
* 方法:
* init 初始化函数,当参数为true时,会移动原来的对象,当参数为false时则不会移动原来的对象,默认为true
* target 指定对象id,将指定对象进行移动,参数为对象id
* mouseDownCall 鼠标按下的回调函数,参数为回调函数
* mouseUpCall 鼠标抬起时的回调函数,参数为回调函数
*/
import $ from 'jquery'
/**
* 需要初始化的对象
*/
var _o = null
/**
* 克隆对象
*/
var _oClone = null
/**
* 开始拖拽的点
*/
var _startPoint = {}
/**
* 拖拽完成鼠标所在的点
*/
var _endPoint = {}
/**
* 鼠标在拖拽对象内的偏移量
*/
var _offsetX = 0
var _offsetY = 0
/**
* 是否允许拖动
*/
var _dragEable = false
/**
* 是否已经拖动
*/
var _isMoved = false
/**
* 捕捉区域
*/
var _captureArea = null
var _childrenDIV = []
/**
* 配置信息
*/
const _conf = {
isMouseToCenter: false, // 是否在拖拽的时候,将鼠标居中至拖拽对象的中央
isMoveOriginal: true, // 是否移动原来的对象
isCapture: false, // 拖拽时是否进行捕捉
captureArea: '', // 若为空字符串,则不进行捕捉,若设置为目的区域的ID或者用Jquery转化过的对象,则拖拽时对当前对象进行捕捉
captureCallFunc: '',
mouseDownCallFunc: '', // 鼠标按下时触发的回调函数
mouseUpCallFunc: '', // 鼠标抬起时触发的回调函数
onlyX: false, // 只横向移动
onlyY: false, // 只纵向移动
minX: 0,
minY: 0,
maxX: 999999,
maxY: 999999
}
/**
* 初始化接口
*/
export function init(conf) {
_init()
_config(conf)
}
/**
* 初始化函数
*/
function _init() {
_startPoint = {}
_endPoint = {}
_oClone = null
}
// 配置对话框
function _config(confObj) {
// 设置参数
if (typeof confObj !== 'undefined') {
for (let elem in _conf) {
if (typeof confObj[elem] !== 'undefined') {
_conf[elem] = confObj[elem]
}
}
confObj = null
}
}
// 允许拖动并初始化
function _dragEnable(_event) {
var e = _event || window.event
var p = _getPos(_oClone[0])
var scrollLeft = Math.max(document.body.scrollLeft, document.documentElement.scrollLeft)
var scrollTop = Math.max(document.body.scrollTop, document.documentElement.scrollTop)
_startPoint = {
x: p.left ? p.left : 0,
y: p.top ? p.top : 0
}
if (_oClone[0].style.right !== '') {
_oClone[0].style.right = ''
p.left = Math.max(document.body.clientWidth, document.documentElement.clientWidth) - _oClone[0].clientWidth - p.right
}
if (_oClone[0].style.bottom !== '') {
_oClone[0].style.bottom = ''
p.top = Math.max(document.body.clientHeight, document.documentElement.clientHeight) - _oClone[0].clientHeight - p.bottom
_oClone[0].style.left = p.top + 'px'
}
_offsetX = scrollLeft + e.clientX - p.left
_offsetY = scrollTop + e.clientY - p.top
_dragEable = true
// 设置移动时的鼠标样式
_oClone[0].style.cursor = 'move'
// 触发鼠标按下时的回调函数
if (_conf.mouseDownCallFunc !== '') {
_conf.mouseDownCallFunc(_startPoint)
}
// 防止body中的子元素没有onmousemove事件
var _divs = document.getElementsByTagName('div')
for (var i = 0, len = _divs.length; i < len; i++) {
_childrenDIV.push(_divs[i])
_divs[i].onmousemove = _move
}
document.body.onmousemove = _move
document.body.onmouseup = _dragEnd
if (_conf.isCapture) {
_initCapture()
}
return false
}
/**
* 获取元素位置
*/
export function getTargetPosition(o) {
if (typeof o !== 'object' || o == null) {
return 0
}
let {
left,
right,
top,
bottom
} = o.style
if (left !== '') {
left = left.substr(0, left.indexOf('p'))
}
if (top !== '') {
top = top.substr(0, top.indexOf('p'))
}
if (right !== '') {
right = right.substr(0, right.indexOf('p'))
}
if (bottom !== '') {
bottom = bottom.substr(0, bottom.indexOf('p'))
}
return {
left: parseInt(left),
right: parseInt(right),
top: parseInt(top),
bottom: parseInt(bottom)
}
}
/**
* 拖动
*/
function _move(_event) {
if (_dragEable) {
const e = _event || window.event
let scrollLeft = Math.max(document.body.scrollLeft, document.documentElement.scrollLeft)
let scrollTop = Math.max(document.body.scrollTop, document.documentElement.scrollTop)
let _nowLeft = scrollLeft + e.clientX - _offsetX
let _nowTop = scrollTop + e.clientY - _offsetY
if (_nowLeft < _conf.minX) {
_nowLeft = _conf.minX
}
if (_nowLeft > _conf.maxX) {
_nowLeft = _conf.maxX
}
if (_nowTop < _conf.minY) {
_nowTop = _conf.minY
}
if (_nowTop > _conf.maxY) {
_nowTop = _conf.maxY
}
// 计算并设置所拖拽对象的当前位置
if (_conf.onlyX) {
_oClone.css('left', _nowLeft)
} else if (_conf.onlyY) {
_oClone.css('top', _nowTop)
} else {
_oClone.css({
'left': _nowLeft,
'top': _nowTop
})
}
_isMoved = true
}
if (_conf.isCapture && _dragEable) {
_capture(_event)
}
return false
}
/**
* 拖动结束
*/
function _dragEnd() {
if (_dragEnable) {
document.body.onmousemove = null
document.body.onmouseup = null
for (var i = 0, len = _childrenDIV.length; i < len; i++) {
_childrenDIV[i].onmousemove = null
}
var p = _getPos(_oClone[0])
_endPoint = {
x: p.left, // + _oClone[0].clientWidth/2,
y: p.top, // + _oClone[0].clientHeight/2,
attributes: _oClone[0].attributes
}
var _oPos = _getPos(_o[0])
if (_conf.isMoveOriginal && !_conf.isCapture && _isMoved) {
_o.css({
position: 'absolute',
zIndex: 20000
})
if (_oPos.hasAbsolute) { // 碰到父对象是绝对定位时,取相对位置
const _offX = _endPoint.x - _startPoint.x
const _offY = _endPoint.y - _startPoint.y
_o.css({
left: _o[0].offsetLeft + _offX,
top: _o[0].offsetTop + _offY
})
} else {
_o.css({
left: p.left,
top: p.top
})
}
}
_oClone.remove()
// 触发鼠标抬起时的函数
if (_conf.mouseUpCallFunc !== '') {
_conf.mouseUpCallFunc({
object: _o[0],
endPoint: _endPoint
})
}
_dragEable = false
_isMoved = false
}
}
/**
* 复制对象
*/
export function cloneTarget(e) {
_init()
_o = $(e.target)
var _oPosition = _getPos(_o[0])
_oClone = _o.clone()
_oClone.fadeTo(500, 0.5)
_oClone.css({
'position': 'absolute',
'zIndex': 20000
})
if (_conf.isMouseToCenter) {
_oClone.css({
'left': parseInt(e.clientX - _oClone[0].clientWidth / 2),
'top': parseInt(e.clientY - _oClone[0].clientHeight / 2)
})
} else {
_oClone.css({
'left': _oPosition.left,
'top': _oPosition.top
})
}
$('body').append(_oClone)
_dragEnable(e)
return false
}
/**
* 初始化需要拖拽的对象
*/
export function target(target, conf) {
_config(conf)
_init()
}
/**
* 初始化捕捉
*/
function _initCapture() {
if (!_conf.captureArea || !_dragEable || _captureArea) {
return
}
if (typeof _conf.captureArea === 'object') {
_captureArea = _conf.captureArea
} else {
_captureArea = $('#' + _conf.captureArea)
}
}
/**
* 捕捉
*/
function _capture(_event) {
let _mousePos = _getMousePos(_event)
let _children = _captureArea.children()
let _scrollTop = Math.max(document.body.scrollLeft, document.documentElement.scrollLeft)
let _scrollLeft = Math.max(document.body.scrollTop, document.documentElement.scrollTop)
let _objPos = null
let i = 0
let len = _children.length
for (i = 0; i < len; i++) {
_objPos = _getPos(_children[i])
if (_mousePos.x > _objPos.left - _scrollLeft &&
_mousePos.x < _objPos.left + _children[i].offsetWidth - _scrollLeft &&
_mousePos.y > _objPos.top - _scrollTop &&
_mousePos.y < _objPos.top + _children[i].offsetHeight - _scrollTop
) {
if (_conf.captureCallFunc) {
_conf.captureCallFunc({
index: i,
position: _objPos
})
return
}
}
}
}
/**
* 获取对象位置
*/
function _getPos(obj) {
if (!obj) {
return {}
}
var iTop = obj.offsetTop
var iLeft = obj.offsetLeft
var hasAbsolute = false
while (obj.offsetParent) {
iTop += obj.offsetParent.offsetTop
iLeft += obj.offsetParent.offsetLeft
if (obj.offsetParent.style.position === 'absolute') {
hasAbsolute = true
}
obj = obj.offsetParent
}
return {
top: iTop,
left: iLeft,
hasAbsolute: hasAbsolute
}
}
/**
* 获取当前鼠标位置
*/
function _getMousePos(_event) {
var e = _event || window.event
return {
x: e.clientX,
y: e.clientY
}
}