可拖动的框小故障

draggable box little glitch

本文关键字:故障 拖动      更新时间:2023-09-26

通常我更喜欢为琐碎的问题编写自己的解决方案,因为通常插件会添加许多不需要的功能并增加项目的大小。大小使页面变慢,在每天100k页面浏览量的网站中,30k的差异(与jquery可拖动相比)对账单有很大的不同。我已经使用jquery,我认为这就是我现在所需要的,所以请不要告诉我使用另一个插件或框架来拖动东西。

考虑到这一点,我编写了以下代码,以允许一个框可以拖动。代码工作得很好(任何关于代码本身的提示将不胜感激),但是当我将鼠标光标拖动到框限制的左侧时,我遇到了一个小故障:框内的文本被选中。

我该如何解决?谢谢。

JavaScript:

$(document).ready(function () {
    var x = 0;
    var y = 0;
    $("#d").live("mousedown", function () {
        var element = $(this);
        var parent = element.parent();
        $(document).mousemove(function (e) {
            var x_movement = 0;
            var y_movement = 0;
            if (x == e.pageX || x == 0) {
                x = e.pageX;
            } else {
                x_movement = e.pageX - x;
                x = e.pageX;
            }
            if (y == e.pageY || y == 0) {
                y = e.pageY;
            } else {
                y_movement = e.pageY - y;
                y = e.pageY;
            }
            var left = parseFloat(element.css("left")) + x_movement;
            // hold inside left
            if (left <= 0) left = 0;
            // hold inside right
            var max_right = (parseFloat(element.outerWidth()) - parent.width()) * -1;
            if (left >= max_right) left = max_right;
            element.css("left", left);
            var top = parseFloat(element.css("top")) + y_movement;
            // hold inside top
            if (top <= 0) top = 0;
            // hold inside bottom
            var max_bottom = (parseFloat(element.outerHeight()) - parent.height()) * -1;
            if (top >= max_bottom) top = max_bottom;
            element.css("top", top);
            return false;
        });
    });
    $(document).mouseup(function () {
        x = 0;
        y = 0;
        $(document).unbind("mousemove");
    });
});

.HTML:

<div style="position: relative; width: 500px; height: 500px; background-color: Red;">
    <div id="d" style="position: absolute; width: 100px; left: 0px; height: 100px; top: 0px; cursor: move; border: 1px solid black;">a</div>
</div>

选择文本的事实与 JavaScript 无关。这是浏览器和选择文本的问题,如果您在一个按钮按下时围绕鼠标光标移动。

您可以应用一些 css,这将阻止文本被选中,至少在现代浏览器上是这样:

#d {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

(这不是标准的css,但它应该可以工作。

您可以阻止在元素上使用 CSS 进行选择,以及将 unselectable="on" 属性添加到元素

例:http://jsfiddle.net/PS79Y/

Css:

#d{
 -moz-user-select: -moz-none; 
 -khtml-user-select: none;
 -webkit-user-select: none;
 -ms-user-select: none;
 user-select: none;
}

要查看 -moz-none 和 Just none 之间的示例,请访问 https://developer.mozilla.org/en/CSS/user-select