1. 程式人生 > >Js實現——右鍵出現選單,選單中有新建,複製,剪下,貼上,刪除

Js實現——右鍵出現選單,選單中有新建,複製,剪下,貼上,刪除

描述:

   單擊右鍵出現選單,選單中有新建,複製,剪下,貼上,刪除
   選擇新建時,建立第一個div,寬高50,顏色隨機,並且放在滑鼠點選的位置
   點選div,div被選中,加邊線,如果被選中,div可以被拖動,當選擇別的div時
   原div取消被選中狀態,不可以拖動。
   複製可以複製被選中的div
   剪下可以剪下被選中的div
   貼上可以將複製或者剪下的div貼上在點選的位置
   刪除可以刪除div

效果:

 

實現:

js:

var Method=(function () {
    return {
        EVENT_ID:"event_id",
        loadImage:function (arr) {
            var img=new Image();
            img.arr=arr;
            img.list=[];
            img.num=0;
//            如果DOM物件下的事件偵聽沒有被刪除掉,將會常駐堆中
//            一旦觸發了這個事件需要的條件,就會繼續執行事件函式
            img.addEventListener("load",this.loadHandler);
            img.self=this;
            img.src=arr[img.num];
        },
        loadHandler:function (e) {
            this.list.push(this.cloneNode(false));
            this.num++;
            if(this.num>this.arr.length-1){
                this.removeEventListener("load",this.self.loadHandler);
                var evt=new Event(Method.EVENT_ID);
                evt.list=this.list;
                document.dispatchEvent(evt);
                return;
            }
            this.src=this.arr[this.num];
        },
        $c:function (type,parent,style) {
            var elem=document.createElement(type);
            if(parent) parent.appendChild(elem);
            for(var key in style){
                elem.style[key]=style[key];
            }
            return elem;
        },
        mixColor:function (red,green,blue,alpha) {
            var obj={};
            var reds=Method.getColor(red);
            var greens=Method.getColor(green);
            var blues=Method.getColor(blue);
            var alphas=Method.getColor(alpha);

            obj.color="#"+reds[1]+greens[1]+blues[1];
            obj.colorAlpha="#"+reds[1]+greens[1]+blues[1]+(!alpha ? "FF" : alphas[1]);
            obj.rgba="rgba("+reds[0]+","+greens[0]+","+blues[0]+","+(!alpha ? 1 : alphas[0]/256)+")";
            obj.rgb="rgba("+reds[0]+","+greens[0]+","+blues[0]+")";
            return obj;
        },
        getColor:function (col) {
            if(typeof col!=="number" && !Array.isArray(col)){
                col=256;
            }
            if(col>256) col=256;
            var color;
            if(Array.isArray(col)){
                color =Math.floor(Method.random(col[0],col[1]));
                col=color.toString(16);
            }else{
                color=Math.floor(Math.random()*col);

                col=color.toString(16);
            }
            if(col.length===1){
                col="0"+col;
            }
            return [color,col];
        },
        random:function (min,max) {
            max=Math.max(min,max);
            min=Math.min(min,max);
            return Math.floor(Math.random()*(max-min)+min);
        },
        dragElem:function (elem) {
            elem.addEventListener("mousedown",this.mouseDragHandler);
            elem.self=this;
        },
        removeDrag:function (elem) {
            elem.removeEventListener("mousedown",this.mouseDragHandler);
        },
        mouseDragHandler:function (e) {
            if(e.type==="mousedown"){
                e.stopPropagation();
                e.preventDefault();
                document.point={x:e.offsetX,y:e.offsetY};
                document.elem=this;
                this.addEventListener("mouseup",this.self.mouseDragHandler);
                document.addEventListener("mousemove",this.self.mouseDragHandler);
            }else if(e.type==="mousemove"){
                this.elem.style.left=e.x-this.point.x+"px";
                this.elem.style.top=e.y-this.point.y+"px";
            }else if(e.type==="mouseup"){
                this.removeEventListener("mouseup",this.self.mouseDragHandler);
                document.removeEventListener("mousemove",this.self.mouseDragHandler);
            }
        }
    }
})();

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/Method.js"></script>
    <style>
        div
        {
            background-color: deepskyblue;
            ;
        }
    </style>
</head>
<body>
    <script>
        var ul,selectedElem,copyElem;
        var list=["新建","複製","剪下","貼上","刪除"];
        const RECT_W=50;
        const RECT_H=50;
        init();
        function init() {
            ul=Method.$c("ul",document.body,{
                listStyle:"none",
                padding:0,
                margin:0,
                display:"none",
                position:"absolute",
                zIndex:1
            });
            for(var i=0;i<list.length;i++){
               var li=Method.$c("li",ul,{
                   padding:"7px 30px",
                   color:"#FFFFFF",
                   backgroundColor:"dodgerblue",
                   cursor: "default"
               });
               li.textContent=list[i];
            }
            ul.addEventListener("mouseover",mouseHandler);
            ul.addEventListener("mouseout",mouseHandler);
            ul.addEventListener("mouseleave",mouseHandler);
            ul.addEventListener("click",clickHandler);
            document.addEventListener("contextmenu",showMenuHandler)
        }
        
        function showMenuHandler(e) {
            e.preventDefault();
            ul.style.display="block";
            ul.style.left=e.clientX-20+"px";
            ul.style.top=e.clientY-10+"px";
        }
        
        function mouseHandler(e) {
            if(e.type==="mouseover" && e.target instanceof HTMLLIElement){
                e.target.style.backgroundColor="deepskyblue";
            }else if(e.type==="mouseout" && e.target instanceof HTMLLIElement){
                e.target.style.backgroundColor="dodgerblue";
            }else if(e.type==="mouseleave"){
                this.style.display="none";
            }
        }

        function clickHandler(e) {
            var index=list.indexOf(e.target.textContent);

            switch (index)
            {
                case 0:
                    createElem(e.x,e.y);
                    break;
                case 1:
                    if(!selectedElem) break;
                    copyElem=selectedElem.cloneNode(false);
                    break;
                case 3:
                    if(!copyElem) break;
                    var pasteElem=copyElem.cloneNode(false);
                    document.body.appendChild(pasteElem);
                    pasteElem.addEventListener("click",selectedElemHandler);
                    pasteElem.style.left=e.x-RECT_W/2+"px";
                    pasteElem.style.top=e.y-RECT_H/2+"px";
                    pasteElem.style.border="none";
                    break;
                case 2:
                    if(!selectedElem) break;
                    copyElem=selectedElem.cloneNode(false);
                case 4:
                    if(!selectedElem) break;
                    selectedElem.removeEventListener("click",selectedElemHandler);
                    selectedElem.remove();
                    selectedElem=null;
                    break;
            }
            ul.style.display="none";
        }
        
        function createElem(x,y) {
            var elem=Method.$c("div",document.body,{
                width:RECT_W+"px",
                height:RECT_H+"px",
                backgroundColor:Method.mixColor().rgba,
                position:"absolute",
                left:x-RECT_W/2+"px",
                top:y-RECT_H/2+"px"
            });
            elem.addEventListener("click",selectedElemHandler);
        }

        function selectedElemHandler(e) {
            if(selectedElem){
                selectedElem.style.border="none";
                Method.removeDrag(selectedElem);
            }
            selectedElem=this;
            selectedElem.style.border="1px solid #000000";
            Method.dragElem(selectedElem);
        }



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