javascript - 使用canvas制作鼠标轨迹中使用传统事件绑定和addEventListener事件绑定效果不同?
PHPz
PHPz 2017-04-11 09:07:02
[JavaScript讨论组]

<!doctype html>
<html lang="en">
<head>

<meta charset="UTF-8">
<title>鼠标轨迹</title>
<style>
    body{
        background:black;
    }
</style>

</head>
<body>

<canvas width="800" height="600" style="background:white;">
    不支持canvas
</canvas>

</body>
<script>

window.onload =function(){
    var canv = document.querySelector('canvas');
    if(false !==canv.getContent){

    var canvas = canv.getContext('2d');
    canv.addEventListener('mousedown',function(ev){
        var ev = ev || window.event;
            canvas.beginPath();
            canvas.moveTo(ev.clientX-canv.offsetLeft,ev.clientY-canv.offsetTop);
                canv.addEventListener('mousemove',function(ev){
                var ev = ev || window.event;
                    canvas.lineTo(ev.clientX-canv.offsetLeft,ev.clientY-canv.offsetTop);
                    canvas.stroke();
                    canv.addEventListener('mouseup',function(){
                            canvas.closePath();
                        canv.removeEventListener('mousemove',function(){
                            
                        },false);
                        
                    },false);
        },false);
    },false);
    
    
        
    }
};

</script>
</html>
鼠标轨迹运行,可是onmouseup无法让轨迹停止
window.onload =function(){

    var canv = document.querySelector('canvas');
    if(false !==canv.getContent){

    var canvas = canv.getContext('2d');

    canv.onmousedown = function(ev){
                var ev = ev || window.event;
                canvas.beginPath();
                canvas.moveTo(ev.clientX-canv.offsetLeft,ev.clientY-canv.offsetTop);
                canv.onmousemove = function(ev){
                    var ev = ev || window.event;
                    canvas.lineTo(ev.clientX-canv.offsetLeft,ev.clientY-canv.offsetTop);
                    canvas.stroke();
                };
                canv.onmouseup = function(){
                    canv.onmousemove = null;
                    canvas.closePath();
                    //canv.onmousedown = null;
                };
            };

    }
};

传统事件绑定正常.,怎么修改代码使得现代的事件绑定也可以正常运行呢
//经过提醒修复一部分后
经过修改之后好了.其实我这个嵌套是为了说明先后顺序.而且,取消完路径还是要嵌套的.我暂时修改成这样了.

var canvas = canv.getContext('2d');
    canv.addEventListener('mousedown',function(ev){
        var ev = ev || window.event;
            canvas.beginPath();
            canvas.moveTo(ev.clientX-canv.offsetLeft,ev.clientY-canv.offsetTop);
    },false);
    canv.addEventListener('mousemove',paint,false);
    canv.addEventListener('mouseup',function(){
        canvas.closePath();
        canv.removeEventListener('mousemove',paint,false);
    },false);
    function paint(ev){
        var ev = ev || window.event;
        canvas.lineTo(ev.clientX-canv.offsetLeft,ev.clientY-canv.offsetTop);
        canvas.stroke();
    }

目前依旧存在问题,取消mousemove的事件监听后,不知道在何处恢复mousemove的事件监听

PHPz
PHPz

学习是最好的投资!

全部回复(1)
巴扎黑

onmousedown和addEventListener一个重要的区别在于:
前者只能绑定一个事件处理函数,后者可以是多个(处理函数队列)

也就是说:

canv.onmousedown = function() {console.log('handler1');};
canv.onmousedown = function() {console.log('handler2');};
//这里handler2会覆盖handler1

而,这里不会:

canv.addEventListener('mousedown', function() {console.log('handler1');});
canv.addEventListener('mousedown', function() {console.log('handler2');});

回到你的代码,不要把mousedown, mousemove, mouseup嵌套写,你会把相同的处理函数反复绑定

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号