HTML
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> body{ margin: 0; } a{ position: absolute; top: 0; left: 0; width: 100px; height: 100px; background-color: green; } div{ position: absolute; top: 0; left: 0; width: 100px; height: 100px; background-color: orange; display: none; } </style></head><body> <a href="javascript:;">百度</a> <div></div></body><script src="./js/untils.js"></script><script src="./js/index.js"></script><script> var oLink = document.getElementsByTagName('a')[0], oMenu = document.getElementsByTagName('div')[0]; oLink.dragNclick(oMenu,function(){ window.open('http://www.baidu.com'); });</script></html>
JS
Element.prototype.dragNclick = (function (menu, elemClick) {
var bTime = 0,
eTime = 0,
oPos = [],
cbTime = 0,
ceTime = 0,
counter = 0,
t = null,
wWidth = getViewportSize().width,
wHeight = getViewportSize().height,
eleWidth = parseInt(getStyles(this, 'width')),
eleHeight = parseInt(getStyles(this, 'height')),
mWidth = getStyles(menu, 'width'),
mHeight = getStyles(menu, 'height');
// console.log(eleWidth,eleHeight);
drag.call(this);
function drag() {
var x,
y,
_self = this;
addEvent(this, 'mousedown', function (e) {
var e = e || window.event,
btnCode = e.button;
if (btnCode === 2) {
var mLeft = pagePos(e).X,
mTop = pagePos(e).Y;
if (mLeft <= 0) {
mLeft = 0;
} else if (mLeft >= wWidth - mWidth) {
mLeft = pagePos(e).X - mWidth;
}
if (mTop <= 0) {
mTop = 0;
} else if (mTop >= wHeight - mHeight) {
mTop = pagePos(e).Y - mWidth;
}
menu.style.left = mLeft + 'px';
menu.style.top = pagePos(e).Y + 'px';
menu.style.display = 'block';
} else if (btnCode === 0) {
bTime = new Date().getTime();
oPos = [getStyles(_self, 'left'), getStyles(_self, 'top')];
x = pagePos(e).X - getStyles(_self, 'left');
y = pagePos(e).Y - getStyles(_self, 'top');
addEvent(document, 'mousemove', mouseMove);
addEvent(document, 'mouseup', mouseUp);
cancelBubble(e);
preventDefaultEvent(e);
}
});
addEvent(document, 'contextmenu', function (e) {
var e = e || window.event;
preventDefaultEvent(e);
});
addEvent(document, 'click', function (e) {
console.log(menu);
menu.style.display = 'none';
});
addEvent(menu, 'click', function (e) {
var e = e || window.event;
cancelBubble(e);
})
function mouseMove(e) {
var e = e || window.event;
eleLeft = pagePos(e).X - x,
eleTop = pagePos(e).Y - y;
if (eleLeft <= 0) {
eleLeft = 0;
} else if (eleLeft >= wWidth - eleWidth) {
console.log(eleLeft);
eleLeft = wWidth - eleWidth - 1;
}
if (eleTop <= 0) {
eleTop = 0;
} else if (eleTop >= wHeight - eleHeight) {
console.log(eleTop);
eleTop = wHeight - eleHeight - 1;
}
_self.style.left = eleLeft + 'px';
_self.style.top = eleTop + 'px';
}
function mouseUp(e) {
var e = e || window.event;
eTime = new Date().getTime();
if (eTime - bTime < 100) {
_self.style.left = oPos[0] + 'px';
_self.style.top = oPos[1] + 'px';
counter++;
if (counter === 1) {
cbTime = new Date().getTime();
}
if (counter === 2) {
ceTime = new Date().getTime();
}
if (cbTime && ceTime && (ceTime - cbTime < 200)) {
elemClick();
}
t = setTimeout(function () {
cbTime = 0;
ceTime = 0;
counter = 0;
clearTimeout(t);
}, 200);
}
removeEvent(document, 'mousemove', mouseMove);
removeEvent(document, 'mouseup', mouseUp);
}
}
});