Javascript 如何找到图像的原始位置?

Javascript 如何找到图像的原始位置?,javascript,interact.js,Javascript,Interact.js,我正在使用interact.js库实现拖放功能。我使用原始图像而不是div作为我的可拖动对象,这似乎很好: <img id="drag4" src="images/SVG/ksTire.svg" class="draggable js-drag" style="width:85px"> 我不知道如何在拖动开始之前将图像返回到其原始起点。我需要将原始坐标存储在js变量中,并根据特定事件将图像返回到其确切的原始起始位置。我在事件中尝试了各种x/y坐标,也尝试了getElementB

我正在使用interact.js库实现拖放功能。我使用原始图像而不是div作为我的可拖动对象,这似乎很好:

<img id="drag4" src="images/SVG/ksTire.svg" class="draggable js-drag" style="width:85px">

我不知道如何在拖动开始之前将图像返回到其原始起点。我需要将原始坐标存储在js变量中,并根据特定事件将图像返回到其确切的原始起始位置。我在事件中尝试了各种x/y坐标,也尝试了getElementById,但没有成功。每当我尝试将图像返回到其原始位置时,某些方法会在第一次将其恢复,但当我再次开始拖动它时,它会远离一个陌生的位置,不再位于鼠标指针下

有没有人能提供一些示例代码,说明如何不断地将可拖动对象捕捉回其初始位置?我已经在代码中找到了调用它的位置,我所需要的只是如何将图像恢复到正确的位置,然后在发生这种情况后继续正常工作

注意:interact.js不是基于jquery构建的,所以在这种特殊情况下,我更喜欢非jquery解决方案

以下是my dropzone.js的全部内容,这是与此问题相关的大部分内容:

(function(interact) {

    'use strict';

    var transformProp;
    var startPos = null;
    var startX = 0;
    var startY = 0;
    var validDrop = false;

    interact.maxInteractions(Infinity);

    // setup draggable elements.


    /* block below was copied from https://github.com/taye/interact.js/issues/79 -- try to get this working */

    // setup drop areas.

    setupDropzone('#drop1', '#drag1, #drag2, #drag4');
    setupDropzone('#drop2', '#drag4');
    setupDropzone('#drop4', '#drag4');
    setupDropzone('#drop5', '#drag1, #drag2, #drag4');
    setupDropzone('#drop6', '#drag3');
    setupDropzone('#drop7', '#drag1');


    /* SNAP code was copied from http://kundprojekt.soonce.com/lintex/zonbuilder/ and https://github.com/taye/interact.js/issues/79 -- try to get this working */

    // dropzone #1 accepts draggable #1
    //setupDropzone('#drop1', '#drag1');
    // dropzone #2 accepts draggable #1 and #2
    //setupDropzone('#drop2', '#drag1, #drag2');
    // every dropzone accepts draggable #3
    //setupDropzone('.js-drop', '#drag3');

    /**
     * Setup a given element as a dropzone.
     *
     * @param {HTMLElement|String} el
     * @param {String} accept
     */
    function setupDropzone(el, accept) {
        interact(el)
            .dropzone({
                accept: accept,
                ondropactivate: function(event) {
                    addClass(event.relatedTarget, '-drop-possible');
                },
                ondropdeactivate: function(event) {
                    removeClass(event.relatedTarget, '-drop-possible');
                }
            })
            .snap({
                mode: 'anchor',
                anchors: [],
                range: Infinity,
                elementOrigin: {
                    x: 0.5,
                    y: 0.5
                },
                endOnly: true
            })
            .on('dropactivate', function(event) {
                var active = event.target.getAttribute('active') | 0;

                // change style if it was previously not active
                if (active === 0) {
                    addClass(event.target, '-drop-possible');
                    //event.target.textContent = 'Drop me here!';
                }

                event.target.setAttribute('active', active + 1);
            })
            .on('dropdeactivate', function(event) { // this fires after each drop, whether a drop into a valid drop zone occurs or not
                var active = event.target.getAttribute('active') | 0;

                // change style if it was previously active
                // but will no longer be active
                if (active === 1) {
                    removeClass(event.target, '-drop-possible');
                    //event.target.textContent = 'Dropzone';
                }

                event.target.setAttribute('active', active - 1);

                if (!validDrop) {
                    //document.getElementById("drag4").style.position = 'absolute';
                    //document.getElementById("drag4").style.left = startX + "px";
                    //document.getElementById("drag4").style.top = startY + "px";
                }

            })

        .on('dragstart', function(event) {
            // snap to the start position

            if (!startPos) {
                var rect = interact.getElementRect(event.target);

                // record center point when starting the very first a drag
                startPos = {
                    x: rect.left + rect.width / 2,
                    y: rect.top + rect.height / 2
                }
            }
            event.interactable.snap({
                anchors: [startPos]
            });
        })
        .on('dragenter', function(event) {
                addClass(event.target, '-drop-over');


                var dropRect = interact.getElementRect(event.target),
                    dropCenter = {
                        x: dropRect.left + dropRect.width / 2,
                        y: dropRect.top + dropRect.height / 2
                    };

                event.draggable.snap({
                    anchors: [dropCenter]
                });


                //event.relatedTarget.textContent = 'I\'m in';
            })
            .on('dragleave', function(event) {
                removeClass(event.target, '-drop-over');

                event.draggable.snap(false);

                // when leaving a dropzone, snap to the start position
                event.draggable.snap({
                    anchors: [startPos]
                });

                var svgFilename = getSVGFilename(event.relatedTarget.src);

                if (document.getElementById("message").innerHTML) {
                    document.getElementById("message").innerHTML = document.getElementById("message").innerHTML.replace(svgFilename + "<br>", "");
                }

                //event.relatedTarget.textContent = 'Drag me…';
            })
            .on('drop', function(event) { // this only fires when an object is dropped into a valid drop zone for that object
                validDrop = true;
                removeClass(event.target, '-drop-over');
                var svgFilename = getSVGFilename(event.relatedTarget.src);
                document.getElementById("message").innerHTML += svgFilename + "<br>";

                //event.relatedTarget.textContent = 'Dropped';
            });
    }

    function getAbsolutePosition(el) {
        var el2 = el;
        var curtop = 0;
        var curleft = 0;
        if (document.getElementById || document.all) {
            do {
                curleft += el.offsetLeft - el.scrollLeft;
                curtop += el.offsetTop - el.scrollTop;
                el = el.offsetParent;
                el2 = el2.parentNode;
                while (el2 != el) {
                    curleft -= el2.scrollLeft;
                    curtop -= el2.scrollTop;
                    el2 = el2.parentNode;
                }
            } while (el.offsetParent);

        } else if (document.layers) {
            curtop += el.y;
            curleft += el.x;
        }
        return [curleft, curtop];
    };

    function getSVGFilename(url) {
        if (url.indexOf("/") > -1)
            return url.substr(url.lastIndexOf('/') + 1);
        else
            return "";
    }

    function addClass(element, className) {
        if (element.classList) {
            return element.classList.add(className);
        } else {
            element.className += ' ' + className;
        }
    }

    function removeClass(element, className) {
        if (element.classList) {
            return element.classList.remove(className);
        } else {
            element.className = element.className.replace(new RegExp(className + ' *', 'g'), '');
        }
    }

    interact('.js-drag')
        .draggable({
            max: Infinity
        })
        .on('dragstart', function(event) {
            validDrop = false;

            event.interaction.x = parseInt(event.target.getAttribute('data-x'), 10) || 0;
            event.interaction.y = parseInt(event.target.getAttribute('data-y'), 10) || 0;

            var absolutePosition = getAbsolutePosition(event.target);
            startX = absolutePosition[0];
            startY = absolutePosition[1];

        })
        .on('dragmove', function(event) {
            event.interaction.x += event.dx;
            event.interaction.y += event.dy;

            if (transformProp) {
                event.target.style[transformProp] =
                    'translate(' + event.interaction.x + 'px, ' + event.interaction.y + 'px)';
            } else {
                event.target.style.left = event.interaction.x + 'px';
                event.target.style.top = event.interaction.y + 'px';
            }
        })
        .on('dragend', function(event) {
            event.target.setAttribute('data-x', event.interaction.x);
            event.target.setAttribute('data-y', event.interaction.y);
        });

    interact(document).on('ready', function() {
        transformProp = 'transform' in document.body.style ? 'transform' : 'webkitTransform' in document.body.style ? 'webkitTransform' : 'mozTransform' in document.body.style ? 'mozTransform' : 'oTransform' in document.body.style ? 'oTransform' : 'msTransform' in document.body.style ? 'msTransform' : null;
    });

}(window.interact));
(功能(交互){
"严格使用",;
var-transformProp;
var startPos=null;
var startX=0;
var-startY=0;
var validDrop=false;
最大交互作用(无穷大);
//设置可拖动的元素。
/*下面的块是从中复制的https://github.com/taye/interact.js/issues/79 --试着让它工作起来*/
//设置放置区域。
setupDropzone(“#drop1”、“drag1”、“drag2”、“drag4”);
setupDropzone('drop2','drag4');
setupDropzone(“#drop4”和“#drag4”);
setupDropzone(“#drop5”、“#drag1、#drag2、#drag4”);
setupDropzone('drop6','drag3');
setupDropzone('drop7','drag1');
/*快照代码是从中复制的http://kundprojekt.soonce.com/lintex/zonbuilder/ 及https://github.com/taye/interact.js/issues/79 --试着让它工作起来*/
//dropzone#1接受可拖动的#1
//setupDropzone('drop1','drag1');
//dropzone#2接受可拖动的#1和#2
//setupDropzone(“#drop2”、“drag1”、“drag2”);
//每个dropzone都接受可拖动的#3
//setupDropzone('.js drop','#drag3');
/**
*将给定元素设置为dropzone。
*
*@param{HTMLElement|String}el
*@param{String}接受
*/
功能设置DropZone(el,接受){
互动(el)
.dropzone({
接受:接受,
ondropactivate:功能(事件){
addClass(event.relatedTarget,'-drop-mable');
},
ondropdeactivate:功能(事件){
removeClass(event.relatedTarget,'-drop-mable');
}
})
.啪({
模式:“锚定”,
主播:[],
范围:无限,
elementOrigin:{
x:0.5,
y:0.5
},
内:对
})
.on('dropactivate',功能(事件){
var active=event.target.getAttribute('active')| 0;
//更改以前未激活的样式
如果(活动===0){
addClass(event.target,'-drop-mable');
//event.target.textContent='Drop me here!';
}
event.target.setAttribute('active',active+1);
})
.on('dropdeactivate',函数(事件){//在每次拖放后激发,无论是否发生有效拖放区域的拖放
var active=event.target.getAttribute('active')| 0;
//更改以前处于活动状态的样式
//但将不再处于活动状态
如果(活动===1){
removeClass(event.target,'-drop-mable');
//event.target.textContent='Dropzone';
}
event.target.setAttribute('active',active-1);
如果(!validDrop){
//document.getElementById(“drag4”).style.position='absolute';
//document.getElementById(“drag4”).style.left=startX+“px”;
//document.getElementById(“drag4”).style.top=startY+“px”;
}
})
.on('dragstart',函数(事件){
//捕捉到起始位置
如果(!startPos){
var rect=interact.getElementRect(event.target);
//开始第一次拖动时记录中心点
startPos={
x:rect.left+rect.width/2,
y:rect.top+rect.height/2
}
}
event.interactiable.snap({
主播:[startPos]
});
})
.on('dragenter',功能(事件){
addClass(event.target,'-drop-over');
var dropRect=interact.getElementRect(event.target),
dropCenter={
x:dropRect.left+dropRect.width/2,
y:dropRect.top+dropRect.height/2
};
event.draggable.snap({
主播:[dropCenter]
});
//event.relatedTarget.textContent='我在';
})
.on('dragleave',函数(事件){
removeClass(event.target,'-drop-over');
event.draggable.snap(false);
//离开dropzone时,捕捉到开始位置
event.draggable.snap({
主播:[startPos]
});
var svgFilename=getSVGFilename(event.relatedTarget.src);
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="utf-8">
   <title>WorkScreen Prototype #1</title>
   <script src="js/interact.js"></script>
   <script src="js/dropzones.js"></script>
   <link rel="stylesheet" href="css/dropzones.css">
</head>
<body style="background-color: #CCC; height: 852px">
   <a href="ShowSVGs.aspx" target="_blank">View All SVGs</a>
   <div style="margin-top:55px">
      <div style="float: left; vertical-align: top">
         <img id="drag1" src="images/SVG/ksBatteryBox.svg" class="draggable js-drag" style="width:80px"><br />
         <img id="drag2" src="images/SVG/ksBumper6308700.svg" class="draggable js-drag" style="width:85px"><br />
         <img id="drag3" src="images/SVG/ksHood8090130.svg" class="draggable js-drag" style="width:165px"><br />
         <img id="drag4" src="images/SVG/ksTire.svg" class="draggable js-drag" style="width:85px"><br />
      </div>
      <div style="float: left;vertical-align:top;margin-left:-72px">
         <div style ="margin-left:100px;">

            <div id="drop1" class="dropzone js-drop" style="margin-left:186px;"></div>
            <div id="drop2" class="dropzone js-drop" style="margin-left:90px"></div>

            <div style="">
               <div id="drop6" class="dropzone js-drop" style="clear: both; margin-left: 0px; margin-top: 37px"></div>
               <div style="float:left"><img src="images/BaseTruck.png" /></div>
               <div id="drop7" class="dropzone js-drop" style="float: left; margin-left: 251px; margin-top: 153px; position: absolute;"></div>
               <div id="drop3" class="dropzone js-drop" style="float:left; margin-left:10px;margin-top:37px"></div>
            </div>

            <div id="drop5" class="dropzone js-drop" style="clear: both; margin-left: 186px;"></div>
            <div id="drop4" class="dropzone js-drop" style="margin-left: 90px;"></div>

            <br /><br />
            <div id="message" style="clear: both; margin-left: 0px; margin-top: 44px; width: 245px; display: inherit; border: 2px solid gray; padding: 7px;"></div>

         </div>
      </div>
   </div>
</body>
</html>
function resetCoords(evt) {
    evt.relatedTarget.style.left = "0px";
    evt.relatedTarget.style.top = "0px";
    evt.interaction.x = 0;
    evt.interaction.y = 0;
}
.on('dropdeactivate', function(event) { // this fires after each drop, whether a drop into a valid drop zone occurs or not
    var active = event.target.getAttribute('active') | 0;

    // change style if it was previously active
    // but will no longer be active
    if (active === 1) {
        removeClass(event.target, '-drop-possible');
        //event.target.textContent = 'Dropzone';
    }

    event.target.setAttribute('active', active - 1);

    if (!validDrop) {
        resetCoords(event);
    }

})