2014-10-06 43 views
2

我觉得变化不大代码,使我有这样的代码,这样,A链接到我们如何使用JavaScript拖放图片?

Fiddle

代码:

function Position(x, y) 
{ 
    this.X = x; 
    this.Y = y; 

    this.Add = function(val) 
    { 
    var newPos = new Position(this.X, this.Y); 
    if(val != null) 
    { 
     if(!isNaN(val.X)) 
     newPos.X += val.X; 
     if(!isNaN(val.Y)) 
     newPos.Y += val.Y 
    } 
    return newPos; 
    } 

    this.Subtract = function(val) 
    { 
    var newPos = new Position(this.X, this.Y); 
    if(val != null) 
    { 
     if(!isNaN(val.X)) 
     newPos.X -= val.X; 
     if(!isNaN(val.Y)) 
     newPos.Y -= val.Y 
    } 
    return newPos; 
    } 

    this.Min = function(val) 
    { 
    var newPos = new Position(this.X, this.Y) 
    if(val == null) 
     return newPos; 

    if(!isNaN(val.X) && this.X > val.X) 
     newPos.X = val.X; 
    if(!isNaN(val.Y) && this.Y > val.Y) 
     newPos.Y = val.Y; 

    return newPos; 
    } 

    this.Max = function(val) 
    { 
    var newPos = new Position(this.X, this.Y) 
    if(val == null) 
     return newPos; 

    if(!isNaN(val.X) && this.X < val.X) 
     newPos.X = val.X; 
    if(!isNaN(val.Y) && this.Y < val.Y) 
     newPos.Y = val.Y; 

    return newPos; 
    } 

    this.Bound = function(lower, upper) 
    { 
    var newPos = this.Max(lower); 
    return newPos.Min(upper); 
    } 

    this.Check = function() 
    { 
    var newPos = new Position(this.X, this.Y); 
    if(isNaN(newPos.X)) 
     newPos.X = 0; 
    if(isNaN(newPos.Y)) 
     newPos.Y = 0; 
    return newPos; 
    } 

    this.Apply = function(element) 
    { 
    if(typeof(element) == "string") 
     element = document.getElementById(element); 
    if(element == null) 
     return; 
    if(!isNaN(this.X)) 
     element.style.left = this.X + 'px'; 
    if(!isNaN(this.Y)) 
     element.style.top = this.Y + 'px'; 
    } 
} 

function hookEvent(element, eventName, callback) 
{ 
    if(typeof(element) == "string") 
    element = document.getElementById(element); 
    if(element == null) 
    return; 
    if(element.addEventListener) 
    { 
    element.addEventListener(eventName, callback, false); 
    } 
    else if(element.attachEvent) 
    element.attachEvent("on" + eventName, callback); 
} 

function unhookEvent(element, eventName, callback) 
{ 
    if(typeof(element) == "string") 
    element = document.getElementById(element); 
    if(element == null) 
    return; 
    if(element.removeEventListener) 
    element.removeEventListener(eventName, callback, false); 
    else if(element.detachEvent) 
    element.detachEvent("on" + eventName, callback); 
} 

function cancelEvent(e) 
{ 
    e = e ? e : window.event; 
    if(e.stopPropagation) 
    e.stopPropagation(); 
    if(e.preventDefault) 
    e.preventDefault(); 
    e.cancelBubble = true; 
    e.cancel = true; 
    e.returnValue = false; 
    return false; 
} 

function getMousePos(eventObj) 
{ 
    eventObj = eventObj ? eventObj : window.event; 
    var pos; 
    if(isNaN(eventObj.layerX)) 
    pos = new Position(eventObj.offsetX, eventObj.offsetY); 
    else 
    pos = new Position(eventObj.layerX, eventObj.layerY); 
    return correctOffset(pos, pointerOffset, true); 
} 

function getEventTarget(e) 
{ 
    e = e ? e : window.event; 
    return e.target ? e.target : e.srcElement; 
} 

function absoluteCursorPostion(eventObj) 
{ 
    eventObj = eventObj ? eventObj : window.event; 

    if(isNaN(window.scrollX)) 
    return new Position(eventObj.clientX + document.documentElement.scrollLeft + document.body.scrollLeft, 
     eventObj.clientY + document.documentElement.scrollTop + document.body.scrollTop); 
    else 
    return new Position(eventObj.clientX + window.scrollX, eventObj.clientY + window.scrollY); 
} 

function dragObject(element, attachElement, lowerBound, upperBound, startCallback, moveCallback, endCallback, attachLater) 
{ 
    if(typeof(element) == "string") 
    element = document.getElementById(element); 
    if(element == null) 
     return; 

    var cursorStartPos = null; 
    var elementStartPos = null; 
    var dragging = false; 
    var listening = false; 
    var disposed = false; 

    function dragStart(eventObj) 
    { 
    if(dragging || !listening || disposed) return; 
    dragging = true; 

    if(startCallback != null) 
     startCallback(eventObj, element); 

    cursorStartPos = absoluteCursorPostion(eventObj); 

    elementStartPos = new Position(parseInt(element.style.left), parseInt(element.style.top)); 

    elementStartPos = elementStartPos.Check(); 

    hookEvent(document, "mousemove", dragGo); 
    hookEvent(document, "mouseup", dragStopHook); 

    return cancelEvent(eventObj); 
    } 

    function dragGo(eventObj) 
    { 
    if(!dragging || disposed) return; 

    var newPos = absoluteCursorPostion(eventObj); 
    newPos = newPos.Add(elementStartPos).Subtract(cursorStartPos); 
    newPos = newPos.Bound(lowerBound, upperBound) 
    newPos.Apply(element); 
    if(moveCallback != null) 
     moveCallback(newPos, element); 

    return cancelEvent(eventObj); 
    } 

    function dragStopHook(eventObj) 
    { 
    dragStop(); 
    return cancelEvent(eventObj); 
    } 

    function dragStop() 
    { 
    if(!dragging || disposed) return; 
    unhookEvent(document, "mousemove", dragGo); 
    unhookEvent(document, "mouseup", dragStopHook); 
    cursorStartPos = null; 
    elementStartPos = null; 
    if(endCallback != null) 
     endCallback(element); 
    dragging = false; 
    } 

    this.Dispose = function() 
    { 
    if(disposed) return; 
    this.StopListening(true); 
    element = null; 
    attachElement = null 
    lowerBound = null; 
    upperBound = null; 
    startCallback = null; 
    moveCallback = null 
    endCallback = null; 
    disposed = true; 
    } 

    this.GetLowerBound = function() 
    { return lowerBound; } 

    this.GetUpperBound = function() 
    { return upperBound; } 

    this.StartListening = function() 
    { 
    if(listening || disposed) return; 
    listening = true; 
    hookEvent(attachElement, "mousedown", dragStart); 
    } 

    this.StopListening = function(stopCurrentDragging) 
    { 
    if(!listening || disposed) return; 
    unhookEvent(attachElement, "mousedown", dragStart); 
    listening = false; 

    if(stopCurrentDragging && dragging) 
     dragStop(); 
    } 

    this.IsDragging = function(){ return dragging; } 
    this.IsListening = function() { return listening; } 
    this.IsDisposed = function() { return disposed; } 

    if(typeof(attachElement) == "string") 
    attachElement = document.getElementById(attachElement); 
    if(attachElement == null) 
    attachElement = element; 

    if(!attachLater) 
    this.StartListening(); 
} 
    var el = document.getElementById('draggableElement'); 
    var leftEdge = el.parentNode.clientWidth - el.clientWidth; 
    var topEdge = el.parentNode.clientHeight - el.clientHeight; 
    var dragObj = new dragObject(el, null, new Position(leftEdge, topEdge), new Position(0, 0)); 
在这段代码

,有2件事,我解决不了:

  • 当我们拖动和移动大图像时,我们如何移动小图像?

  • 拖动图片时,鼠标不应该移出父div?

回答

0

要锁定指针的元素中,你可以使用Pointer Lock API

要移动的小图片,可以用百分比,计算有多少你已经搬到更大的一个,然后移动小同相对于其大小的百分比。