纯JS控制DIV选择范围移动与复制 改进版

JS实现一键复制、选中复制、选中多行复制 阅读详情

     和上一个版本相比,增加了快捷键操作,增加了批量删除功能,改变了操作方式。

<html>
<head>
    
<title>纯JS控制DIV选择范围移动与复制 改进版</title>
    
<style type="text/css">
    .newbtn
{margin-right:10px;border:solid 1px green;cursor:pointer;padding:2px;background:#efd;}
    body,table
    
{
        font-size
: 12px;
    
}

    
/*DIV未被选择时样式*/
    div.noSelected
    
{
        text-align
: center; 
        position
: absolute; 
        background-color
: #f5f5f5;
        border
: #000000 1px solid; 
    
}

    
    
/*DIV已被选择时样式*/
    div.isSelected
    
{
        text-align
: center; 
        position
: absolute; 
        background-color
: #f5f5f5;
        border
: #996600 3px solid; 
    
}


    
/*选择虚线框样式*/
    div#selectArea
    
{
        position
: absolute;
        border
: #FF6600 1px dashed;
    
}

    
</style>
</head>
<body>
    
<div style="margin:10px;">
        
<span class="newbtn" onclick="AllSelect()">全选(Ctrl+A)</span>
        
<span class="newbtn" onclick="ReverseSelect()">反选(Ctrl+X)</span>
        
<span class="newbtn" onclick="deleteNodes()">删除选中(Delete)</span>
        
<span class="newbtn" onclick="CancelSelect()">取消选择(Ctrl+Z)</span>
        
<input id="move" type="radio" name="moveOrCopy" checked="checked" /><label for="move">移动(-)</label>
        
<input id="copy" type="radio" name="moveOrCopy" /><label for="copy">复制(+)</label>
    
</div>
    
<div id="WorkFlowSpan"></div>
    
<script type="text/javascript" language="javascript">
//范围选择
var saveDiv = new Array();
var areaDiv = new Array();
var cloneNodes;
var oLeft, oTop;
var panel = $("WorkFlowSpan");
var groupName = "GroupItem";
var eventStatus = "nothing";        //"nothing"未选择状态,"selected"选择完毕状态,"selecting"范围选择中状态,"move"移动状态
var selectArea;
var oX,oY;                          //鼠标按下位置
var moveSize = 30;                  //单位移动的大小(动画的速度),越大越快
var copyNo = 0;

//通过名称删除数组元素
Array.prototype.remove = function()
{
    
var removeIndex = -1;
    
if (arguments.length == 1)
    
{
        
//存储预删除的所在位置
        for (var i = 0; i < this.length; i++)
        
{
            
if (this[i] == arguments[0])
            
{
                removeIndex 
= i;
                
break;
            }

        }

        
//删除
        if (removeIndex >= 0)
        
{
            
for(var i = removeIndex; i < this.length; i++)
            
{
                
this[i] = this[i + 1];
            }

            
this.length -= 1;
        }

    }

}


//进栈(只进栈非重复的)
Array.prototype.insert = function()
{
    
var removeIndex = -1;
    
if (arguments.length == 1)
    
{
        
//存储预重复的所在位置
        for (var i = 0; i < this.length; i++)
        
{
            
if (this[i] == arguments[0])
            
{
                removeIndex 
= i;
                
break;
            }

        }

        
//进栈
        if (removeIndex == -1)
        
{
            
this[this.length] = arguments[0];
        }

    }

}


function $(controlId)
{
    
return document.getElementById(controlId);
}


//创建DIV
function createDiv(divID, divLeft, divTop)
{
    
var div = document.createElement("div");
    div.id 
= divID;
    div.group 
= "GroupItem";            //所在组
    div.isSelected = false;            //是否是被选中状态
    div.className = "noSelected";
    div.style.cursor 
= "default";
    div.style.width 
= "250px";
    div.style.height 
= "50px";
    div.style.left 
= divLeft;
    div.style.top 
= divTop;
    div.innerHTML 
= "<table style="width: 100%; height: 100%; text-align: center; vertical-align: middle"><tr><td>coding by pippe<br /><a href='mailto:pippe@163.com'>pippe@163.com</a></td></tr>";
    panel.appendChild(div);
}


//创建三个DIV
createDiv("oldDiv1", "100px", "400px");
createDiv(
"oldDiv2", "400px", "400px");
createDiv(
"oldDiv3", "700px", "400px");

//设置空间选择的样式
function SelectStyle(objControl, isSelected)
{
    objControl.className 
= isSelected ? "isSelected" : "noSelected";
    objControl.isSelected 
= isSelected;
}


//选择范围开始
function AreaCreate()
{
    
if (event.button == 1 && (eventStatus == "nothing" || event.ctrlKey))
    
{
        oX 
= event.x;
        oY 
= event.y;
        
//通过鼠标位置取对象
        var element = document.elementFromPoint(oX, oY);
        
while (element.tagName != "undefined" && element.tagName.toUpperCase() != "BODY")
        
{
            
//可移动或复制的组里面
            if (element.group == groupName)
            
{
                
if (event.ctrlKey)
                
{
                    
//按住CTRL添加或减少选择
                    if (element.isSelected)
                    
{
                        saveDiv.remove(element.id);
                        SelectStyle(element, 
false);
                        eventStatus 
= saveDiv.length == 0 ? "nothing" : "selected";
                    }

                    
else
                    
{
                        saveDiv.insert(element.id);
                        SelectStyle(element, 
true);
                        eventStatus 
= "selected";
                    }

                }

                
else
                
{
                    
//未按住CTRL
                    saveDiv.insert(element.id);
                    SelectStyle(element, 
true);
                    eventStatus 
= "selected";
                    MouseDown();
                }

                
return;
            }

            element 
= element.parentNode;
        }

        
        
//范围选择
        selectArea = document.createElement("div");
        selectArea.id 
= "selectArea";
        selectArea.style.left 
= oX + "px";
        selectArea.style.top 
= oY + "px";
        selectArea.setCapture();
        panel.appendChild(selectArea);
        eventStatus 
= "selecting";
        
return;
    }

}


function AreaSelecting()
{
    
//范围选择中
    if (event.button == 1 && eventStatus == "selecting")
    
{
        
var nX = event.x;
        
var nY = event.y;
        selectArea.style.left 
= nX <= oX ? nX + "px" : oX + "px";
        selectArea.style.top 
= nY <= oY ? nY + "px" : oY + "px";
        selectArea.style.width 
= nX >= oX ? nX - oX : oX - nX;
        selectArea.style.height 
= nY >= oY ? nY - oY : oY - nY;
        
        
var elements = document.all;
        
var len = elements.length;
        
var thisLeft, thisTop, thisRight, thirBottom;
        
var x1,y1,x2,y2;
        x2 
= nX <= oX ? oX : nX;
        x1 
= nX <= oX ? nX : oX;
        y2 
= nY <= oY ? oY : nY;
        y1 
= nY <= oY ? nY : oY;
        
for (var i = 0; i < len; i++)
        
{
            
if (elements[i].group != groupName)
            
{
                
continue;
            }

            thisLeft 
= parseInt(elements[i].style.left);
            thisRight 
= thisLeft + parseInt(elements[i].childNodes[0].offsetWidth);
            thisTop 
= parseInt(elements[i].style.top);
            thisBottom 
= thisTop + parseInt(elements[i].childNodes[0].offsetHeight);
            
//判断是否在选择框范围内
            if ((((thisLeft > x1 && thisLeft < x2) || (thisRight > x1 && thisRight < x2)) && ((thisTop > y1 && thisTop < y2) || (thisBottom > y1 && thisBottom < y2)))
                
|| (((x1 > thisLeft && x1 < thisRight) || (x2 > thisLeft && x2 < thisRight)) && ((y1 > thisTop && y1 < thisBottom) || (y2 > thisTop && y2 < thisBottom))))
            
{
                
if (!elements[i].isSelected)
                
{
                    areaDiv.insert(elements[i].id);
                    SelectStyle(elements[i], 
true);
                }

            }

            
else if (elements[i].isSelected)
            
{
                
//不在选择框范围内
                var isTrue = false;
                
for (var j = 0; j < saveDiv.length; j++)
                
{
                    
if (elements[i].isSelected && elements[i].id == saveDiv[j])
                    
{
                        isTrue 
= true;
                        
break;
                    }

                }

                
if (!isTrue)
                
{
                    areaDiv.remove(elements[i].id);
                    SelectStyle(elements[i], 
false);
                }

            }

        }

    }

}


//范围选择结束
function AreaSelected()
{
    
if (eventStatus == "selecting")
    
{
        selectArea.parentNode.removeChild(selectArea);
        selectArea 
= null;
        
//将选择框内的数组存到移动/复制的数组里面
        for (var i = 0; i < areaDiv.length; i++)
        
{
            saveDiv.insert(areaDiv[i]);
        }

        areaDiv.length 
= 0;
        eventStatus 
= saveDiv.length == 0 ? "nothing" : "selected";
    }

}


//鼠标按下移动开始
function MouseDown()
{
    
if (event.button == 1 && !event.ctrlKey && eventStatus == "selected")
    
{
        oX 
= event.x;
        oY 
= event.y;
        cloneNodes 
= new Array();
        oLeft 
= new Array();
        oTop 
= new Array();
        
for (var i = 0; i < saveDiv.length; i++)
        
{
            cloneNodes[i] 
= $(saveDiv[i]).cloneNode(true);
            $(saveDiv[i]).parentNode.appendChild(cloneNodes[i]);
            cloneNodes[i].childNodes[
0].style.filter = "alpha(opacity=50)";
            cloneNodes[i].childNodes[
0].src = cloneNodes[i].childNodes[0].img2;
            oLeft[i] 
= parseInt(cloneNodes[i].style.left);
            oTop[i] 
= parseInt(cloneNodes[i].style.top);
            cloneNodes[i].childNodes[
0].setCapture();
        }

        document.body.style.cursor 
= "move";
        eventStatus 
= "move";
    }

}


//鼠标移动
function MouseMove()
{
    
if (event.button == 1 && eventStatus == "move")
    
{
        
var nX = event.x;
        
var nY = event.y;
        
//移动中
        var len = cloneNodes.length;
        
for (var i = 0; i < len; i++)
        
{
            cloneNodes[i].style.left 
= (oLeft[i] + nX - oX) + "px";
            cloneNodes[i].style.top 
= (oTop[i] + nY - oY) + "px";
        }

    }

}


//鼠标弹起移动结束
function MouseUp()
{
    
if (eventStatus == "move")
    
{
        eventStatus 
= "moving";
        
var aimLeft, aimTop;
        
var xmlStr = "<nodes>";
        
for (var i = cloneNodes.length - 1; i >= 0 ; i--)
        
{
            cloneNodes[i].childNodes[
0].releaseCapture();
            aimLeft 
= parseInt(cloneNodes[i].style.left);
            aimTop 
= parseInt(cloneNodes[i].style.top);
            
if ($("move").checked)
            
{
                
//移动操作
                MoveNodes(i, aimLeft, aimTop);
            }

            
else
            
{
                
//复制操作
                aimLeft = parseInt(cloneNodes[i].style.left);
                aimTop 
= parseInt(cloneNodes[i].style.top);
                cloneNodes[i].style.left 
= $(saveDiv[i]).style.left;
                cloneNodes[i].style.top 
= $(saveDiv[i]).style.top;
                CopyNodes(i, aimLeft, aimTop);
            }

        }

        document.body.style.cursor 
= "default";
    }

}


//移动位置
function MoveNodes(saveIndex, aimLeft, aimTop)
{
    
var nowLeft = parseInt($(saveDiv[saveIndex]).style.left);
    
var nowTop = parseInt($(saveDiv[saveIndex]).style.top);
    
if (nowLeft > aimLeft + moveSize || nowLeft < aimLeft - moveSize || nowTop > aimTop + moveSize || nowTop < aimTop - moveSize)
    
{
        $(saveDiv[saveIndex]).style.left 
= aimLeft > nowLeft + moveSize ? (nowLeft + moveSize) + "px" : aimLeft < nowLeft - moveSize ? (nowLeft - moveSize) + "px" : nowLeft + "px";
        $(saveDiv[saveIndex]).style.top 
= aimTop > nowTop + moveSize ? (nowTop + moveSize) + "px" : aimTop < nowTop - moveSize ? (nowTop - moveSize) + "px" : nowTop + "px";
        setTimeout(
"MoveNodes(" + saveIndex + ", " + aimLeft + ", " + aimTop + ")", 1);
    }

    
else
    
{
        $(saveDiv[saveIndex]).style.left 
= aimLeft;
        $(saveDiv[saveIndex]).style.top 
= aimTop;
        cloneNodes[saveIndex].parentNode.removeChild(cloneNodes[saveIndex]);
        cloneNodes.remove(cloneNodes[saveIndex]);
        
if (cloneNodes.length == 0)
        
{
            eventStatus 
= "selected";
        }

    }

}


//复制
function CopyNodes(saveIndex, aimLeft, aimTop)
{
    
var nowLeft = parseInt(cloneNodes[saveIndex].style.left);
    
var nowTop = parseInt(cloneNodes[saveIndex].style.top);
    
if (nowLeft > aimLeft + moveSize || nowLeft < aimLeft - moveSize || nowTop > aimTop + moveSize || nowTop < aimTop - moveSize)
    
{
        cloneNodes[saveIndex].style.left 
= aimLeft > nowLeft + moveSize ? (nowLeft + moveSize) + "px" : aimLeft < nowLeft - moveSize ? (nowLeft - moveSize) + "px" : nowLeft + "px";
        cloneNodes[saveIndex].style.top 
= aimTop > nowTop + moveSize ? (nowTop + moveSize) + "px" : aimTop < nowTop - moveSize ? (nowTop - moveSize) + "px" : nowTop + "px";
        setTimeout(
"CopyNodes(" + saveIndex + ", " + aimLeft + ", " + aimTop + ")", 1);
    }

    
else
    
{
        cloneNodes[saveIndex].style.left 
= aimLeft;
        cloneNodes[saveIndex].style.top 
= aimTop;
        cloneNodes[saveIndex].id 
= "copyDiv" + (++copyNo);
        cloneNodes[saveIndex].isSelected 
= false;
        cloneNodes[saveIndex].childNodes[
0].style.filter = null;
        SelectStyle(cloneNodes[saveIndex], 
false);
        cloneNodes.remove(cloneNodes[saveIndex]);
        
if (cloneNodes.length == 0)
        
{
            eventStatus 
= "selected";
        }

    }

}


//取消选择
function CancelSelect()
{
    
for (var saveIndex = 0; saveIndex < saveDiv.length; saveIndex++)
    
{
        SelectStyle($(saveDiv[saveIndex]), 
false);
    }

    saveDiv.length 
= 0;
    eventStatus 
= "nothing";
}


//全选
function AllSelect()
{
    
var elements = document.all;
    
var len = elements.length;
    saveDiv.length 
= 0;
    
for(var i = 0; i < len; i++)
    
{
        
if (elements[i].group == groupName)
        
{
            saveDiv.insert(elements[i].id);
            SelectStyle(elements[i], 
true);
        }

    }

    eventStatus 
= "selected";
}


//反选
function ReverseSelect()
{
    
var elements = document.all;
    
var len = elements.length;
    
var tempDiv = new Array();
    
for(var i = 0; i < saveDiv.length; i++)
    
{
        tempDiv.insert(saveDiv[i]);
    }

    
var isExist = false;
    CancelSelect();
    
for (var i = 0; i < len; i++)
    
{
        
if (elements[i].group == groupName)
        
{
            
for(var j = 0; j < tempDiv.length; j++)
            
{
                
if (elements[i].id == tempDiv[j])
                
{
                    isExist 
= true;
                    
break;
                }

            }

            
if (isExist)
            
{
                isExist 
= false;
                
continue;
            }

            saveDiv.insert(elements[i].id);
            SelectStyle(elements[i], 
true);
        }

    }

}


//删除选中
function deleteNodes()
{
    
var saveLen = saveDiv.length;
    
for (var saveIndex = saveLen - 1; saveIndex >= 0; saveIndex--)
    
{
        $(saveDiv[saveIndex]).parentNode.removeChild($(saveDiv[saveIndex]));
    }

    saveDiv.length 
= 0;
    eventStatus 
= "nothing";
}


document.body.onselectstart 
= function() {return false};
document.body.onmousedown 
= AreaCreate;
document.body.onmousemove 
= AreaSelecting;
document.body.onmouseup 
= AreaSelected;
panel.onmousedown 
= MouseDown;
panel.onmousemove 
= MouseMove;
panel.onmouseup 
= MouseUp;

//快捷键
document.onkeydown = function()
{
    event.ctrlKey 
&& event.keyCode == 65 ? AllSelect() : null;          //CTRL+A全选
    event.ctrlKey && event.keyCode == 88 ? ReverseSelect() : null;      //CTRL+X反选
    event.ctrlKey && event.keyCode == 90 ? CancelSelect() : null;       //CTRL+Z取消选择
    event.keyCode == 189 ? $("move").checked = true : null;     //- 选中移动
    event.keyCode == 187 ? $("copy").checked = true : null;     //+ 选中复制
    event.keyCode == 46 || event.keyCode == 110 ? deleteNodes() : null; //Delete或者Del删除选中节点
}

</script>    
</body>
</html>
 

操作说明:

  1. 未选择状态下,单击DIV上可选中此DIV。

  2. 未选择状态下,单击在背景上按住左键拖动产生范围虚线框,在此范围虚线框内的DIV边框变粗变色为被选中,虚线框外的则不被选中。

  3. 已选择状态下,按住Ctrl可再次选择,按住Ctrl的同时,单击在DIV上,如果DIV已被选中则取消本节点选择,反之选中此节点。

  4. 已选择状态下,按住Ctrl的同时,如果单击在背景上按住左键拖动产生范围虚线框,在此范围虚线框内的DIV边框变粗变色为被选中,虚线框外的如果为上次已选中的则不仍然选中,否则不选中。

  5. 释放后虚线消失,需要添加选择可重复第“3”,“4”步操作,多次选择的节点选中。

  6. 快捷键选择,Ctrl +A全选,Ctrl +X反选,Ctrl +Z取消选择。

  7. 移动位置,选中DIV后,如果单选组选中移动(-)(默认,快捷键为“-”)按住左键拖动位置后释放可批量移动位置,产生一段过度动画,不撤销选择的DIV可多次移动,如已移动完毕按Ctrl+Z撤销选择即可。

  8. 复制节点,选中DIV后,如果单选组选中复制(+,快捷键为“+”),按住左键拖动位置后释放,产生一段过度动画,即复制选中的DIV,如复制完毕按Ctrl+Z取消选择即可。

  9. 删除选中DIV,选中DIV后,按下按钮或者快捷键“Delete”、“.”可删除所有选中的DIV。

纯原生JavaScript音乐播放器开发:Web Audio API与Canvas可视化实战 在Web开发领域,音频处理与可视化是提升用户体验的关键技术。其核心原理在于浏览器提供的Web Audio API,它允许开发者直接操作音频数据流,进行解码、分析和实时控制。这项技术的工程价值在于,它让复杂音频处理的前端实现成为可能,无需依赖第三方插件或后端服务。在实际应用中,Web Audio API常与Canvas绘图结合,用于创建动态频谱、波形等音频可视化效果,这在音乐播放器、音频编辑器、游戏音效等场景中尤为常见。本文聚焦于一个具体的实战项目——构建一个功能完整的纯原生音乐播放器,深入探讨了如何利用We 阅读详情

相关推荐

纯JS控制DIV选择范围移动与复制(改进版)

未选择状态下,单击DIV上可选中此DIV。未选择状态下,单击在背景上按住左键拖动产生范围虚线框,在此范围虚线框内的DIV边框变粗变色为被选中,虚线框外的则不被选中。已选择状态下,按住Ctrl可再次选择,按住Ctrl的同时,单击在DIV上,如果DIV已被选中则取消本节点选择,反之选中此节点。已选择状态下,按住Ctrl的同时,如果单击在背景上按住左键拖动产生范围虚线框,在此范围虚线框内的DIV边框变粗变色为被选中,虚线框外的如果为上次已选中的则不仍然选中,否则不选中。释放后虚线消失,需要添加选择可重复第“3”,“4”步操作,多次选择的节点选中。快捷键选择,Ctrl +A全选,Ctrl +X反选,Ctrl +Z取消选择。移动位置,选中DIV后,如果单选组选中移动(-)(默认,快捷键为“-”)按住左键拖动位置后释放可批量移动位置,产生一段过度动画,不撤销选择的DIV可多次移动,如已移动完毕按Ctrl+Z撤销选择即可。复制节点,选中DIV后,如果单选组选中复制(+,快捷键为“+”),按住左键拖动位置后释放,产生一段过度动画,即复制选中的DIV,如复制完毕按Ctrl+Z取消选择即可。删除选中DIV,选中DIV后,按下按钮或者快捷键“Delete”、“.”可删除所有选中的DIV。

JS实现限制可移动div的移动范围

最近我的博客项目中需要用到可移动div框,虽然让div移动很简单,监听鼠标的坐标即可,但是如何限制可移动div的移动范围呢?这个问题困扰了我很久,我想了很久才有了解决方案。

qq_66968367的博客 1022

JS实现可拖动的DIV效果并限制范围区域

利用JS实现可拖动的DIV效果,在原有基础上增加的限制在一定区域内的效果。方便,易用。可以很方便地移动到您的工程里面

Ctrl+A 只选中div中的内容,而不选择页面全部

今天碰见一个需求,要求Ctrl+A只选中div中的内容 搜索以后发现给div添加contenteditable属性是个不错的方法 contenteditable 元素属性 默认属性: false 可选属性: true | false HTML5 引入的新属性 还有可以通过onselectstart, onselect 事件来控制用户选择 但是实现起来比较麻烦,所以我选择了使用contenteditable ...

qq_29207823的博客 919

VINS-Fusion实战:从零搭建无人机视觉惯性导航系统(附ROS配置指南)

本文提供了一份详尽的VINS-Fusion实战指南,涵盖从硬件选型、传感器标定到ROS节点配置与参数调优的全过程。重点解析了如何将VINS-Fusion视觉惯性里程计系统与PX4飞控深度集成,并实现室外GPS融合,旨在帮助开发者从零搭建稳定、高精度的无人机视觉惯性导航系统。

lll78的博客 865

深入解析高通8155平台音频数据流:从HAL到DSP的完整链路

本文深入解析了高通8155平台音频数据从安卓HAL层到DSP的完整传输链路。以播放场景为例,详细阐述了音频数据如何通过ASoC DPCM框架进行路由、打包,并经由APR协议与DSP交互,最终驱动硬件发声的核心流程,为车载音频系统开发与调试提供了清晰的框架。

rust6ferris的博客 1176

使用javascript灵活控制DIV的位置

使DIV始终居于屏幕中间的方法 方法1: &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; &lt;html xmlns=" http://www.w3.org/1999/xhtml"&...

weixin_34357962的博客 215

QGIS:安装Deepness插件+应用

简单的描述了deepness的安装应用历程,重点是记录博主本次遇到的坑

fengyi157的博客 2337

纯JS控制DIV选择范围移动与复制

 html>    head>        title>纯JS控制DIV选择范围移动与复制title>    head>body onselectstart="return false">script language="javascript" type="text/javascript">...    var copyNo = 0;    var eventType = "nothin

pippe的专栏 4472

为什么PCB设计中的50Ω阻抗如此重要?从USB到以太网的实战解析

本文深入解析了PCB设计中50Ω特征阻抗的核心重要性及其工程权衡起源。文章从传输线理论出发,阐释了阻抗匹配对防止信号反射、确保信号完整性的关键作用,并对比了USB、以太网等不同应用场景的阻抗标准。同时,文章结合实际案例,剖析了在两层板等简单设计中实现精准阻抗控制的难点与实战解决方案。

weixin_29268385的博客 297

14、多标签分类与卷积神经网络在医学图像处理中的应用

本文探讨了多标签分类与卷积神经网络(CNN)在医学图像处理中的应用。文章详细介绍了多标签分类的概念和挑战,以及如何通过CNN进行高效、准确的分类任务。内容涵盖模型设计、损失函数选择、数据增强技术、类别权重调整等关键技术点,并结合实际案例,如白内障手术工具检测、视网膜血管分割等,展示了CNN在医学图像分析中的强大潜力。此外,还讨论了模型优化策略及面临的挑战与解决方案。

t8u9v0的博客 192

原生JS监听复制事件,更改复制的内容,或者在复制内容后面追加参数,原生JS控制按钮点击复制自定义内容,复制想要让复制的内容

原生 JS 监听 复制 copy 事件,追加版权信息 <div class="empty-font">空心字</div> <script type="text/javascript"> //监听整个页面的 copy 事件 document.addEventListener('copy',function(e){ // clipboardData 对象是为通过编辑菜单、快捷菜单和快捷键执行的编辑操作所保留的,也就是你复制或者剪切内容 let clipboardD

8170

在PPT里如何做出晶莹剔透的高级水泡感出来呢

水晶汽泡被大量使用在TED场景的演讲片稿中,给人以强烈的视觉冲击感。其实实现很简单。本篇就用三步教会大家如何制作这样的一种PPT效果。

打造全国最全的AI Agent开发知识领域的博客 1537

JS复制文本到粘贴板,前端H5移动端点击按钮复制文本到粘贴板。

方案一: 最近做手机端H5网页里面有个活动:点击按钮复制邀请码。查过一些方法,在电脑端可以复制粘贴,一放在手机上面打开网页就不能复制粘贴了。 直接进入正题 使用开源项目 clipboard.js, 官网:点击打开链接 可以通过script标签引入 也可以通过npm安装,npm install clipboard.js --save-dev。 这个插件复制的对象必须是input 或者 ...

qq_32849999的博客 4122

21天学会基于 Linux 的 NPU 固件开发--2.2 固件加载流程:request_firmware() 深度解析

本文深度解析Linux内核中NPU固件加载流程,重点剖析request_firmware()机制。内容涵盖:1)内核态与用户态的交互机制,包括同步/异步加载方式;2)NPU固件的特殊格式与加载逻辑;3)调试技巧与安全验证方案;4)提供最小化固件加载器实验。文章揭示了从文件系统到硬件初始化的完整链路,探讨了大模型时代面临的性能挑战与优化方案,如零拷贝加载技术,并提出了版本兼容性、断电恢复等关键问题的思考方向。

amy_mhd的博客 59

Android P车机添加屏幕多指全局自定义手势操作

参照原生状态栏全局下拉手势拦截,实现屏幕全局多指手势响应操作,并对手势进行转换为KeyEvent,以便项目自定义手势行为或应用拦截手势行为。

shusuanly的博客 1252

js 原生js复制到粘贴板

优点: 代码少 纯元素JavaScript 无插件 无须服务器 知识点: createTextRange//ie 创建TextRange 对象 createRange//非ie 创建Range 对象 Range 对象 execCommand//允许用户对当前文档、当前选中区域或者给定范围执行一个浏览器内部命令 element.select()//Input Text select()方法;选取...

352328759的博客 2462

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

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

需要动态创建DIV

这是原来的CSS样式 .item{float:left;overflow:hidden;margin-left:8px;margin-top:10px;width: 320px; height: 250px;background-repeat: no-repeat; background-image:url(../images/bgred.jpg)} .curve{position:r...

long316的专栏 336

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

js 图片缩放不超出父级元素范围_JS之 图表库

阅读本文约需要6分钟大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了Vue之复制内容到剪贴板的知识,今天跟大家分享下JS之 图表库的知识。1 图表库随着数据收集和使用的持续呈指数增长,可视化此数据的需求变得越来越重要。开发人员寻求将数百万个数据库记录整合为美观的图表和仪表板,以便人类可以快速直观地进行解释。数据可视...

weixin_39911567的博客 234

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Javascript控制剪贴板大全

看到UBB代码[ code ]视窗的时候会有个"复制到剪贴板"的功能.我觉得很好用.   突然想到文件上传后,出现在"地址(路径)"位置的URL,给他加个复制的按钮吧.   研究了一下原来的代码..   定义函数   程序代码 1. function CopyText(obj) { 2. ie = (document.all)? true:false 3. if

smshuxue的专栏 980

别再手动写年份范围了!用这个Vue组件库的补丁方案,5分钟搞定

本文介绍了一种轻量级补丁方案,帮助开发者快速实现Element UI的年份范围选择功能。通过封装独立Vue组件,无需修改源码或引入重型库,即可在5分钟内集成与Element UI风格一致的年份范围选择器,适用于数据报表、统计分析等高频场景。

weixin_29012765的博客 244

JavaScript复制到剪切板全解析:从Clipboard API到兼容性实战

剪切板操作是Web开发中连接网页与用户操作系统的关键接口,其核心原理在于浏览器安全策略对用户交互上下文的严格要求。从技术演进角度看,早期广泛依赖的document.execCommand方法通过模拟用户手动选择与复制行为实现功能,而现代异步Clipboard API则提供了更标准、性能更优的解决方案。这两种方案的技术价值在于平衡功能实现、安全策略与跨浏览器兼容性,直接影响着电商优惠码分享、内容链接复制、后台数据导出等高频应用场景的用户体验。本文聚焦于复制到剪切板这一常见但易出错的开发需求,深入剖析了exec

weixin_30493401的博客 379

如何用纯CSS实现震撼滚动效果:视差滚动与固定导航完整指南

在现代网页设计中,滚动效果是提升用户体验的关键元素。You-Dont-Need-JavaScript项目展示了CSS的强大能力,无需编写任何JavaScript代码,就能实现令人惊叹的视差滚动和固定导航效果。本文将带你探索如何利用纯CSS技术打造专业级滚动体验,让你的网页设计脱颖而出。 ## 为什么选择纯CSS滚动效果? 纯CSS实现的滚动效果具有三大优势:加载速度更快、代码维护更简单、兼容性

gitblog_00303的博客 822

javascript 避障实践

JS避障实现的核心逻辑与实践 避障分为**感知(碰撞检测)和行动(路径修正)**两步: 检测碰撞:矩形元素用getBoundingClientRect()高效判断重叠;复杂图形需isPointInPath()或库(如matter.js),控制检测频率(如16ms/次)。 修正路径:优先沿空白最大方向移动,或多障碍时用简化A*算法网格寻路。 最佳实践: 标签化障碍物减少检测范围,预留缓冲距离(5-10px)提升体验。 性能兜底:requestAnimationFrame()控制执行频率,复杂场景直接用Thre

hawkol的专栏 441

纯前端转盘抽奖模板:零依赖、可定制,快速实现互动抽奖

在前端开发中,CSS动画与JavaScript交互是实现动态效果的核心技术。通过CSS transform和transition属性,可以创建平滑的旋转动画,而JavaScript则负责控制动画逻辑与状态管理。这种技术组合在营销活动、用户互动等场景中具有重要价值,能够显著提升用户体验与参与感。本文聚焦于一个典型的应用场景——转盘抽奖,深入解析如何利用纯前端技术构建一个零依赖、高度可定制的抽奖组件。该方案采用模块化设计,将视觉层、逻辑层与数据层分离,便于开发者快速集成与二次开发。文中详细探讨了扇形绘制、旋转动

weixin_30813225的博客 360
上一篇: 纯JS打造循环间隔滚动公告栏
下一篇: JS小游戏 - 盖房子
pippe
博客等级 码龄19年 22粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值