Div拖动效果

<script language="javascript" type="text/javascript">
   
        //获取控件对象
        function $(Id) {
            return document.getElementById(Id)
        };
        //为控件添加事件
        function addListener(element, e, fn) {
            element.addEventListener ? element.addEventListener(e, fn, false) : element.attachEvent("on" + e, fn)
        };
        //为控件移去事件
        function removeListener(element, e, fn) {
            element.removeEventListener ? element.removeEventListener(e, fn, false) : element.detachEvent("on" + e, fn)
        };
        //创建对象
        function create(elm, parent, fn) {
            var element = document.createElement(elm);
            if (fn) fn(element);
            parent.appendChild(element);
        };

        var Bind = function(object, fun) {
            return function() {
                return fun.apply(object, arguments);
            }
        }

        var BindAsEventListener = function(object, fun) {
            return function(event) {
                return fun.call(object, (event || window.event));
            }
        }

        var extend = function() {
            var args = arguments;
            if (!args[1]) args = [this, args[0]];
            for (var property in args[1]) args[0][property] = args[1][property];
            return args[0];
        };


        var Class = function(properties) {
            var _class = function() {
                return (arguments[0] !== null && this.initialize && typeof (this.initialize) == 'function') ? this.initialize.apply(this, arguments) : this;
            };
            _class.prototype = properties;
            return _class;
        };


        var Drag = new Class({
            author: 'WAYNE',
            initialize: function(elm) {
                //this.lock    = false;
                this.lockX = false;
                this.lockY = false;
                this.isdocument = false;    //
                this.mxleft = 0;
                this.mxright = 0;
                this.mxtop = 0;
                this.mxbotoom = 0;
                this.limit = false;
                this._x = 0;
                this._y = 0;
                this._left = 0;
                this._top = 0;
                this.dmove = BindAsEventListener(this, this.dragmove);
                this.dstop = Bind(this, this.dragstop);
                var self = this;
                this.element = elm;
                addListener(this.element, 'mousedown', BindAsEventListener(this, this.dragdown))
            },
            dragdown: function(e) {
                if (this.isdocument) {
                    this.limit = true;
                    this.mxright = Math.max(document.body.scrollWidth, document.body.clientWidth);      //右边界
                    this.mxbotoom = Math.max(document.body.scrollHeight, document.body.clientHeight);   //底边界
                }
                var self = this;
                //clientX       事件属性返回当事件被触发时鼠标指针向对于浏览器页面(或客户区)的水平坐标。
                //offsetLeft    返回当前元素的左边界到它的包含元素的左边界的偏移量,以像素为单位。
                this._x = e.clientX - parseInt(this.element.offsetLeft) || 0;
                this._y = e.clientY - parseInt(this.element.offsetTop) || 0;
                this._left = parseInt(this.element.style.marginLeft) || 0;
                this._top = parseInt(this.element.style.marginTop) || 0;
                //
                if (document.all) {
                    addListener(this.element, "losecapture", this.dstop);
                    this.element.setCapture();
                }
                else {
                    e.preventDefault();
                    addListener(window, "blur", this.dstop);
                }
                addListener(document, "mousemove", this.dmove);
                addListener(document, "mouseup", this.dstop);
            },
            dragmove: function(e) {
                window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
               
                var iLeft = e.clientX - this._x;
                var iTop = e.clientY - this._y;
               
                var mxright = this.mxright - this.element.offsetWidth;
                var mxbotoom = this.mxbotoom - this.element.offsetHeight;
                if (this.limit) {
                    if (iLeft < this.mxleft) iLeft = this.mxleft;
                    if (iLeft > mxright) iLeft = mxright;
                    if (iTop > mxbotoom) iTop = mxbotoom;
                    if (iTop < this.mxtop) iTop = this.mxtop;
                }
                if (!this.lockX) this.element.style.left = iLeft - this._left + "px";
                if (!this.lockY) this.element.style.top = iTop - this._top + "px";
            },
            dragstop: function() {
                removeListener(document, "mousemove", this.dmove)
                removeListener(document, "mouseup", this.dstop)
                if (document.all) {
                    removeListener(this.element, "losecapture", this.dstop);
                    this.element.releaseCapture();
                }
                else
                { removeListener(window, "blur", this.dstop); };
            }
        })
       
        Drag.Getdarg = function(elm, arg) {
            return extend(new Drag(elm), arg || {})
        }
       
        var ss_drag = Drag.Getdarg($('ss'), { mxleft: 100, mxright: 500, mxtop: 100, mxbotoom: 500, limit: true });
        var sss_drag = Drag.Getdarg($('sss'));
        var ssss_drag = Drag.Getdarg($('ssss'), { isdocument: true });

posted @ 2010-02-06 01:54  waynecn  阅读(1881)  评论(0编辑  收藏  举报