整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTML5之实现本地拖放



html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>本地拖放</title>
<style>
#imgContainer{
background-color: #cccccc;
width: 500px;
height: 500px;
}
</style>
</head>
<body>
<div id="imgContainer"></div>
<script src="js/app1.js"></script>
</body>
</html> 


pp1.js 源码:

简介】

拖放是一种常见的特性, 属于html5标准的一部分, 即抓取对象以后拖动到另一个位置, 在html5中, 任何元素都可被设置拖放。首先, 我们要给需要拖动的HTML元素启用拖动功能, 设置属性draggable="true",

<div draggable="true"></div>

提示:a标签和img标签默认是启用该属性的, 可不需要设置draggable属性。

draggable有三个值, 如下所示:

draggable = true(元素可以被拖动)

draggable = false(元素不能被拖动)

draggable = auto(浏览器可以自主决定某个元素是否可以被拖动)

【用法】

当我们用鼠标拖拽目标元素过程中会触发的事件:

ondragstart:用户按下鼠标开始拖动时触发

ondrag:用户正在拖动时反复触发

ondragend:用户结束拖动后触发

<img id="imgs" ondragstart="startFun()" ondrag="ondragFun()" ondragend="ondragendFun()" src="../img/a.png"/>

当拖动元素进入目标容器内触发的事件:

ondragenter:鼠标拖动对象进入释放区时触发

ondragover:被拖动物体进入目标容器内移动时反复触发

ondragleave:拖动对象在释放区没有释放就离开容器时触发

ondrop:被拖动物体在目标容器内释放时触发

<div id="container" ondragenter="ondragenterFun(event)" ondragover="ondragoverFun(event)" ondragleave="ondragleaveFun()" ondrop="drop()"></div>

ondragenter和ondragover事件的默认行为是拒绝接受任何被拖放的项目, 所以我们必须要做的最重要的事情就是防止这种默认行为的发生。

因此, 我们只需要在这两个事件调用的函数中传入event对象, 使用event.preventDefault()就可取消这种默认行为;举个例子, 在drop事件时, Firefox浏览器会关闭网页, 转而显示被拖动图片img元素src所引用的地址。

取消元素默认行为:

function ondragenterFun(e){

e.preventDefault();

}

function ondragoverFun(e){

e.preventDefault();

}

在event对象中, 我们会使用dataTransfer属性来获取DataTransfer对象, 在DataTransfer对象中有我们操作数据的属性和方法, 具体如下:

datatransfer:转移释放元素的数据到释放区, 返回Datatransfer对象

event.dataTransfer //返回DataTransfer对象

DataTransfer对象的属性:

files:处理从操作系统拖动并释放到释放区的文件;

types:返回一个字符串数组, 该对象包含了dataTransfer对象中数据的所有类型;

items:返回DataTransferItems对象, 该对象代表了拖动数据;

dropEffect:设置拖放目标允许发生的拖放行为, 如果此处设置的拖放行为不在effectAllowed属性设置的可拖放行为内, 拖放操作将会失败。该属性值只允许为"null"、"copy"、"link"或"move";

effectAllowed:设置拖动元素允许发生的拖动行为, 该属性值可为"none"、"copy"、"copyLink"、"copyMove"、"link"、"linkMove"、"move"、"all"或"uninitialized";

DataTransfer对象的方法:

setData( format , data ):将指定格式的数据赋值给dataTransfer对象,参数format定义数据的格式也就是数据的类型,data为待赋值的数据。

getData( format ):从dataTransfer对象中获取指定格式的数据,format代表数据格式,data为数据。

clearData( [format] ):从dataTransfer对象中删除指定格式的数据,参数可选,若不给参数,将删除对象中所有的数据。

setDragImage(el, x, y):设置拖放操作的图标,其中el代表自定义图标,x代表图标与鼠标在水平方向上的距离,y代表图标与鼠标在垂直方向上的距离。

了解了H5拖动使用的api以后我们接下来看一个综合的案例, 功能如下:

1)、实现图片拖动功能;

2)、实现图片复制功能;

3)、过滤不能拖动的元素;

4)、实现拖动本地图片到浏览器指定位置;

公共css部分:

<style>

#dropIn{

border:1px solid #AAAAAA;

height:100px;

margin-bottom: 10px;

padding: 10px;

}

#dropIn>img{

margin-right: 10px;

border:2px solid deepskyblue;

}

img{

width:100px;

border-radius: 10px;

border:2px solid red;

}

</style>

html部分:

<body>

<div id="dropIn"></div> <!--释放区-->

<img id="drop1" src="img/a.png" alt="" />

<!--拖动的图片元素-->

</body>

js部分:

<script type="text/javascript">
var darggID;
function getId(el){
return document.getElementById(el)
}
var dropId1 = getId("drop1");
var dropInId = getId("dropIn");
//取消事件默认行为
dropInId.ondragenter = cancelDefault;
dropInId.ondragover = cancelDefault; //绑定拖动元素释放时触发的事件
dropInId.ondrop = drop; //绑定
dropId1.ondragstart = startFun;
function cancelDefault(ev){ //取消默认行为
ev.preventDefault();
}
function startFun(ev){
darggID = ev.target.id;
//获取被拖动元素的id
//从源对象上的事件处理中保存数据,数据类型为"Text"
ev.dataTransfer.setData("Text",darggID);
}
function drop(ev){
ev.preventDefault();
// 从目标对象上的事件处理中读取"Text"类型数据
var data=ev.dataTransfer.getData("Text");
// 插入到目标对象中
ev.target.appendChild(document.getElementById(data));
}
</script>

接下来我们添加两张图, "drop2"是实现复制的图片, "drop3"是既不能复制也不能拖动的图片;

<img id="drop2" src="img/b.png" alt="" /><img id="drop3" src="img/c.png" alt="" />

添加js代码:

//获取页面元素

var dropId2 = getId("drop2");

var dropId3 = getId("drop3");

//绑定事件

dropId2.ondragstart = startFun;dropId3.ondragstart = startFun;

//修改drop函数为

function drop(ev){

ev.preventDefault();

// 从目标对象上的事件处理中读取"Text"类型数据

var data=ev.dataTransfer.getData("Text");

if(data=='drop1'){

//移动

ev.target.appendChild(document.getElementById(data));

}

if(data=='drop2'){//复制

var nreEl=document.getElementById(darggID).cloneNode(false);

getId("dropIn").appendChild(nreEl);

}

if(data=='drop3'){//过滤drop3,drop3不做任何操作

alert('过滤drop3')

}

}

接下来我们实现拖动本地图片到浏览器, 我们就将图片拖动到id为"dropIn"的这个div中;添加js:

/*document 监听drop 并阻止浏览器打开客户端的图片*/

document.ondragover = function (e) {

//只有在ondragover中阻止默认行为

e.preventDefault();

};

document.ondrop = function (e) {

//阻止 document.ondrop的默认行为

e.preventDefault();

};

//dropIn是div的id

dropIn.ondrop = function (e) {

var list = e.dataTransfer.files;

for (var i = 0; i < list.length; i++) {

var f = list[i];

reader(f);

}

};

function reader(f) {

var reader = new FileReader();

//读取数据

reader.readAsDataURL(f);

reader.onload = function () {

var img = new Image();

img.src = reader.result;

dropIn.appendChild(img);

}

}

【浏览器支持】

目前只有Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari5支持拖放,在 Safari5.1.2 中不支持拖放。

最后再和大家分享一个技巧, 这种拖动行为还能跨浏览器工作, 这里说的跨浏览器不是浏览器之间的跨窗口, 而是可以从Chrome浏览器拖动到Firefox浏览器, 因为拖放功能的支持是集成在操作系统里面的, 有着相同的特性。

文由ScriptEcho平台提供技术支持

项目地址:传送门

Vue 中使用 InMap 创建动态轨迹地图

应用场景介绍

动态轨迹地图广泛应用于物流追踪、车辆管理、人员定位等场景,可直观展示移动对象的历史轨迹和实时位置。本代码示例展示了如何使用 Vue 框架和 InMap 库创建一个动态轨迹地图,实现轨迹展示、实时更新和交互功能。

代码基本功能介绍

该代码的主要功能包括:

  • 加载 InMap 库并创建地图实例
  • 从外部数据源加载轨迹数据
  • 创建轨迹线覆盖物并添加到地图
  • 设置轨迹线样式和交互事件
  • 实时更新轨迹数据,反映移动对象的最新位置

功能实现步骤及关键代码分析

1. 加载 InMap 库和创建地图实例

onMounted(async () => {
  let jsUrls = [
    'https://api.map.baidu.com/getscript?v=2.0&ak=cxtWZ9zGiLlLdQwBSuGGwpanwqfaLvEc&services=&t=20240108120844',
    'https://registry.npmmirror.com/inmap/2.3.3/files/dist/inmap.min.js',
  ]
  await Promise.all(jsUrls.map((js) => loadJavascript(js)))

var map = new inMap.Map({
id: 'allmap',
skin: 'Blueness',
center: [-22.053354, 27.353393],
zoom: {
value: 3,
show: true,
max: 22,
min: 3,
},
})
})

此代码块负责加载 InMap 库和创建地图实例。首先,异步加载必要的 JavaScript 文件。然后,使用 inMap.Map 构造函数创建地图实例,并指定地图容器 ID、皮肤、中心点和缩放级别等参数。

2. 加载轨迹数据

var overlay = new inMap.LineStringOverlay({
  data: data.map(function (item, index) {
    item.name = '轨迹' + index
    item.count = index
    return item
  }),
})

此代码块加载外部轨迹数据并将其添加到地图中。它使用 inMap.LineStringOverlay 构造函数创建一个轨迹线覆盖物,并传入轨迹数据。轨迹数据以数组形式提供,每个元素包含轨迹点的经度、纬度和时间戳等信息。

3. 设置轨迹线样式和交互事件

overlay.setStyle({
  normal: {
    borderColor: 'rgba(255, 250, 50, 0.3)',
    borderWidth: 0.7,
    shadowColor: 'rgba(255, 250, 50, 1)',
    shadowBlur: 20,
  },
})

此代码块设置轨迹线的样式,包括边框颜色、宽度、阴影颜色和模糊度。

overlay.setEvent({
  onState(state) {
    console.log(state)
  },
})

此代码块设置轨迹线的交互事件。当用户悬停、单击或拖动轨迹线时,会触发 onState 事件,并将当前状态输出到控制台。

4. 实时更新轨迹数据

// 假设您有实时更新轨迹数据的逻辑
// 在此示例中,我们模拟通过 WebSocket 接收数据
let socket = new WebSocket('ws://localhost:8080')
socket.onmessage = (event) => {
  let newData = JSON.parse(event.data)
  overlay.setData(newData)
}

此代码块演示了如何实时更新轨迹数据。它模拟了一个 WebSocket 连接,用于接收更新后的轨迹数据。当收到新数据时,它会使用 setData 方法更新轨迹线覆盖物的轨迹数据。

总结与展望

开发这段代码的过程让我深入了解了 Vue 中使用 InMap 创建动态轨迹地图的技术。通过分析关键代码,我掌握了加载 InMap 库、创建地图实例、加载轨迹数据、设置轨迹线样式和交互事件以及实时更新轨迹数据的步骤。

未来,该卡片功能可以进一步拓展和优化,例如:

  • 集成更多数据源,支持从多种来源加载轨迹数据
  • 优化数据处理和更新算法,提高实时性的同时降低内存消耗
  • 添加更多交互功能,例如轨迹回放、轨迹分析和导出
  • 更多组件:

获取更多Echos

本文由ScriptEcho平台提供技术支持

项目地址:传送门

微信搜索ScriptEcho了解更多