Web开发中的Drag&Drop完全手册

HTML5高级之拖拽drag   Web拖放   --在桌面应用程序上,可以将元素从一个位置拖放到另外一个位置,但在web上,没有一种能够实现这种操作的标准技术,从而在web上去实现这个功能并不容易 --在HTML5标准引入了拖放API,从而使我们有可能开发出与桌面应用程序完全相同的web应用程序     一,源元素事件   执行以下方法,需要先阻止默认行为  e.preventDefault()   -... 阅读详情

Web开发中的Drag&Drop完全手册


    这几天做了一些drag&drop操作方面的工作,在这里把一些注意事项记录下来,算是给自己备个忘,也给需要做类似工作的人留个树阴。这里要讨论的drag&drop是指使用IE提供的内置机制,而不是使用鼠标模拟的那种"假"drag&drop,比如移动一个div或span 的效果那种。

    要实现和控制drag&drop操作,那么首先第一点要弄清楚的是,到底哪些元素是可以在Web上被drag的?实际上IE默认给我们并让我们drag的元素并不多,它们是:图片、选中的文字(包括页面文字和文字控件(input, textarea)中的文字)和连接(普通连接和锚点)。除此之外,别的Web元素默认都不支持drag操作(在这些元素上面drag其实就是选择操作了),所以要实现对元素默认的drag&drop控制,只能选这3类元素来操作。

    在BizStruct同学的斧正中提到,其实几乎所有的Html元素都是支持drag&drop的(见其回复),在此表示由衷的感谢。

    接下来,那么哪些元素又是可以接受drop操作呢?任何页面上的可见元素都是可以接受drop操作的,而它们之间的不同只是在于默认的drop事件不一样。比如,文字控件(input, textarea)的默认drop事件就是获取drag操作传过来的文字内容;iframe元素的默认drop操作是到航道drag操作传过来的URL地址。当然绝大多数的Web元素的默认是操作是do nothing,什么也不做。

    那么当进行drag&drop操作时,有那些是可控制和定制的内容呢?这里关于drag&drop提供了以下一些事件(我们把它们分为作用于来源对象和目的对象来分别讨论),先讨论主要作用于来源对象的事件:
   ·ondrag —— 在整个从drag动作开始,直道drop动作结束的过程中,都会触发的一个事件。
   ·ondragstart —— 在drag动作开始时,在来源对象上触发的一个事件。
   ·ondragend —— 在drop动作结束的时候,在来源对象上出发的一个事件。

   而主要做要在目的对象上的事件:
   ·ondragenter —— 在drag动作进入某一有效目的元素时,在该目的元素上触发的一个事件。
   ·ondragover —— 在drag动作进入某一有效目的元素后,在该目的元素上触发的一个事件。
   ·ondragleave —— 在drag动作离开某一有效目的元素时,在该目的元素上触发的一个事件。
   ·ondrop —— 在任何有效目的元素上进行drop操作时,在该目的元素上触发的一个事件。

    这里的来源和目的的划分不是绝对的,比如ondragover事件,在drag操作过程中,如果鼠标进入了来源对象中,同样的也会触发这个事件。这些事件触发的顺序是:来源对象 --> ondragstart --> ondrag --> ondragend;目的对象 --> ondragenter --> ondragover --> ( ondragleave | ondrap )。由于是分别在同一个对象上触发的事件,所以这个顺序很简单。那么对于一个完整的从来源对象到目的对象的drag&drop操作来说,事件的触发序列又是怎样呢?如果src表示来源对象,des表示目的对象,那么事件触发序列为:

    src:ondragstart --> src:ondrag --> des:ondragenter --> des:ondragover --> ( des:ondragleave | des:ondrop ) --> src:ondragend.

    示例为:Drag Source Drop Destination
    // 如果alert窗口不响应鼠标点击可以使用键盘的space键来确定窗口

     了解了事件触发顺序后,定制drag&drop过程中鼠标的光标形状也是非常重要的一个内容。因为用户的drag&drop的整个过程都需要靠鼠标光标的形状指导其进行操作,如果不能实时的调整光标为适合的型状,drag&drop操作对用户来说将无异于朦眼寻物。IE提供了用来控制的drag&drop过程中光标形状的两个属性,它们是:effectAllowed和dropEffect。

    其属性分别为:
        ·effectAllowed: copy, link, move, copyLink, copyMove, all, none & uninitialized.
        ·dropEffect: copy, link, move, none.

     前者effectAllowed是用来控制允许drag&drop操作类型的,所以这里的effect不是显示的"效果",而是是否可以执行的" 操作",并且该属性只能在ondragstart事件中进行初始化,之后再对其赋值将无效。当然如果只使用effectAllowed属性,就已经可以达到控制光标形状的作用了。只是effectAllowed属性在处理复合操作时,比如copyLink, copyMove和all,会默认显示靠前那个操作类型的鼠标类型。也就是说如果effectAllowed是copyMove,那么这是鼠标光标就是 copy形状。这下就知道为什么还要弄个dropEffect属性了吧?不过这个dropEffect属性中指定的effect,只能是之前 effectAllowed允许的操作类型范围中的值,否则没有效果(显示no-drop鼠标光标)。
   
    示例为: Drag Source Drop Destination

    如果查看代码,会发现在src和des的对象元素中,在ondragover事件里除了对dropEffect赋以适当的值外,还有两句话:    event.returnValue=false;
   event.cancelBubble=true;
    只是由于页面元素在接受dragover的时候,本身都有其默认的鼠标光标显示型状,所以为了让用户自定义的鼠标光标生效,就需要使事件event的returenValue为false值并停止当事件的冒泡(event.cancelBubble=true)。

    到目前为止,一个完整的drag&drop过程就差数据传递了,其实忙活了半天,这才是藏在所有交互操作和显示效果下面最重要的步骤。这个过程需要借助于IE提供的DHTML Data Transfer对象来完成,在window对象的属性event对象中,分别有两个Data Transfer对象各自的一个实例:一个叫dataTransfer,另一个叫clipboardData。这两个对象实例的行为非常相似,但又有一些区别,clipboardData顾名思义,它使用操作系统的剪贴板来存取数据,并有3个方法;而dataTransfer通过操作一个自己的内部剪贴板来存取数据(每次ondragend事件触发后就自动清空了),除了有和clipboardData相同的3个方法外,还有两个属性(就是前面介绍的那两个effectAllowed和dropEffect)。

    我们这里不对clipboardData作更多的讨论,继续来看dataTransfer对象。它包含3个方法,它们是:setData (sDataFormat, sText), getData(sDataFormat)和clearData([sDataFormat])。它们更详细的使用和参数请参阅MSDN,这里我只用它们来实现drag&drop的数据传递。

    示例为:Drag Source Drop Destination

    其实很简单,就是在src的ondragstart中,调用event.dataTransfer.setData('TEXT', this.innerText),然后再des的ondrop事件中,调用this.innerText = event.dataTransfer.getData('TEXT')就行了。


posted on 2006-07-22 23:52 birdshome 阅读(2278) 评论(6)  编辑 收藏 引用 收藏至365Key 所属分类: Jscript&Dhtml开发

 
评论
# re: Web开发中的Drag&Drop完全手册  回复   
可以去查一下 dragDrop 这个方法,有几十个元素支持,这些元素都支持 Drag&Drop,而不仅仅是你说的三种,否则微软没有必要提供这个方法。这些元素虽然都可以 Drag&Drop,但简单的应用只能拖拽文本,而高级的应用,比如拖拽控件,就需要一些技巧,这些网上都有很多应用。
另外你的第一个演示,如果拖拽 Drag Source 到 Drop Destination,再移出,会弹出 ondragleave 的 alert,这时这个 IE 窗口中 的鼠标就会被锁死,只有键盘能操作。 2006-07-23 11:00 | BizStruct # re: Web开发中的Drag&Drop完全手册  回复   
@BizStruct 您好可以提供
Drag&Drop 的实例吗 2006-07-23 12:33 | 高海东 # re: Web开发中的Drag&Drop完全手册  回复   
@BizStruct
非常感谢您的斧正,不过在正常模式的页面下,我确实无法drag&drop这三个以外的元素(除非使用controlRange来选中它们,但是这样即使选中也不能进行普通的drag&drop)。当然如果开启了block元素的contenteditable属性,确实可以 drag&drop容器中任意的元素,不过这些元素无法用过event.dataTransfer访问到,那么怎么使用呢?还望指教。

// 另外,网上搜Web上的drag&drop,出来的全都是mousemove那种东西。 2006-07-23 14:21 | birdshome
# re: Web开发中的Drag&Drop完全手册  回复   
因为 dataTransfer 中只能保存文本,所以微软缺省只提供了你说的那三种元素的拖拽,其他元素的拖拽必须自己实现。
第一步是调用元素的 dragDrop(),应该在鼠标按下刚开始移动的时候。
第二步是响应 ondragstart 事件,设置 dataTransfer 中拖拽的文字。
后面的步骤就和系统缺省的拖拽一样了。
下面是一个可以拖拽标题的按钮。

<button onmousedown="event.srcElement.dragDrop();" ondragstart="event.dataTransfer.setData('Text', event.srcElement.value); event.dataTransfer.effectAllowed = 'CopyMove'; event.dataTransfer.dropEffect = 'move';">拖拽</button>

如果想拖拽元素,就要在 dataTransfer 中作文章,保存的文字是元素的id,在 drop 的时候,根据 id 找到被拖拽的元素,进行移动。
在我们的网站上的特性展示里有表格行拖拽的演示。 
 

华为昇腾 Atlas 200I DK A2 开发板编程接口学习入门:系统安装和开发步骤、注意事项与典型案例实战 华为昇腾开发板编程接口指南:从入门到进阶 本文系统介绍了华为昇腾开发板的编程接口体系,涵盖MindXSDK和AscendCL两大核心框架。MindXSDK提供高层封装接口,适合快速搭建视觉应用;AscendCL则是底层接口,需手动管理设备内存。文章详细讲解了: 开发环境搭建步骤,包括系统配置、依赖安装 MindXSDK组件化编程流程(图像分类实例) AscendCL底层开发方法(内存管理、模型推理) 常见问题解决方案和调试技巧 两个典型应用实例(摄像头目标检测和图像分类) 针对小白开发者,推荐从MindXS 阅读详情

相关推荐

ATR2660:卫星导航高增益低噪声放大器芯片数据手册

中国BDS(北斗卫星导航系统),美国的GPS,俄罗斯的GLONASS和欧盟的GALILEO导航系统应用而专门设计。芯片支持3.3V至5V宽电源供电。采用2级放大器的结构设计,具有28dB高增益和0.85dB的低噪声系数。支持BDS、GPS、GALILEO、GLONASS等L。典型功率增益:30dB@5V;典型输入P1dB:-18dBm@3.3V;典型工作电流:12.7mA@3.3V;宽供电电压范围:3.3V~5V;典型噪声系数:0.85dB;频段的多个卫星导航系统;ATR2660是一颗。

YHPsophie的博客 560

基于HTML5的移动Web应用——拖曳

自鼠标被发明以来,拖曳操作在计算机的操作中无处不在。例如,移动文件、图片处理等都需要拖曳。但是如此常见的操作,在Web世界只能通过模拟方式来实现。 在HTML5的规范中,可以通过为元素增加draggable= "true"来设置此元素是否可以进行拖曳操作,很大程度上简化了拖曳交互的难度。其中图片、链接默认是开启的。 在HTML5的拖曳操作中,首先要明确拖曳元素和目标元素。 (1)拖曳元素:即页面中...

sem00000的博客 785

基于Android Studio的校园智能点餐系统开发实战(附完整源码与部署指南)

本文详细介绍了基于Android Studio开发校园智能点餐系统的完整流程,包括需求分析、环境搭建、数据库设计、客户端与后台功能实现。系统采用SSM框架和MySQL数据库,解决了校园食堂高峰期排队问题,提供高效的点餐体验。附完整源码与部署指南,助力开发者快速构建类似应用。

weixin_29015801的博客 559

web实现drag拖拽布局

实际应用中可能不需要这种效果,没关系,可以限制左右盒子的最小宽度,判断小于最小宽度就不再进行缩小即可,放大限制 也是类似的。如果用户按住鼠标左键开始向左或者向右拖拽,需要精确计算用户拖拽的实际距离,也是鼠标移动的实际距离。如果用户按下鼠标左键,可以监听鼠标按下事件,获得鼠标按下的startX = evt.clientX,也能获得resize相对于父元素的左偏移值offsetLeft。到这里拖拽核心逻辑就结束了,为了更好的理解拖拽过程,于是就有了下方不怎么好看的抽象图,画的不好,多多理解。

mon_star°的博客 1188

基于STM32F103标准库与DMA的实时音频FFT频谱显示系统设计

本文详细介绍了基于STM32F103芯片与DMA技术实现实时音频FFT频谱显示系统的设计方法。通过标准库驱动和FFT算法处理音频信号,结合OLED显示屏实时绘制音乐频谱,涵盖硬件选型、核心原理、开发环境搭建及性能优化等关键步骤,为数字信号处理应用提供实用参考。

yellow的专栏 775

S-function入门及案例详解(1)——S-function基础介绍及基本案例

本专题将用三篇文章对S-function进行介绍及其案例详解。欢迎关注~ 目录一、S-Function简介二、详解sfuntmpl函数2.1 sfuntmpl函数介绍2.2 mdlInitializeSizes函数2.3 mdlDerivatives函数2.4 mdlUpdate函数2.5 mdlOutputs函数2.6 mdlGetTimeOfNextVarHit函数2.7 mdlTerminate函数三、案例1——对波形的幅值进行放大3.1 案例分析3.2 案例详解3.3 输出波形四、案例2——对波形的

Wendy的博客 7万+

HTML5原生拖拽/拖放 Drag & Drop 详解

前言拖放(drap &amp;&amp; drop)在我们平时的工作中,经常遇到。它表示:抓取对象以后拖放到另一个位置。目前,它是HTML5标准的一部分。我从几个方面学习并实践这个功能。 拖放的流程对应的事件我们先看下拖放的流程: 选中 ---&gt; 拖动 ---&gt; 释放复制代码然后,我们一步步看下这个过程中,会发生的事情。 选中在HTML5标准中,为了使元素可拖动,把draggabl...

weixin_33743248的博客 649

html5 drag移动位置,利用HTML5 的拖放Drag 相关的API,怎么实现拖动的对象离开原来的位置...

仅提供思路。H5的原生拖放只是允许监听鼠标拖拽事件,并允许传递自定义数据。具体实现什么行为,需要自己写。如果用原生拖放,自己实现的部分,逻辑类似下面这句话:child_1.insertBefore(child_2);child_1是dragstart时候得到的,而child_2的获取需要在drop时通过相对位置计算得出来的,只有这部分在整个实现中比较繁琐。原生拖放在实现这种拖拽移动DOM的表现上,...

weixin_39956036的博客 279

解决国内网页无法加载reCaptcha的方法

科普: reCaptcha是Google公司的验证码服务,方便快捷,改变了传统验证码需要输入n位失真字符的特点。reCaptcha在使用的时候是这样的: 只需要点一下复选框,Google会收集一些鼠标轨迹、网络信息、浏览器信息等等,依靠后端的神经网络判断是机器还是人,绝大多数验证会一键通过,无需像传统验证码一样。但是reCaptcha使用了google.com的域名,这个域名在国内是被墙的。所以,也就导致了官网上无法注册/登录的问题,挡住了不少人入正的脚步。 解决办法: 【第一步】安装fir

调皮李小怪博客 25万+

Qt入门教程【高级控件篇】QModelIndex索引

QModelIndex索引

小鱼酱的博客 4466

drag传递参数

dragstart(event) { event.dataTransfer.setData('id', event.target.id) } drop(event) { let data = event.dataTransfer.getData("id"); } dragend(event) { event.dataTransfer.clearData() }

solocao的专栏 803

探索激光焊接光束质量诊断系统:原理、应用与前沿

激光焊接光束质量诊断系统是一套专门用于精确评估和监测激光焊接过程中光束特性的精密设备。它宛如一个精密的 “光束医生”,能够全方位地对激光光束进行 “体检”,为焊接工艺提供关键的数据支持。探测器:作为系统的 “感知触角”,探测器负责捕捉激光光束的各种信息,其性能直接影响着诊断的准确性。例如,常见的 CCD(电荷耦合器件)探测器和 CMOS(互补金属氧化物半导体)探测器,它们能够将光信号转化为电信号,具有高灵敏度、高分辨率等特点,可精确探测光束的强度分布、光斑位置等参数。光学透镜。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2582

webstorm常用的快捷键

快速创建文件 Ctrl + Alt + Insert 全局搜索方法和变量 Ctrl+Shift+G 全局搜索文件 连按两次Shift 格式化 Ctrl+Alt+L 局部搜索 Ctrl+F 局部替换 Ctrl+

bigdargon的博客 757

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

html5 原生拖拽,运用HTML5原生拖动事件(drag)实现拖动效果

拖动效果相信很多朋友都自己写过,不管你用原生JS还是Jquery要实现起来也很简单,但是今天我想介绍的是运用HTML5标准中定义的原生拖动事件实现拖动效果。一、背景:其实说是HTML5标准定义,其实最早在IE4中就有拖放功能的API,只是在IE4中,网页中只有两种对象可以拖放:图像和某些文本。并且在IE4中唯一有效的放置目标是文本框。到了IE5.5,拖放功能得到了扩展,让网页中的任何元素都可以拖放...

weixin_35812176的博客 954

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

HTML5 拖放(Drag 和 Drop)

HTML5 拖放(Drag 和 Drop) 一、参考地址:https://www.runoob.com/html/html5-draganddrop.html 二、实例 <!DOCTYPE HTML> <html> <h...

夏已微凉、 1304

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

H5--drag拖拽事件

H5—全局拖拽属性draggable draggable全局拖拽属性—规定元素是否可拖动 属性值 描述 true 规定元素的可拖动的 false 规定元素不可拖动 auto 使用浏览器的默认行为 注意:链接和图像默认是可拖动的,不需要 draggable 属性 浏览器兼容: 注意: ①IE 9+, Firefox, Opera, Chrome, and Safari ...

web_only_的博客 2666

032js原生办法实现Dom拖拽与数据交互功能-支持多级间Dom的drag与drop

032js原生办法实现Dom拖拽与数据交互功能-支持多级间Dom的drag与drop

阿赛 652

在 vue中使用 html5 的 drag和 drop 拖拽功能

导读: 我们现在用的框架是vue,提倡的是尽量不操作dom,而 html5中的 drag 和 drop 是拖出当前选中元素,再放到设置了dragover的目标元素中,不符合vue的理念,而且操作dom改变目前布局也不利于我们去保存数据,所以经过我不懈的努力,想到了个一个既不操作dom又能实现拖拽的功能。 一、回顾 html5 可拖拽 drag和drop 需要注意的是,需要被拖动的元素必须要设置 d...

qq_35257117的博客 1万+

日常随笔:javascript拖拽drop和drag的使用

Drag,Drop踩坑笔记 1. 几个概念 1. 拖拽事件 摘自MDN: HTML drag-and-drop uses the DOM event model and drag events inherited from mouse events. A typical drag operation begins when a user selects a draggable element, ...

qq_24724109的博客 1917

html列表拖拽排序插件,可对列表自由拖拽排序的jQuery插件

dragslot.js是一款可以对列表自由拖拽排序的jQuery插件。该插件主要的功能是实现了列表项可以在各个列表中相互拖拽. 对于像todo list, 分配任务列表都可以应用这个效果。使用方法在页面中引入dragslot.css和dragslot.js文件。HTML结构使用该插件的基本HTML结构要求如下:drag item 1drag item 2初始化插件在页面DOM元素加载完毕之后,可以...

weixin_31720909的博客 648

web拖动Drag&Drop原理

 html>head>title>Page Titletitle>style>....drag {...}{    cursor: move;}.box {...}{    margin: 0px;    width: 200px;    border: 1px solid #ccc;}.box h3.title {...}{    margin: 0px;    width: 100%;

董浩的专栏 2075

dataTransfer.getData()在dragover,dragenter,dragleave中无法获取数据的问题

做拖拽相关效果时,想在ondragover时给被拖拽元素添加一些样式,于是在dragover事件的函数中通过dataTransfer.getData()获取在dragstart中设置的数据,然而发现dataTransfer.getData()所返回的数据为空。 查询资料发现dataTransfer.setData()中所设置的数据是存储在drag data store中,而根据W3C标准...

weixin_30657999的博客 1395

HTML5实现元素的原生拖放(drag&drop)【涉及Event对象】

-在HTML5中,任何元素都可以实现拖放。 -Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放。 注释:在 Safari 5.1.2 中不支持拖放。先上代码,依然是w3c中的示例!!!<!DOCTYPE HTML> <html> <head> <style type="text/css"> #div1 {width:198p

Gravity Falls 2179

原生拖拽,拖放事件(drag and drop)

原生拖拽,拖放事件(drag and drop) 拖拽,拖放事件可以通过拖拽实现数据传递,达到良好的交互效果,如:从操作系统拖拽文件实现文件选择,拖拽实现元素布局的修改. drag and drop事件流程 一个完整的drag and drop流程通常包含以下几个步骤: 设置可拖拽目标.设置属性draggable="true...

weixin_34129145的博客 885
上一篇: JS判断数字/字母/中文
下一篇: 在Web界面下如何生成像资源管理器一样的树形目录
SmartJavaer
博客等级 码龄21年 13粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值