今天总结下常见的拖拽效果的实现原理及场景应用,拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等,效果还是蛮不错的
现在有多种实现方法,常用的有H5的拖放API和原生JS两种方法。
(1)HTML5提供专门的拖拽与拖放的API,在不考虑兼容的情况下,以后实现这类效果就不必乱折腾了
【兼容:IE9+和其他主流浏览器均支持,而IE8和早前版本均不支持draggable属性】
(2)原生JS实现
接下来我分开解释下
(1)H5的draggable属性实现
首先说下HTML5里新增的draggable属性
在html5中,默认<img.../>和设置了href的<a>是可拖动的,其他都需手动把元素的draggable属性设置为true
然后使元素携带数据应该为被拖动元素的ondragstart拖拽开始(开始拖动触发该事件)事件指定监听器,在监听器中让拖动操作可以携带数据。
之后为了让document接受放的动作,为documen的ondragover(拖拽结束)事件设定监听器,在监听器中取消document对拖动事件的默认行为。
然而,不同浏览器在元素拖到指定位置释放之后默认的动作是不同的(firefox释放后会跳转到新页面,chrome则没有任何动作),所以我们要取消拖放操作的默认动作,为document的ondrop绑定监听器
【简答通俗讲】就是:
H5允许对页面元素进行拖动,只要在元素的属性中加上draggable="true",就可以拖动了。
在拖动的同时,必须记录被拖动的元素,通过在元素上注册事件ondragstart即可实现,比如规定了一个img元素可以拖动,代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>元素拖拽</title> </head> <body> <img src="./01.jpg" draggble="true" id="picture" ondragstart="drag(event);"> <script> function drag(event) { event.dataTransfer.setData("Text",event.target.id); console.log(event.target.id) } </script> </body> </html>
在拖动img的时候,drag函数就会把img的id属性记录在事件中,记录值的类型是Text。
【下一步】是规定哪些元素可以放置被拖动的img,比如一个div可以放置这个被拖动的img, 需要在这个div上定义一个事件:ondragover(被拖动元素进入本元素的范围内拖动时不断触发)。在这个事件中,需要阻止对事件的默认处理方式,其实就是硬性的加上一句:event.preventDefault()
<style type="text/css"> .main{ width: 200px; height: 300px; border: 1px solid red; } </style> <div class="main" ondragover="allowDrop(event);"></div> function allowDrop(event) { alert("进入范围") event.preventDefault(); }
这里通过运用ondragover触发事件,我们只要将图片拖拽到框里,便会提示已经入范围框
【下一步】要在容纳这个img的div中把这个img放到里面,当放置的时候,会触发ondrop事件(其他元素被放到了本元素时触发)。
(1)通过event.dataTransfer.getData("Text")来得到上面event.dataTransfer.setData("Text",ev.target.id)的img的id
(2)通过event.target.appendChild(document.getElementById(data))来把img放到div中,注意这里event.target指的是div,不是上面的img了。至此,页面的拖动完成了
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>元素拖拽</title> <style type="text/css"> .main{ width: 300px; height: 300px; border: 1px solid red; position: absolute; top: 300px; left: 300px; } </style> </head> <body> <img src="./01.jpg" draggble="true" id="picture" ondragstart="drag(event);"> <div class="main" ondragover="allowDrop(event);" ondrop="drop(event)"></div> <script> function drag(event) { event.dataTransfer.setData("Text",event.target.id); console.log(event.target.id) } function allowDrop(event) { console.log("进入范围") event.preventDefault(); } function drop(event) { console.log("鼠标已松开") event.preventDefault(); var data=event.dataTransfer.getData("Text"); console.log(event.target) event.target.appendChild(document.getElementById(data)); } </script> </body> </html>
【W3实例讲解:】
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>拖放Demo</title> <style type="text/css"> #div1 { width: 198px; height: 66px; padding: 10px; border: 1px solid #aaaaaa; } </style> <script type="text/javascript"> function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { ev.dataTransfer.setData("Text", ev.target.id); } function drop(ev) { ev.preventDefault(); var data = ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); } </script> </head> <body> <p>请把 W3School 的图片拖放到矩形中:</p> <div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div> <br /> <img id="drag1" src="http://www.w3school.com.cn/i/eg_dragdrop_w3school.gif" draggable="true" ondragstart="drag(event)" /> </body> </html>下面研究一下拖放事件的所有不同部分
①把元素设置为可拖放
首先:为了把一个元素设置为可拖放,请把 draggable 属性设置为 true:
<img draggable="true">②拖放的内容 - ondragstart 和 setData()
然后,规定当元素被拖动时发生的事情。在上面的例子中,ondragstart 属性调用了一个 drag(event) 函数,规定拖动什么数据。
dataTransfer.setData() 方法设置被拖动数据的数据类型和值:
function drag(ev) { ev.dataTransfer.setData("text", ev.target.id); }
在本例中,数据类型是 "text",而值是这个可拖动元素的 id ("drag1")
③拖到何处 - ondragover
ondragover 事件规定被拖动的数据能够被放置到何处
默认地,数据/元素无法被放置到其他元素中。为了实现拖放,我们必须阻止元素的这种默认的处理方式。
这个任务由 ondragover 事件的 event.preventDefault() 方法完成:
event.preventDefault()④进行放置 - ondrop
当放开被拖数据时,会发生 drop 事件。
在上面的例子中,ondrop 属性调用了一个函数,drop(event):
function drop(ev) { ev.preventDefault(); var data = ev.dataTransfer.getData("text"); ev.target.appendChild(document.getElementById(data)); }
【代码解释:】
1. 调用 preventDefault() 来阻止数据的浏览器默认处理方式(drop 事件的默认行为是以链接形式打开)
2 .通过 dataTransfer.getData() 方法获得被拖的数据,将返回在 setData() 方法中设置为相同类型的任何数据
3 .被拖数据是被拖元素的 id ("drag1")
4 .把被拖元素追加到放置元素中
【更多实例】
来回拖放图片:在两个 <div> 元素之间来回拖放图像

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>拖放Demo</title> <style type="text/css"> #div1, #div2 { float: left; width: 198px; height: 66px; margin: 10px; padding: 10px; border: 1px solid #aaaaaa; } </style> <script type="text/javascript"> function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { ev.dataTransfer.setData("Text", ev.target.id); } function drop(ev) { ev.preventDefault(); var data = ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); } </script> </head> <body> <div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"> <img src="http://www.w3school.com.cn/i/eg_dragdrop_w3school.gif" draggable="true" ondragstart="drag(event)" id="drag1"/> </div> <div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div> </body> </html>
这里我再列个W3的例子:
<!DOCTYPE html> <html class="no-js"> <head> <meta charset="utf-8"> <title>HTML5-draggable(拖放)</title> <style type="text/css"> #div1, #div2 {float:left; width:100px; height:35px; margin:10px;padding:10px;border:1px solid #aaaaaa;} </style> <script src="js/modernizr.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> /* * 虽然已经设定了img元素可被拖动,但是浏览器默认地, 无法将数据/元素放置到其他元素中。 * 如果有需要设置某些元素可接受被拖动元素,则要阻止它的默认行为, * 这要通过设置该接收元素的ondragover 事件,调用event.preventDefault() 方法 */ function allowDrop(ev) { ev.preventDefault(); //阻止默认行为 //ev.target.id //此处ev.target是接收元素,通过事件被绑定在哪个元素即可区分 } /* * 当该img元素被拖动时,会触发一个ondragstart 事件, 该事件调用了一个方法drag(event)。 */ function drag(ev) { //ev.dataTransfer.setData() 方法设置被拖数据的数据类型(Text)和 //值(被拖元素id), //该方法将被拖动元素的id存储到事件的dataTransfer对象内, //ev.dataTransfer.getData()可将该元素取出。 //此处ev.target是被拖动元素 ev.dataTransfer.setData("Text", ev.target.id); } /* * 当被拖元素移动到接收元素, * 松开鼠标时(即被拖元素放置在接收元素内时)会出发ondrop事件 */ function drop(ev) { ev.preventDefault(); //阻止默认行为 var data = ev.dataTransfer.getData("Text"); //将被拖动元素id取出 ev.target.appendChild(document.getElementById(data)); //将被拖动元素添加到接收元素尾部 } </script> </head> <body> <div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"> <!--为了使元素可拖动,把 draggable 属性设置为 true--> <img src="http://www.w3school.com.cn/i/w3school_logo_black.gif" draggable="true" ondragstart="drag(event)" id="drag1" /> </div> <div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div> </body> </html>
接下来举个简单随意拖放例子:
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html" charset="utf-8"/> <title>可拖动</title> <style type="text/css"> #source{ border: 1px solid #000000; background-color: #ccc; width: 80px; height: 80px; } </style> </head> <body> <div id="source"> HELLO WORLD。 </div> <script type="text/javascript"> var source = document.getElementById("source"); source.ondragstart = function(evt){//ondragstart:开始拖动时触发 //让拖动携带数据 console.log(evt) evt.dataTransfer.setData("text/plain","www.fkjava.org"); } document.ondragover = function(evt){ //ondragover:被拖动元素进入本元素的范围内拖动时不断触发 //取消事件的默认行为 return false; } document.ondrop = function(evt){//ondrop:其他元素被放到了本元素时触发 source.style.position = "absolute"; source.style.left = evt.pageX + "px"; source.style.top = evt.pageY + "px"; //取消事件的默认行为 return false; } </script> </body> </html>
附:触发事件
ondragstart:开始拖动时触发
ondrag:拖动过程中不断触发
ondragend:拖动结束时触发
ondragenter:被拖动元素进入本元素的范围内时触发
ondragover:被拖动元素进入本元素的范围内拖动时不断触发
ondragleave:被拖动元素离开本元素时触发
ondrop:其他元素被放到了本元素时触发
【再来说下DataTransfer对象】
拖放触发的拖放事件有一个dataTransfer的属性,该属性值是一个DataTransfer对象(可以去chrome浏览器
控制台打印验证,这里我已经打印出来,打开控制台找打即可)
dataTransfer对象:提供了对于预定义的剪贴板格式的访问,以便在拖曳操作中使用。
通俗的讲就是在拖曳操作的过程中,我们可以用过dataTransfer对象来传输数据,以便在拖曳操作结束的时候对数据进行其他的操作。
【对象属性】
(1)dropEffect:设置或返回拖放目标上允许发生的拖放行为。如果此处设置的拖放行为不再effectAllowed属性设置的多种拖放行为之内,拖放操作将会失败。该属性值只允许为“null”、“copy”、“link”和“move”四值之一。
(2)effectAllowed:设置或返回被拖动元素允许发生的拖动行为。该属性值可设为“none”、“copy”、“copyLink”、“copyMove”、“link”、“linkMove”、“move”、“all”和“uninitialized”。
(3)items:该属性返回DataTransferItems对象,该对象代表了拖动数据。
(4)types:该属性返回一个DOMStringList对象,该对象包括了存入dataTransfer中数据的所有类型。
【对象方法】
(1)setData(format,data):将指定格式的数据赋值给dataTransfer对象,参数format定义数据的格式也就是数据的类型,data为待赋值的数据
(2)getData(format):从dataTransfer对象中获取指定格式的数据,format代表数据格式,data为数据。
(3)clearData([format]):从dataTransfer对象中删除指定格式的数据,参数可选,若不给出,则为删除对象中所有的数据。
(4)addElement(element):添加自定义图标
(5)setDragImage(element,x,y):设置拖放操作的自定义图标。其中element设置自定义图标,x设置图标与鼠标在水平方向上的距离,y设置图标与鼠标在垂直方向上的距离。
下面展示一个允许通过拖动来添加,删除”收藏夹“功能
(2)原生JS实现
一、拖拽的流程动作
①鼠标按下
②鼠标移动
③鼠标松开
二、拖拽流程中对应的JS事件
①鼠标按下会触发onmousedown事件
obj.onmousedown = function(e) { //.......... }
②鼠标移动会触发onmousemove事件
obj.onmousemove = function(e) { //...... }
③鼠标松开会触发onmouseup事件
obj.onmouseup = function() { //...... }
三、实现的原理讲解
拖拽其实是通过获取鼠标移动的距离来实现的,即计算移动前的位置的坐标(x,y)与移动中的位置的坐标(x,y)差值。
当鼠标按下或鼠标移动时,都可以获取到当前鼠标的位置,即移动前的位置与移动中的位置。
那么上面①与②的代码就应该变成这样
var mouseDownX,mouseDownY // 因在移动中需计算鼠标的偏移需要用到鼠标按下时的坐标,固声明称全局变量 obj.onmousedown = function(e) { mouseDownX = e.pageX; mouseDownY = e.pageY; } obj.onmousemove = function(e) { var mouseMoveX = e.pageX,mouseMoveY = e.pageY; }
移动前与移动后坐标有了,那么计算偏移,先看下图
很明显移动后元素
X坐标为 鼠标移动后的X坐标 - 鼠标按下的X坐标 + 元素的初始X坐标
Y坐标为 鼠标移动后的Y坐标 - 鼠标按下的Y坐标 + 元素的初始Y坐标
把新的 X,Y 替换元素的 X,Y 就搞定了
那么代码就应该更换为:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>元素拖拽</title> <style type="text/css"> #link{ position: absolute; } </style> </head> <body> <p id='link'>我是可以拖拽的</p> <script type="javascript"> var obj = document.getElementById('link'); var mouseDownX,mouseDownY,initX,initY,flag = false; // 因在移动中需计算鼠标的偏移需要用到鼠标按下时的坐标,固声明称全局变量 obj.onmousedown = function(e) { // e为鼠标事件对象,属性pageX为鼠标X坐标,pageY为鼠标Y坐标 //鼠标按下时所在的X,Y坐标 mouseDownX = e.pageX; mouseDownY = e.pageY; //初始位置的X,Y坐标 initX = obj.offsetLeft; initY = obj.offsetTop; //鼠标被按下 flag = true; } obj.onmousemove = function(e) { if(flag){//确认鼠标已按下 var mouseMoveX = e.pageX,mouseMoveY = e.pageY; this.style.left = parseInt(mouseMoveX) - parseInt(mouseDownX) + parseInt(initX) + "px"; this.style.top = parseInt(mouseMoveY) - parseInt(mouseDownY) + parseInt(initY) + "px"; }else{//未按下鼠标} } obj.onmouseup = function() { //标识已松开鼠标 flag = false; } </script> </body> </html>
经测试,拖动速度过快时会出现明显卡顿,这个之后再讨论性能优化
需要注意的事:
①如果用jquery库来写的话三个事件为mousedown、mousemove、mouseup,名称稍微有点差别。
②还有一点,被拖拽的元素的样式要设置成绝对或相对位置才有效果。
至此,最简单的元素拖拽功能就讲完了~~~~
如有不正确之处欢迎大家指正!
后续补充下,这里我们讨论下代码的优化:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>元素拖拽</title> <style type="text/css"> #xixi { width:200px; height: 200px; position:absolute; left: 50px; top: 50px; background-color: lightcyan; } #haha { position:absolute; left:300px; top:300px; background-color: yellow; width:200px; height: 200px; } </style> <script type="text/javascript" src="js/mylib.js"></script> <script type="text/javascript"> window.onload = function() { var obj1 = createDraggableObject(); var obj2 = createDraggableObject(); obj1.init($('xixi')); obj2.init($('haha')); }; </script> </head> <body> <div id="xixi">xixi!</div> <div id="haha">haha!</div> </body> </html>
外部JavaScript文件代码如下所示:
/** * 根据id获取页面元素 * @param id * @returns {HTMLElement} */ function $(id) { return document.getElementById(id); } /** * 创建可拖拽对象的工厂方法 */ function createDraggableObject() { return { obj: null, left: 0, top: 0, oldX: 0, oldY: 0, isMouseLeftButtonDown: false, init: function (obj) { this.obj = obj; var that = this; this.obj.onmousedown = function (args) { var evt = args || event; this.style.zIndex = 100; that.isMouseLeftButtonDown = true; that.oldX = evt.clientX; that.oldY = evt.clientY; if (this.currentStyle) { that.left = parseInt(this.currentStyle.left); that.top = parseInt(this.currentStyle.top); } else { var divStyle = document.defaultView.getComputedStyle(this, null); that.left = parseInt(divStyle.left); that.top = parseInt(divStyle.top); } }; this.obj.onmousemove = function (args) { that.move(args || event); }; this.obj.onmouseup = function () { that.isMouseLeftButtonDown = false; this.style.zIndex = 0; }; }, move: function (evt) { if (this.isMouseLeftButtonDown) { var dx = parseInt(evt.clientX - this.oldX); var dy = parseInt(evt.clientY - this.oldY); this.obj.style.left = (this.left + dx) + 'px'; this.obj.style.top = (this.top + dy) + 'px'; } } }; }
最后展示一个实际应用:通过H5的draggable的APL实现----删除和收藏夹功能
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <title>通过拖放实现添加、删除</title> <style type="text/css"> div>div{ display:inline-block; padding: 10px; background-color: #aaa; margin: 3px; } </style> </head> <body> <div style="width:600px;border:1px solid black;"> <h2>可将喜欢的项目拖到收藏夹</h2> <div draggable="true" ondragstart="dsHandler(event);">勿忘心安</div> <div draggable="true" ondragstart="dsHandler(event);">照顾自己</div> <div draggable="true" ondragstart="dsHandler(event);">Number 9</div> <div draggable="true" ondragstart="dsHandler(event);">崇拜</div> </div> <div id="dest" style="width:400px;height:400px;border:1px solid black;float:left;"> <h2 ondragleave="return false;">收藏夹</h2> </div> <div id="gb" draggable="false" style="width:100px;height:100px; border:1px solid red;float:left;">我是垃圾桶</div> <script type="text/javascript"> var dest = document.getElementById("dest"); var dsHandler = function (evt){ evt.dataTransfer.setData("text/plain","<item>"+evt.target.innerHTML); } dest.ondrop = function(evt){ var text = evt.dataTransfer.getData("text/plain"); if(text.indexOf("<item>") == 0){ var newEle = document.createElement("div"); newEle.id = new Date().getUTCMilliseconds(); newEle.innerHTML = text.substring(6); newEle.draggable = "true"; newEle.ondragstart = function(evt){ evt.dataTransfer.setData("text/plain","<remove>"+newEle.id); } dest.appendChild(newEle); } } document.getElementById("gb").ondrop = function(evt){ var id = evt.dataTransfer.getData("text/plain"); if(id.indexOf("<remove>") == 0){ var target = document.getElementById(id.substring(8)); dest.removeChild(target); } } document.ondragover = function(evt){ return false; } document.ondrop = function(evt){ return false; } </script> </body> </html>
.
相关推荐
TinyYolo2实时视频流物体检测ONNX模型 运行 ONNX 模型,并结合 OpenCV 进行图像处理。具体流程包括: 1. 加载并初始化 ONNX 模型。 2. 从摄像头捕获实时视频流。 3. 对每一帧图像进行模型推理,生成物体检测结果。 4. 在界面上绘制检测结果的边界框和标签。
chromedriver-linux64-134.0.6998.23(Beta).zip
Web开发:ABP框架4-DDD四层架构的详解
chromedriver-linux64-135.0.7029.0(Canary).zip
实现人脸识别的考勤门禁系统可以分为以下步骤: 1. 采集人脸图像数据集:首先需要采集员工的人脸图像数据集,包括正面、侧面等多个角度的图像。可以使用MATLAB中的图像采集工具或者第三方库进行采集。 2. 预处理人脸图像数据:对采集到的人脸图像数据进行预处理,包括人脸检测、人脸对齐、人脸裁剪等操作。MATLAB提供了相关的图像处理工具箱,可以用于实现这些处理步骤。 3. 特征提取与特征匹配:使用人脸识别算法提取人脸图像的特征,比如使用人脸识别中常用的特征提取算法如Eigenfaces、Fisherfaces或者基于深度学习的算法。然后将员工的人脸数据与数据库中的人脸数据进行匹配,判断是否为注册员工。 4. 考勤记录与门禁控制:如果人脸匹配成功,系统可以记录员工的考勤时间,并且控制门禁系统进行开启。MATLAB可以与外部设备进行通信,实现门禁控制以及考勤记录功能。
yugy
企业IT治理体系规划.pptx
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
基于多目标粒子群算法的冷热电联供综合能源系统优化调度与运行策略分析,基于多目标粒子群算法的冷热电联供综合能源系统优化调度与运行策略分析,MATLAB代码:基于多目标粒子群算法冷热电联供综合能源系统运行优化 关键词:综合能源 冷热电三联供 粒子群算法 多目标优化 参考文档:《基于多目标算法的冷热电联供型综合能源系统运行优化》 仿真平台:MATLAB 平台采用粒子群实现求解 优势:代码注释详实,适合参考学习,非目前烂大街的版本,程序非常精品,请仔细辨识 主要内容:代码构建了含冷、热、电负荷的冷热电联供型综合能源系统优化调度模型,考虑了燃气轮机、电制冷机、锅炉以及风光机组等资源,并且考虑与上级电网的购电交易,综合考虑了用户购电购热冷量的成本、CCHP收益以及成本等各种因素,从而实现CCHP系统的经济运行,求解采用的是MOPSO算法(多目标粒子群算法),求解效果极佳,具体可以看图 ,核心关键词: 综合能源系统; 冷热电三联供; 粒子群算法; 多目标优化; MOPSO算法; 优化调度模型; 燃气轮机; 电制冷机; 锅炉; 风光机组; 上级电网购售电交易。,基于多目标粒子群算法的CCHP综合
DSP28379D串口升级方案:单核双核升级与Boot优化,C#上位机开发串口通信方案,DSP28379D串口升级方案:单核双核升级与Boot优化,C#上位机开发实现串口通信,DSP28379D串口升级方案 单核双核升级,boot升级,串口方案。 上位机用c#开发。 ,DSP28379D; 串口升级方案; 单核双核升级; boot升级; 上位机C#开发,DSP28379D串口双核升级方案:Boot串口升级技术使用C#上位机开发
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
基于PLC的双层自动门控制:光电传感触发,有序开关与延时功能实现,附程序、画面及参考文档。,基于PLC的双层自动门控制系统:精准控制,保障无尘环境;门间联动,智能安防新体验。,基于plc的双层自动门控制系统,全部采用博途仿真完成,提供程序,画面,参考文档,详情见图。 实现功能(详见上方演示视频): ① 某房间要求尽可能地保持无尘,在通道上设置了两道电动门,门1和门2,可通过光电传感器自动完成门的打开和关闭。 门1和门2 不能同时打开。 ② 第 1 道门(根据出入方向不同,可能是门 1 或门 2),是由在通道外的开门者通过按开门按钮打开的,而第 2 道门(根据出入方向不同,可能是门 1 或门 2 )则是在打开的第 1 道门关闭后自动地打开的(也可以由通道内的人按开门按钮来打开第2 道门)。 这两道门都是在门开后,经过 3s 的延时而自动关闭的。 ③ 在门关闭期间,如果对应的光电传感器的信号被遮断,则门立即自动打开。 如果在门外或者在门内的开门者按对应的开门按钮时,立即打开。 ④ 出于安全方面的考虑,如果在通道内的某个人经过光电传感器时,对应的门已经打开,则通道外的开门者可以不按开门按钮。
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
DeepSeek+DeepResearch——让科研像聊天一样简单 (1)DeepSeek如何做数据分析? (2)DeepSeek如何分析文件内容? (3)DeepSeek如何进行数据挖掘? (4)DeepSeek如何进行科学研究? (5)DeepSeek如何写综述? (6)DeepSeek如何进行数据可视化? (7)DeepSeek如何写作润色? (8)DeepSeek如何中英文互译? (9)DeepSeek如何做降重? (10)DeepSeek论文参考文献指令 (11)DeepSeek基础知识。
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
1、文件内容:jdepend-demo-2.9.1-10.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/jdepend-demo-2.9.1-10.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
内容概要:本文档详细介绍了如何利用 MATLAB 实现鲸鱼优化算法 (WOA) 和长短期记忆网络 (LSTM) 相结合的技术——WOA-LSTM,在数据分类和预测领域的应用。文章首先概述了LSTM在网络训练中超参数依赖的问题以及WOA作为一种新颖的全局优化算法的优势。接着阐述了该项目的研究背景、目的及其重要意义,并深入讨论了项目面临的六大主要挑战,从模型优化到超参数空间管理。文档特别强调WOA-LSTM融合所带来的性能提升、降低计算复杂度的能力及其实现自动化的超参数优化流程。除此之外,文中展示了模型的应用广泛性,覆盖了从金融市场的股票预测到智能制造业的各种实际场景,并提供了具体的模型架构细节和代码实例,以帮助理解模型的工作原理和技术要点。 适合人群:具有一定编程技能的研究人员、工程师和科学家们,尤其是对深度学习技术和机器学习感兴趣的专业人士。 使用场景及目标:该文档的目标是向用户传授使用MATLAB实现WOA-LSTM进行复杂数据分类和预测的方法论,旨在指导读者理解和掌握如何利用WOA进行超参数寻优,从而改善LSTM网络性能。 其他说明:通过阅读这份文档,使用者不仅能够获得有关WOA-LSTM技术的具体实现方式的知识,而且还可以获取关于项目规划和实际部署过程中的宝贵经验。
tomcat安装及配置教程.md
**MATLAB下微电网两阶段鲁棒优化经济调度策略:基于CCG算法与min-max-min结构求解**,MATLAB微电网两阶段鲁棒优化经济调度程序:构建min-max-min结构模型,实现恶劣场景下的低成本调度,灵活调整调度保守性,利用列约束生成算法求解,MATLAB代码:微电网两阶段鲁棒优化经济调度程序 关键词:微网优化调度 两阶段鲁棒 CCG算法 经济调度 参考文档:《微电网两阶段鲁棒优化经济调度方法》 仿真平台:MATLAB YALMIP+CPLEX 优势:代码注释详实,出图效果非常好(具体看图),非目前烂大街版本,请仔细辨识 主要内容:构建了微网两阶段鲁棒调度模型,建立了min-max-min 结构的两阶段鲁棒优化模型,可得到最恶劣场景下运行成本最低的调度方案。 模型中考虑了储能、需求侧负荷及可控分布式电源等的运行约束和协调控制,并引入了不确定性调节参数,可灵活调整调度方案的保守性。 基于列约束生成算法和强对偶理论,可将原问题分解为具有混合整数线性特征的主问题和子问题进行交替求解,从而得到原问题的最优解。 最终通过仿真分析验证了所建模型和求解算法的有效性,具体内容可自行查