将具有相同ID类和标记HTML的多个元素拖放到屏幕上的任何位置

Drag and drop anywhere on screen with multiple elements of the same ID Class and Tag HTML

本文关键字:元素 拖放 屏幕 位置 任何 HTML ID      更新时间:2023-09-26

大家好,这是我的第一个问题,所以我可能做错了。我试图实现的是让多个<aside>元素都具有相同的ID类,当然Tag可以通过拖放特性在屏幕上的任何位置移动。我找到了一个JSFiddle,演示了我所基于的代码,它使用了一个可以移动到任何地方的元素,但在使用多个元素时将不起作用。控制移动的代码在这里:

function drag_start(event) {
var style = window.getComputedStyle(event.target, null);
event.dataTransfer.setData("text/plain",
(parseInt(style.getPropertyValue("left"),10) - event.clientX) + ',' + 
(parseInt(style.getPropertyValue("top"),10) - event.clientY));
} 
function drag_over(event) { 
    event.preventDefault(); 
    return false; 
} 
function drop(event) { 
    var offset = event.dataTransfer.getData("text/plain").split(',');
    var dm = document.getElementById('dragme');
    dm.style.left = (event.clientX + parseInt(offset[0],10)) + 'px';
    dm.style.top = (event.clientY + parseInt(offset[1],10)) + 'px';
    event.preventDefault();
    return false;
} 
var dm = document.getElementById('dragme'); 
dm.addEventListener('dragstart',drag_start,false); 
document.body.addEventListener('dragover',drag_over,false); 
document.body.addEventListener('drop',drop,false); 

我遇到问题的部分是拖放系统,它要求元素具有单独的 ID。我还需要让所有旁白元素必须具有相同的 id,并且我不想使用类。在过去的三天里,我尝试了思考并在网上搜索了搜索,但没有找到答案,因为所有链接都回到了相同的代码。我已经研究了获取单击最后一个元素的索引,但找不到获取具有相同ID的所有元素的方法。更新:已经破坏了dnd系统需要帮助:

var dragindex = 0;
$(document).ready(function(){
    $("aside").click(function(){
        dragindex = $(this).index();
    });
});
function drag_start(event) {
var style = window.getComputedStyle(event.target, null);
event.dataTransfer.setData("text/plain",
(parseInt(style.getPropertyValue("left"),10) - event.clientX) + ',' + (parseInt(style.getPropertyValue("top"),10) - event.clientY));
} 
function drag_over(event) { 
event.preventDefault(); 
return false; 
} 
function drop(event) { 
var offset = event.dataTransfer.getData("text/plain").split(',');
var dm = document.getElementById('#winborder');
dm.style.left = (event.clientX + parseInt(offset[0],10)) + 'px';
dm.style.top = (event.clientY + parseInt(offset[1],10)) + 'px';
event.preventDefault();
return false;
} 
function makewindow(content, storevar) {
    storevar = document.createElement('aside');
    storevar.setAttribute("dragable", "true");
    storevar.setAttribute("id", "winborder");
    var content = document.createElement('div');
    content.setAttribute("id", "wincontent");
    storevar.appendChild(content);
    document.body.appendChild(storevar);
    storevar.addEventListener('dragstart',drag_start,false);
    document.body.addEventListener('dragover',drag_over,false); 
    document.body.addEventListener('drop',drop,false); 
}

在getelementbyid上尝试过使用和不使用"#">

以下代码将允许拖放;很抱歉它没有遵循您以前的编码风格。

下面是一个JSFiddle,显示了它的实际效果:https://jsfiddle.net/6gq7u8Lc/

    document.getElementById("dragme").onmousedown = function(e) {
        this.prevX = e.clientX;
        this.prevY = e.clientY;
        this.mouseDown = true;
    }
    document.getElementById("dragme").onmousemove = function(e) {
        if(this.mouseDown) {
            this.style.left = (Number(this.style.left.substring(0, this.style.left.length-2)) + (e.clientX - this.prevX)) + "px";
            this.style.top = (Number(this.style.top.substring(0, this.style.top.length-2)) + (e.clientY - this.prevY)) + "px";
        }
        this.prevX = e.clientX;
        this.prevY = e.clientY;
    }
    document.getElementById("dragme").onmouseup = function() {
        this.mouseDown = false;
    }

附带说明一下,您将无法为它们提供相同的ID。DOM 不支持这样的事情。如果你想添加多个相同类型的元素,我建议使用"容器"父div,将这些元素添加为div 的子元素,并遍历 .children 属性以访问每个元素。

不知道你是否要使用Jquery,但我知道它比原始的javascript解决方案简单得多。我一直在互联网和 Stack Overflow 上搜索网页解决方案上任何位置的简单拖放,但我找不到有效的。这个问题的其他答案对我来说很奇怪。它们有时有效,有时无效。但是,一位朋友建议使用Jquery版本,哇,它要简单得多。只需一行代码!

var dragme = document.getElementsByClassName("dragme");
		for (var i = 0; i < dragme.length; i++) {
			$(dragme[i]).draggable();
		}
.dragme {
  cursor: move;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<h1 class="dragme">Try dragging me anywhere on this sample!</h1>
<h2 class="dragme">Drag me, too!</h2>

重要说明:此代码不仅适用于 Jquery,它还需要 Jquery UI 文件。

如果上述示例对您不起作用,请在下面评论它显示的错误。请注意,这适用于无限数量的元素。这个特定示例适用于具有类"dragme"的元素,因此只需将其替换为您自己的类即可。对于一个元素,它是一行代码:$("#yourid").draggable();

这段代码在谷歌浏览器上对我有用。希望这对像我一样迟到此页面的人有所帮助!