直播软件开发,JavaScript HTML5 dom,图片拖拽上传功能

发布时间 2023-09-11 14:07:08作者: 云豹科技-苏凌霄

直播软件开发,JavaScript HTML5 dom,图片拖拽上传功能

 

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
.box{
display: flex;
width: 100%;
justify-content: center;
margin-top: 300px;
align-items: center;
}
#drag{
width: 200px;
height: 200px;
display: flex;
justify-content: center;
border-radius: 10px;
align-items: center;

}
#draged{
width: 400px;
height: 400px;
/* border: 4px pink; */
border-style: dashed;
margin-left: 100px;
border-radius: 10px;
/* border: 4px dashed #AAAAAA; */
position: relative;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
overflow-x: hidden;
overflow-y: scroll;
scrollbar-width: none;
-ms-overflow-style: none;
}
/* 隐藏滚动条 */
#draged::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
#draged::before{
content: '请拖拽到此处';
color: #AAAAAA;
position: absolute;
z-index: -1;
}
#draged img {
width: 50%;
height: 50%;
object-fit: contain;
margin-top: 20px;
}
.dragover{
border: 4px orangered;
}
.dropSucess{
border: 4px green;
}
</style>
</head>
<body>
<div class="box">
<!-- 可拖拽元素 ,img元素和超链接a标签,默认允许拖放,可定义draggable,可以不定义draggable-->
<div id="drag" draggable="true" class="drag">可拖拽元素</div>
<!-- 必须阻止默认事件,因为浏览器对拖拽事件的默认处理方式是禁止拖拽 -->
<!-- ondrag 是拖拽开始,可存放拖拽数据,列如元素,class,id等 -->
<!-- ondragover是元素进入放置区域,可进行更改样式等操作 -->
<!-- ondrop元素放置时的事件,可以对元素进行真实的移动操作 -->
<!-- 可放置区域,存放可拖拽的元素, -->
<div  id="draged" class=""></div>
<input id="upload" type="file" value="file"/>
</div>
<script type="text/javascript">
const drag = document.getElementById('drag')
const draged = document.getElementById('draged')
/*
拖动事件
可拖动元素可以触发的:
dragstart:鼠标点中元素并且开始移动时触发
drag:拖拽过程中持续触发
dragend:拖拽结束松开鼠标时触发
当可拖拽元素到某个目标元素时,目标元素会触发的:
dragenter:拖拽元素到目标上时触发
dragover:拖动元素在目标元素中,持续触发
dragleave:离开目标元素时触发
drop:拖放元素到了目标元素中松开鼠标时触发
e.preventDefault(); 每个动作内部必须,写入这个,防止默认事件的产生。
拖拽事件中会初始化一个dataTransfer对象,用于保存拖拽数据和交互信息,在进行拖放操作
的时候,dataTransfer对象可以用来保存被拖动的数据。
他可以保存一项或多项数据,一种或多种数据类型,就是可以通过它来传输被拖动的数据。
以便在拖拽结束的时候,对拖拽数据进行其他操作。
clearData方法可以用来清除dataTransfer对象内的数据,可以指定删除特定格式的数据,
如果不指定格式,则默认删除所有携带的数据。
setData 方法在拖拽开始的时候向dataTransfer存放数据,用types属性来指定数据的MIME类型
getData 方法返回指定数据,如果数据不存在,返回空字符串,getData方法在拖动
结束时读取dataTransfer对象中的数据。
setDragimage(Element image,x,y):制定拖拽元素时跟随鼠标移动的图片,
x,y分别代表相对鼠标的坐标。
*/
// 拖拽开始
drag.addEventListener('dragstart',handleDragStart)
function handleDragStart(e){
//text/plain,imgage/png,等等类型 e.target.id 存放的值
e.dataTransfer.setData('text/plain',e.target.id)
}
//拖拽结束事件
draged.addEventListener('dragover',handleDrageover)
function handleDrageover(e){
// 阻止默认事件。不要让浏览器默认事件来干扰。拖拽操作
e.preventDefault()
draged.classList.add('dragover')
}
// 拖拽离开事件
draged.addEventListener('dragleave',handleDragLeave)
function handleDragLeave(e){
e.preventDefault()
draged.classList.remove('dragover')
}
// 拖拽释放
draged.addEventListener('drop',handleDrop)
function handleDrop(e){
e.preventDefault()
// 将dom元素拖拽进可放置区域
// const draggedId = e.dataTransfer.getData('text/plain')  //标注: 拖拽dom元素
// draged.appendChild(document.getElementById('drag'))    //标注: 拖拽dom元素
draged.classList.add('dropSucess')
// console.log(...e.dataTransfer.items)
// 拖拽也支持外部拖拽文件,图片进来,可以在该事件中监听,
// 如果是拖拽文件需要注释上面 “标注:拖拽dom元素” 两行代码,如果拖拽dom,注释下面文件拖拽上传代码
// 遍历e.dataTransfer.items 属性去做操作
// ...e.dataTransfer.items 可能为空,做一个判空处理
if([...e.dataTransfer.items]){
// 拖拽文件,解构成数组,如果是多个需要遍历,所以调用forEach
[...e.dataTransfer.items].forEach(item=>{
// 如果拖拽进来的是文件夹
let Directory = item.webkitGetAsEntry()
if(Directory.isDirectory) {
console.log('这是一个文件夹')
}
console.log(Directory);
// 通过kind属性判断拖拽进来的是不是文件
if(item.kind === 'file') {
const file = item.getAsFile()
//createPreview 生成预览,比如判断图片
Preview(file)
}
})
}
}
// 图片处理
function Preview(file){
// 如果是图片类型的文件
if(file.type.startsWith('image')){
// 创建一个图片元素
const image = document.createElement('img')
// 根据文件对象创建一个ObjectURL,用作src属性
image.src = URL.createObjectURL(file)
// 图片加载成功过后,ObjectURL就没有用了,就回收这个ObjectURL
file.onload = function(){
URL.revokeObjectURL(this.src)
}
// 把图片追加到可放置区域
draged.appendChild(image)

}
// 文件上传功能学习中,以下代码无效
async function dirReader(item){
let res = []
let internalProces = (item,path,res)=>{
if(item.isFile){
item.file(file=>{
file.path = path + file.name
let newFile = new File([file],file.path,{type:file.type})
res.push(newFile)
})
}  else if(item.isDirectory) {
let fileReader = file.createReader()
fileReader.readEntries(entries =>{
for(let i = 0; i < entries.length; i++){
internalProces(entries[i],path+item.name+"/",res)
}
})
}
}
await internalProces(item,'',res)
// console.log(res)
return res
}
</script>
</body>
</html>

以上就是 直播软件开发,JavaScript HTML5 dom,图片拖拽上传功能,更多内容欢迎关注之后的文章