3
How to prevent a link from opening while holding and dragging your mouse in Google Chrome?
The script below is to perform scroll action while clicking and dragging, but when it comes to links, when dropping the mouse button the link opens, such as preventing it from opening while dragging, and opening the link only when clicking?
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(['exports'], factory);
} else if (typeof exports !== 'undefined') {
factory(exports);
} else {
factory((root.dragscroll = {}));
}
}(this, function(exports) {
var _window = window;
var _document = document;
var mousemove = 'mousemove';
var mouseup = 'mouseup';
var mousedown = 'mousedown';
var EventListener = 'EventListener';
var addEventListener = 'add' + EventListener;
var removeEventListener = 'remove' + EventListener;
var newScrollX, newScrollY;
var dragged = [];
var reset = function(i, el) {
for (i = 0; i < dragged.length;) {
el = dragged[i++];
el = el.container || el;
el[removeEventListener](mousedown, el.md, 0);
_window[removeEventListener](mouseup, el.mu, 0);
_window[removeEventListener](mousemove, el.mm, 0);
}
// cloning into array since HTMLCollection is updated dynamically
dragged = [].slice.call(_document.getElementsByClassName('dragscroll'));
for (i = 0; i < dragged.length;) {
(function(el, lastClientX, lastClientY, pushed, scroller, cont) {
(cont = el.container || el)[addEventListener](
mousedown,
cont.md = function(e) {
if (!el.hasAttribute('nochilddrag') ||
_document.elementFromPoint(
e.pageX, e.pageY
) == cont
) {
pushed = 1;
lastClientX = e.clientX;
lastClientY = e.clientY;
e.preventDefault();
}
}, 0
);
_window[addEventListener](
mouseup, cont.mu = function() {
pushed = 0;
}, 0
);
_window[addEventListener](
mousemove,
cont.mm = function(e) {
if (pushed) {
(scroller = el.scroller || el).scrollLeft -=
newScrollX = (-lastClientX + (lastClientX = e.clientX));
scroller.scrollTop -=
newScrollY = (-lastClientY + (lastClientY = e.clientY));
if (el == _document.body) {
(scroller = _document.documentElement).scrollLeft -= newScrollX;
scroller.scrollTop -= newScrollY;
}
}
}, 0
);
})(dragged[i++]);
}
}
if (_document.readyState == 'complete') {
reset();
} else {
_window[addEventListener]('load', reset, 0);
}
exports.reset = reset;
}));
.dragscroll{
width:400px;
overflow:scroll;
}
.dragscroll div{
width:555px;
}
.dragscroll a{
display:block;
width:180px;
height:100px;
margin-right:5px;
float:left;
}
.dragscroll::after {
content: "";
clear: both;
display: table;
}
<div class="dragscroll">
<div>
<a href="https://www.example.com" style="background:#333;"></a>
<a href="https://www.example.com" style="background:#ddd;"></a>
<a href="https://www.example.com" style="background:#dd3333;"></a>
</div>
</div>
It worked perfectly with a modification, removing the
if(el.tagName == "A")
, because in my code theel
is returned asli
and not thea
.– Mark
It may be too :))
– Sam