You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTML拖拽API实现多表单控件拖拽问题求助

HTML拖拽API实现多表单控件拖拽问题求助

各位开发者好,我正在尝试用HTML原生拖拽API实现表单控件的拖拽功能,想要让文本框、单选按钮、复选框、下拉框和文件上传按钮都支持拖拽,但目前我的代码遇到了几个棘手的问题:

  • 文本框可以正常拖拽,但单选按钮和复选框完全拖不动
  • 拖拽文本框到目标区域后,它不会停在我放下的精确位置,而是回到了自身默认的布局位置
  • 拖拽文本框时,原控件会被移走,我想要的是复制一份控件进行拖拽,原控件保留在侧边栏里

下面是我目前的代码,包含JS、CSS和HTML部分:

JavaScript代码

function dragStart(ev) {
    ev.dataTransfer.effectAllowed = 'move';
    ev.dataTransfer.setData("Text", ev.target.getAttribute('id'));
    ev.dataTransfer.setDragImage(ev.target, 0, 0);
    return true;
}

function dragEnter(ev) {
    ev.preventDefault();
    return true;
}

function dragOver(ev) {
    return false;
}

function dragDrop(ev) {
    var src = ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(src));
    ev.stopPropagation();
    return false;
}

CSS代码

@import url('https://fonts.googleapis.com/css?family=Roboto:300,400,400i,500');

body {
    overflow-x: hidden;
    font-family: 'Roboto', sans-serif;
    font-size: 16px;
}

/* Toggle Styles */
#viewport {
    padding-left: 250px;
    -webkit-transition: all 0.5s ease;
    -moz-transition: all 0.5s ease;
    -o-transition: all 0.5s ease;
    transition: all 0.5s ease;
}

#content {
    width: 100%;
    position: relative;
    margin-right: 0;
    background: red;
    height: 100vh;
}

/* Sidebar Styles */
#sidebar {
    z-index: 1000;
    position: fixed;
    left: 250px;
    width: 250px;
    height: 100%;
    margin-left: -250px;
    overflow-y: auto;
    background: white;
    -webkit-transition: all 0.5s ease;
    -moz-transition: all 0.5s ease;
    -o-transition: all 0.5s ease;
    transition: all 0.5s ease;
}

ul {
    list-style-type: none;
}

#sidebar header {
    background-color: #263238;
    font-size: 20px;
    line-height: 52px;
    text-align: center;
}

#sidebar header a {
    color: #fff;
    display: block;
    text-decoration: none;
}

#sidebar header a:hover {
    color: #fff;
}

#sidebar .nav {
    cursor: pointer;
}

HTML代码

<form id="form1" runat="server">
    <div id="viewport">
        <!-- Sidebar -->
        <div id="sidebar">
            <header>
                <a href="#">My App</a>
            </header>
            <ul class="nav">
                <li>
                    <asp:TextBox ID="TextBox2" draggable="true" ondragstart="return dragStart(event)" runat="server"></asp:TextBox>
                </li>
                <li>
                    <asp:RadioButton ID="RadioButton1" draggable="true" ondragstart="return dragStart(event)" runat="server" Text="Radio button" />
                </li>
                <li>
                    <asp:CheckBox ID="CheckBox1" draggable="true" ondragstart="return dragStart(event)" runat="server" Text="Check box" />
                </li>
                <li>
                    <asp:FileUpload ID="FileUpload1" draggable="true" ondragstart="return dragStart(event)" runat="server" />
                </li>
                <li>
                    <asp:TextBox ID="TextBox1" draggable="true" ondragstart="return dragStart(event)" runat="server" TextMode="MultiLine"></asp:TextBox>
                </li>
                <li>
                    <asp:TextBox ID="TextBox3" draggable="true" ondragstart="return dragStart(event)" runat="server" TextMode="Date"></asp:TextBox>
                </li>
            </ul>
        </div>
        <!-- Content -->
        <div id="content" ondragenter="return dragEnter(event)" ondrop="return dragDrop(event)" ondragover="return dragOver(event)">
            <nav class="navbar navbar-default">
                <div class="container-fluid">
                    <ul class="nav navbar-nav navbar-right">
                        <li>
                            <a href="#"><i class="zmdi zmdi-notifications text-danger"></i></a>
                        </li>
                        <li><a href="#">Test User</a></li>
                    </ul>
                </div>
            </nav>
            <div class="container-fluid">
                <h1>Simple Sidebar</h1>
                <p>Make sure to keep all page content within the <code>#content</code>.</p>
            </div>
        </div>
    </div>
</form>

备注:内容来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 12:18:23