如何用canvas画布获得fillText的位置,并且设置浮动框,显示详细信息

1.我想在数据处,设置鼠标的浮动事件,显示附近的浮动框,并且在框里显示详细信息

代码部分:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>燃烧系统图</title>
    </head>
    <body>
        <canvas id="myCanvas" width="1600" height="800" style="margin-top: -60px;">
        </canvas>
    </body>
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript">
        var context = document.getElementById('myCanvas').getContext('2d');
        context.beginPath();
        var x = 300,
            y = 200,
            x1 = 1000,
            y1 = 200,
            intervalX = 300,
            intervalY = 30;
        var tphitstr = "一次风速前上/一次风温前上1,一次风速前上/一次风温前上2,一次风速前上/一次风温前上3,一次风速前上/一次风温前上4,一次风速前中/一次风温前中1,一次风速前中/一次风温前中2,一次风速前中/一次风温前中3,一次风速前中/一次风温前中4,一次风速前下/一次风温前下1,一次风速前下/一次风温前下2,一次风速前下/一次风温前下3,一次风速前下/一次风温前下4,一次风速后上/一次风温后上1,一次风速后上/一次风温后上2,一次风速后上/一次风温后上3,一次风速后上/一次风温后上4,一次风速后上/一次风温后中1,一次风速后中/一次风温后中2,一次风速后中/一次风温后中3,一次风速后中/一次风温后中4,一次风速后下/一次风温后下1,一次风速后下/一次风温后下2,一次风速后下/一次风温后下3,一次风速后下/一次风温后下4";
        var tphitarr = tphitstr.split(",");
        for(var k=1;k<4;k++){
            //循环的是左侧的线条
            for(var i = 0;i<10;i+=5){
                context.moveTo(x,k*y+i);
                context.lineTo(x+intervalX,k*y+i);    
                context.font = '16px Palatino';
                context.moveTo(x,k*y+intervalY+i);
                context.lineTo(x+intervalX,k*y+intervalY+i);
                context.moveTo(x,k*y+intervalY*2+i);
                context.lineTo(x+intervalX,k*y+intervalY*2+i);
                context.moveTo(x,k*y+intervalY*3+i);
                context.lineTo(x+intervalX,k*y+intervalY*3+i);
            }
            //循环的是右侧的线条
            for(var i = 0;i<10;i+=5){
                context.moveTo(x1,k*y1+i);
                context.lineTo(x1+intervalX,k*y1+i);    
                context.moveTo(x1,k*y1+intervalY+i);
                context.lineTo(x1+intervalX,k*y1+intervalY+i);
                context.moveTo(x1,k*y1+intervalY*2+i);
                context.lineTo(x1+intervalX,k*y1+intervalY*2+i);
                context.moveTo(x1,k*y1+intervalY*3+i);
                context.lineTo(x1+intervalX,k*y1+intervalY*3+i);
            }
            context.font = '32px Palatino';
            //显示的是大字
            switch(k){
                case 1: context.fillText('上层',x+intervalX,1*y-40);
                case 2: context.fillText('中层',x+intervalX,2*y-40);
                default: context.fillText('下层',x+intervalX,3*y-40);
            }
            //画的是3个正方形
            context.rect(x+intervalX,k*y-26,400,150);
            context.stroke();
            context.stroke();
        }
        var xmlhttp,xmlDoc;
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.open("GET","Data/jzyxsj.xml",false);
        xmlhttp.send();
        xmlDoc=xmlhttp.responseXML; 
        var itemData=xmlDoc.getElementsByTagName("item");
        var var1,var2;
        var val1Array=new Array();
        var    val2Array=new Array();
        for (i=0;i<itemData.length;i++)
        { 
            val1=itemData[i].getElementsByTagName("val1")[0].childNodes[0];
            val2=itemData[i].getElementsByTagName("val2")[0].childNodes[0];
            if(!val2){
                val2Array[i]="";
                val1Array.push(val1.nodeValue);
                continue;
            }
            if(!val1){
                val1Array[i]="_";
                val2Array.push(val2.nodeValue);
                continue;
            }
            val1Array.push(val1.nodeValue);
            val2Array.push(val2.nodeValue);
        }
        for(var k=0;k<3;k++){
            context.font = '16px Palatino';
            //左边的数据
            switch(k){
                case 0:m(0);
                break;
                case 1:m(4);
                break;
                case 2:m(8);
                break;
            }
        }
        function m(value){
            for(var j=value,l=0;j<value+4;j++,l++){
                //左边的数据
                console.log(context.measureText(val1Array[j]).width);
                context.fillText(val1Array[j]+'|'+val2Array[j],x,(k+1)*y+l*30-5);
                context.fillText(val1Array[j]+'|'+val2Array[j],x,(k+1)*y+intervalY+l*30-35);
                context.fillText(val1Array[j]+'|'+val2Array[j],x,(k+1)*y+intervalY+l*30-35);
                //左边的区域
                /*var theRectZ = context.rect(x-20, (k+1)*y+l*30-25, 200, 23);
                context.stroke();*/
                //右边的数据
                context.fillText(val1Array[j+12]+'|'+val2Array[j+8],x+2*intervalX+300,(k+1)*y+l*30-5);
                context.fillText(val1Array[j+12]+'|'+val2Array[j+8],x+2*intervalX+300,(k+1)*y+intervalY+l*30-35);
                context.fillText(val1Array[j+12]+'|'+val2Array[j+8],x+2*intervalX+300,(k+1)*y+intervalY+l*30-35);
                //右边的区域
                /*var theRectY = context.rect(x+2*intervalX+300-20, (k+1)*y+l*30-25, 200, 23);
                context.stroke();*/
            }
        }
        var cas = document.querySelector("#myCanvas");
        var ctx = cas.getContext('2d');
        cas.onclick = function(e){
            if(context.isPointInPath(e.offsetX,e.offsetY)){
                alert('老大!别点我');
            }
        }

    </script>
</html>
阅读 3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题