js 事件体

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div
        {
            width: 50px;
            height: 50px;
            background-color: greenyellow;
            margin: 0 10px;
            float: left;
        }
    </style>
</head>
<body>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
<script>
    /*var div0=document.getElementById("div0");
    div0.addEventListener("click",clickHandler);
    function clickHandler(e) {
        console.log(e);
    }*/
    /*
    * 根据div获取div列表为divs
    * 设置变量数组selectDiv是一个空数组
    * 循环divs列表,设置每一个div做点击侦听事件
    * 给每个div增加一个属性index,为这个div的索引标识,后面用来区分前后关系
    *
    *
    * */
    var divs=document.getElementsByTagName("div");
    var selectDiv=[];
    for(var i=0;i<divs.length;i++){
        divs[i].addEventListener("click",clickHandler);
        divs[i].index=i;
    }

    /*
    * 点击div以后做内容判断
    *  1、如果e.ctrlKey是真,表示按着Ctrl点击的div
    *     这个操作我们需要把新的div添加入选中的div数组中
    *     1)、如果当前点击的div在选中的数组中存在时
    *          从选中的div列表中删除当前点击的div
    *          设置当前点击的div无边框
    *          跳出函数
    *      2)、如果在选中的列表中没有当前点击的div时,
    *          把当前的div添加在选中列表中
    *          并且设置当前div的边线是1像素
    *  2、如果e.shiftKey是真,表示按着shift点击的div
    *     这个操作我们需要把第一个被选中的div到当前点击的div都选中
    *     1)、先把选中的div列表中所有div按照index属性排序,从小到大
    *         因为考虑到我们多选点选时可能第一个并不是最前面的,可能是从后选得
    *      2)因为做了从小到大的排序,因此我们取出第0项的index就是最小的索引项
    *      3)获取当前点击的div的索引值。从最小的索引值到我们当前点击的div中间的所有div被选中
    *      4)先清除所有被选中的div
    *      5)如果最小索引项大于当前点击的索引,循环divs列表,从当前点击项到最小索引项都被选中(添加到选中数组中,并且加边框)
    *      6)如果最小索引小于当前点击的索引,循环divs列表,从最小索引项到当前点击项都被被选中(添加到选中数组中,并且加边框)
    *      7)如果最小项等于当前点击项,仅选中当前点击项,其它清除(添加到选中数组中,并且加边框)
    *  3、直接点击,这种操作是单选
    *     1、先清除所有被选中的div
    *     2、把当前被点击的添加入选择列表中
    *     3、加边线
    *
    * */
    function clickHandler(e) {
        if(e.ctrlKey){
            if(selectDiv.indexOf(this)>-1){
                selectDiv.splice(selectDiv.indexOf(this),1);
                this.style.border="none";
                return;
            }
            selectDiv.push(this);
            this.style.border="1px solid #000000";
        }else if(e.shiftKey){
            selectDiv.sort(function (a,b) {
                return a.index-b.index;
            });
            var index=selectDiv[0].index;
            var lastIndex=this.index;
            clearAll();
            if(index>lastIndex){
                for(var i=lastIndex;i<=index;i++){
                    divs[i].style.border="1px solid #000000";
                    selectDiv.push(divs[i]);
                }
            }else if(index<lastIndex){
                for(var j=index;j<=lastIndex;j++){
                    divs[j].style.border="1px solid #000000";
                    selectDiv.push(divs[j]);
                }
            }else{
                this.style.border="1px solid #000000";
                selectDiv.push(this);
            }

        }else{
            /*if(selectDiv===this) return;
            if(selectDiv){
                selectDiv.style.border="none";
            }
            selectDiv=this;*/
            if(selectDiv===this) return;
            clearAll();
            selectDiv.push(this);
            this.style.border="1px solid #000000";
        }
    }

    /*
    *  清除所有函数
    *     循环selectDiv,这是所有选中div的列表
    *     让所有选中的divborder都设置为none,不加边线
    *     设置数组的length=0
    *     是最快的清除数组的方法
    *
    * */
    function clearAll() {
        for(var i=0;i<selectDiv.length;i++){
            selectDiv[i].style.border="none";
        }
        selectDiv.length=0;
    }
</script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为three.js中的多边绑定点击事件也可以使用鼠标交互和射线。以下是一个基本的示例代码: ```javascript // 创建一个可交互的多边 var geometry = new THREE.TetrahedronGeometry(50); var material = new THREE.MeshBasicMaterial({color: 0xff0000}); var mesh = new THREE.Mesh(geometry, material); mesh.position.set(0, 0, -100); scene.add(mesh); // 创建一个射线 var raycaster = new THREE.Raycaster(); var mouse = new THREE.Vector2(); // 监听鼠标移动事件 function onMouseMove(event) { // 计算鼠标在屏幕上的位置 mouse.x = (event.clientX / window.innerWidth) * 2 - 1; mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; } // 监听鼠标点击事件 function onClick(event) { // 将鼠标位置转换为three.js的向量 mouse.x = (event.clientX / window.innerWidth) * 2 - 1; mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; // 在场景中发射射线 raycaster.setFromCamera(mouse, camera); // 计算射线和物的交点 var intersects = raycaster.intersectObjects(scene.children, true); if (intersects.length > 0) { // 如果射线和物有交点,取第一个交点的对象 var obj = intersects[0].object; // 判断对象是否为多边 if (obj.geometry instanceof THREE.Geometry) { // 执行点击事件 obj.onClick(obj); } } } // 将事件添加到document上 document.addEventListener('mousemove', onMouseMove, false); document.addEventListener('click', onClick, false); ``` 在上面的代码中,首先创建了一个可交互的多边和一个射线。然后监听鼠标移动和点击事件,并将鼠标位置转换为three.js的向量。在点击事件中,我们使用射线和场景中的所有对象进行交叉检测,如果有交点,就执行相应的点击事件。在这里,我们假设多边是由THREE.Geometry对象创建的,如果被点击的对象是多边,则执行该多边的点击事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值