html js 定制进度条 (二)

html js 定制进度条 (一)

html js 定制进度条 (二) 

 版本一遗留的问题:

1 鼠标消息捕获问题(图层覆盖),解决方法设置图层,图像层置于底层,鼠标消息层置于上层且设置为透明,完美解决。

 

    function createMouseEventDiv() {
		do{
			var parentCanvas = document.getElementById(parentCanvasId);
			if(parentCanvas==null || parentCanvas==undefined)
			{
				alert("getElementById " + parentCanvasId + "错误!" );
				ini_step++;
				break;
			}
			
			var parentWidth = parentCanvas.offsetWidth;
			if(parentWidth==null || parentWidth==undefined)
			{
				alert("获取画布宽失败");
				ini_step++;
				break;
			}
			var parentHeight = parentCanvas.offsetHeight;
			if(parentHeight==null || parentHeight==undefined)
			{
				alert("获取画布高失败");
				ini_step++;
				break;
			}
			var filterStr ='';
			if(browserMatch.browser=='IE' && browserMatch.version <=9.0)
			{
				filterStr = 'filter:alpha(opacity=0);';            //IE9.0以下 版本的区别  支持滤镜
			}
			else
			{
				filterStr = 'opacity: 0;';                          //IE10.0以上 版本的区别
			}
			var htm = '<div id="' + mouseCanvasId + '" style="position:absolute;' +
			'width:' + parentWidth + 'px;' +
			'height:' + parentHeight + 'px;' +
			'background-color:#363636;' +
			filterStr +
			'"><\/div>';
			//alert(htm);
			parentCanvas.insertAdjacentHTML("beforeEnd", htm);
		}while(0);
    }


    function createCanvasDiv () {
		do{
			var parentCanvas = document.getElementById(parentCanvasId);
			if(parentCanvas==null || parentCanvas==undefined)
			{
				alert("getElementById " + parentCanvasId + "错误!" );
				ini_step++;
				break;
			}
			
			var parentWidth = parentCanvas.offsetWidth;
			if(parentWidth==null || parentWidth==undefined)
			{
				alert("获取画布宽失败");
				ini_step++;
				break;
			}
			var parentHeight = parentCanvas.offsetHeight;
			if(parentHeight==null || parentHeight==undefined)
			{
				alert("获取画布高失败");
				ini_step++;
				break;
			}
			var htm = '<div id="' + pCanvasId + '" style="position:absolute;' +
			'width:' + parentWidth + 'px;' +
			'height:' + parentHeight + 'px;' +
			'background-color:#363636;"' +
			'><\/div>';
			//alert(htm);
			parentCanvas.insertAdjacentHTML("beforeEnd", htm);
		}while(0);
    }

 

 

 

 

 

2 IE 兼容问题,新版本支持IE7.0~IE11.0

涉及 问题1:浏览器版本的获取

	function getBrowserInfo()
	{
		var ua = navigator.userAgent.toLowerCase() ;
		rMsie = /(msie\s|trident.*rv:)([\w.]+)/,     
		rFirefox = /(firefox)\/([\w.]+)/,     
		rOpera = /(opera).+version\/([\w.]+)/,     
		rChrome = /(chrome)\/([\w.]+)/,     
		rSafari = /version\/([\w.]+).*(safari)/;    
		var browser;    
		var version;  
		
		
			var match = rMsie.exec(ua);    
		  if(match != null){ 
		  browser = "IE";
		  version = match[2] || "0";
			return { 
			browser : "IE", version : match[2] || "0" };    
		  }    
		  var match = rFirefox.exec(ua);    
		  if (match != null) {    
			return { browser : match[1] || "", version : match[2] || "0" };    
		  }    
		  var match = rOpera.exec(ua);    
		  if (match != null) {    
			return { browser : match[1] || "", version : match[2] || "0" };    
		  }    
		  var match = rChrome.exec(ua);    
		  if (match != null) {    
			return { browser : match[1] || "", version : match[2] || "0" };    
		  }    
		  var match = rSafari.exec(ua);    
		  if (match != null) {    
			return { browser : match[2] || "", version : match[1] || "0" };    
		  }    
		  if (match != null) {    
			return { browser : "", version : "0" };    
		  }    
	}

 问题2:wz_jsgraphics 对IE9.0以上的支持,修改代码

<span style="white-space:pre"></span><pre name="code" class="javascript"><span style="white-space:pre">	</span>function chkDHTM(x, i)
<span style="white-space:pre">	</span>{
	<span style="white-space:pre">	</span>x = document.body || null;
	<span style="white-space:pre">	</span>jg_ie = x && typeof x.insertAdjacentHTML != "undefined";
	<span style="white-space:pre">	</span>jg_dom = (x && !jg_ie &&
		<span style="white-space:pre">	</span>typeof x.appendChild != "undefined" &&
		<span style="white-space:pre">	</span>typeof document.createRange != "undefined" &&
		<span style="white-space:pre">	</span>typeof (i = document.createRange()).setStartBefore != "undefined" &&
		<span style="white-space:pre">	</span>typeof i.createContextualFragment != "undefined");
	<span style="white-space:pre">	</span>jg_ihtm = !jg_ie && !jg_dom && x && typeof x.innerHTML != "undefined";
	<span style="white-space:pre">	</span>//jg_fast = jg_ie && document.all && !window.opera;   //注释 使其支持IE9.0 及以上
	<span style="white-space:pre">	</span>jg_fast = false;     //新加
	<span style="white-space:pre">	</span>jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined";
<span style="white-space:pre">	</span>}

 

 

 

问题3:IE10.0 以上滤镜的属性表示不同

<span style="white-space:pre">		</span>if(browserMatch.browser=='IE' && browserMatch.version <=9.0)
		{
			filterStr = 'filter:alpha(opacity=0);';            //IE9.0以下 版本的区别  支持滤镜
		}
		else
		{
			filterStr = 'opacity: 0;';                          //IE10.0以上 版本的区别
		}


完整的代码:

 

 

/*
author: zjj
time : 201609013
		 
回放状态时间刻度处理类

*/


//定义回掉函数命令码
if (typeof hwxPBSTimerCbCmd == "undefined") {
    var hwxPBSTimerCbCmd = {};
    hwxPBSTimerCbCmd.ReqPlayTime = 0;   //重新定位播放起始位置
    hwxPBSTimerCbCmd.ReqStatusTbls = 1; //重新请求录像状态表
}

/*
录像状态类
timePeriods: 录像查询区间
recordedTimeTbls: 录像的时间表

*/
function hwxRecordStatus(timePeriodsArr, recordedTimeTbls) {
    this.ptimePeriodsArr = new Array();

    if (timePeriodsArr != undefined) {
        for (var i = 0; i < timePeriodsArr.length; i++) {
            this.ptimePeriodsArr.push(timePeriodsArr[i]);
        }
    }

    this.precordedTimeTbls = new Array();

    if (recordedTimeTbls != undefined) {
        for (var i = 0; i < recordedTimeTbls.length; i++) {
            this.precordedTimeTbls.push(recordedTimeTbls[i]);
        }
    }

}

function hwxPBSTimer(canvasId, playTime, hwxPBSTimerCallback) {
	var parentCanvasId = canvasId;
    var pCanvasId = parentCanvasId+"_1";
	var mouseCanvasId = parentCanvasId+"_2";
    var curPlayTime = playTime;
    var pHwxPBSTimerCallback = hwxPBSTimerCallback;

    //回掉参数数组
    var callbackArgsArr = new Array();
    //录像状态数组
    var recordedStatusArr = new Array();


    //鼠标左键按下标志
    var mouseDownFlag = 0;
    //鼠标移动标志
    var mouseDownMoveStep = 0;

    //鼠标当前位置
    var mousePosX = 0;
    var mousePosY = 0;
    //鼠标经过标志
    var mouseOverFlag = 0;
    //鼠标单击事件
    var mouseclickFlag = 0;
    var mouseZoomDownFlag = 0;
    //鼠标双击事件标志
    var mousedblclickFlag = 0;
    //鼠标移动方向1 向右 减; 0 向左 加
    var mouseMoveDir = 0;

    //时间字符长占用的像素(经验值)
    var timeStrPixLen = 85;
    //鼠标左键按下时播放时间
    var mouseDownPlayTime = 0;
    var mouseUpPlayTime = 0;

    /*
    60               5 秒钟一个刻度值 (12个)
    1800  30分钟     5 分钟一个刻度值  (6个)
    3600  1小时      10 分钟一个刻度值  (6个)
    86400 24小时     2 小时一个刻度值  (12个)
    */

    //时间宽度表单位是秒
    var timeWidthTbls = new Array(60, 1800, 3600, 86400);
    //时间宽度说明表
    var timeWidthTextTbls = new Array("范围: 1分钟; 单位: 秒", "范围: 30分钟; 单位: 分钟", "范围: 1小时; 单位: 分钟", "范围: 1天; 单位: 小时");
    //拖拽移动步长单位是秒
    var timeWidthStepTbls = new Array(1, 15, 60, 1800);
    var timeWidthMarkTbls = new Array(10, 60, 900, 10800);
    //当前使用的时间宽度索引
    var timeWidthTblIndex = 3;
    var timeWidthTblNum = timeWidthTbls.length;

    //



    //主定时器
    var mainTimer = null;
	var ini_step = 0;
	do{
		//获取浏览器信息
		var browserMatch = getBrowserInfo();
		
		//IE 11.0  8.0
		//调试信息
		var dbgStr = browserMatch.browser+browserMatch.version;


		createCanvasDiv();
		createMouseEventDiv();
	  
		//获取画布
		var myCanvas = document.getElementById(pCanvasId);
		if(myCanvas==null || myCanvas==undefined)
		{
			alert("获取画布" + pCanvasId + "失败!!");
			ini_step++;
			break;
		}
		var myMouseCanvas = document.getElementById(mouseCanvasId);
		if(myMouseCanvas==null || myMouseCanvas==undefined)
		{
			alert("获取鼠标DIV" + mouseCanvasId + "失败!!");
			ini_step++;
			break;
		}
		var myPen = new jsGraphics(pCanvasId);
		if(myPen==null || myPen==undefined)
		{
			alert("创建DIV 画笔失败!!");
			ini_step++;
			break;
		}
		//获取div 宽高
		//var canvasWidth = myCanvas.offsetWidth;
		/*
			说明 offsetWidth 存在为0 的情况,但调试模式下不存原因尚不清楚
		*/
		var canvasWidth = myCanvas.clientWidth;
		if( canvasWidth==undefined || canvasWidth==null || canvasWidth==0)
		{
			alert("获取画布宽失败"+canvasWidth);
			ini_step++;
			break;
		}
		//var canvasHeight = myCanvas.offsetHeight;
		var canvasHeight = myCanvas.clientHeight;
		if(canvasHeight==undefined || canvasHeight==null || canvasHeight==0)
		{
			alert("获取画布高失败");
			ini_step++;
			break;
		}

		
		//录像状态条信息
		var vStatusX = 0;
		var vStatusY = parseInt(canvasHeight / 5) * 4;
		var vStatusWidth = canvasWidth;
		var vStatusHeight = parseInt(canvasHeight / 5) * 1;

	}while(0);

    function createMouseEventDiv() {
		do{
			var parentCanvas = document.getElementById(parentCanvasId);
			if(parentCanvas==null || parentCanvas==undefined)
			{
				alert("getElementById " + parentCanvasId + "错误!" );
				ini_step++;
				break;
			}
			
			var parentWidth = parentCanvas.offsetWidth;
			if(parentWidth==null || parentWidth==undefined)
			{
				alert("获取画布宽失败");
				ini_step++;
				break;
			}
			var parentHeight = parentCanvas.offsetHeight;
			if(parentHeight==null || parentHeight==undefined)
			{
				alert("获取画布高失败");
				ini_step++;
				break;
			}
			var filterStr ='';
			if(browserMatch.browser=='IE' && browserMatch.version <=9.0)
			{
				filterStr = 'filter:alpha(opacity=0);';            //IE9.0以下 版本的区别  支持滤镜
			}
			else
			{
				filterStr = 'opacity: 0;';                          //IE10.0以上 版本的区别
			}
			var htm = '<div id="' + mouseCanvasId + '" style="position:absolute;' +
			'width:' + parentWidth + 'px;' +
			'height:' + parentHeight + 'px;' +
			'background-color:#363636;' +
			filterStr +
			'"><\/div>';
			//alert(htm);
			parentCanvas.insertAdjacentHTML("beforeEnd", htm);
		}while(0);
    }


    function createCanvasDiv () {
		do{
			var parentCanvas = document.getElementById(parentCanvasId);
			if(parentCanvas==null || parentCanvas==undefined)
			{
				alert("getElementById " + parentCanvasId + "错误!" );
				ini_step++;
				break;
			}
			
			var parentWidth = parentCanvas.offsetWidth;
			if(parentWidth==null || parentWidth==undefined)
			{
				alert("获取画布宽失败");
				ini_step++;
				break;
			}
			var parentHeight = parentCanvas.offsetHeight;
			if(parentHeight==null || parentHeight==undefined)
			{
				alert("获取画布高失败");
				ini_step++;
				break;
			}
			var htm = '<div id="' + pCanvasId + '" style="position:absolute;' +
			'width:' + parentWidth + 'px;' +
			'height:' + parentHeight + 'px;' +
			'background-color:#363636;"' +
			'><\/div>';
			//alert(htm);
			parentCanvas.insertAdjacentHTML("beforeEnd", htm);
		}while(0);
    }




    //添加录像状态
    this.addRecordStatus = function (status) {
        if (status == undefined)
            return;
        recordedStatusArr.push(status);
    }
    //清空录像状态
    this.cleanRecordStatus = function () {
        recordedStatusArr.length = 0;
    }
    //更新当前播放时间
    this.updatePlayTimeFunc = function (playTime) {
        if (playTime == undefined)
            return;
        if (mouseDownFlag)
            return;
        curPlayTime = playTime;
    };
    this.cleanPSBTimerFunc = function () {
        clearInterval(this.updatePBSTimerId);
    };
    //设置新的起始时间播放
    function setNewPlayStartTimeCallback() {
        callbackArgsArr.length = 0;
        callbackArgsArr.push(curPlayTime);
        pHwxPBSTimerCallback(hwxPBSTimerCbCmd.ReqPlayTime, callbackArgsArr);
    }


    function isInTimePeriods(time) {
        if (time == undefined)
            return;
        var pNum = 0;
        for (var j = 0; j < recordedStatusArr.length; j++) {
            //大区间
            var recStatus = recordedStatusArr[j];
            //
            if (time >= recStatus.ptimePeriodsArr[0] && time <= recStatus.ptimePeriodsArr[1]) {
                pNum++;
            }
        }

        if (pNum != 0)
            return true;
        else
            return false

    }
    //检查是否超出当前已有的时间区域
    function checkTimePeriods() {
        //时间宽度值 1min ,30min , 1h, 24h
        var timeWidth = timeWidthTbls[timeWidthTblIndex];
        var startTime = curPlayTime - parseInt(timeWidth / 2);
        var endTime = curPlayTime + parseInt(timeWidth / 2);

        var arrSize = recordedStatusArr.length;

        var sNum = 0;
        var eNum = 0;
        var sTime = 0;
        var eTime = 0;

        if (isInTimePeriods(startTime) == false) {
            var date = new Date(startTime * 1000);
            date.setHours(0);
            date.setMinutes(0);
            date.setSeconds(0);

            sTime = parseInt(Date.parse(date) / 1000);
        }

        if (isInTimePeriods(endTime) == false) {
            var date = new Date(endTime * 1000);
            date.setHours(0);
            date.setMinutes(0);
            date.setSeconds(0);

            eTime = parseInt(Date.parse(date) / 1000);
        }

        if (sTime != 0)
            requestNewTimeSpaceStatus(sTime, sTime + 84600)

        if (sTime != eTime) {
            if (eTime != 0)
                requestNewTimeSpaceStatus(eTime, eTime + 84600)
        }
        return;
    }

    function requestNewTimeSpaceStatus(startTime, endTime) {
        if (startTime == undefined || endTime == undefined)
            return;
        callbackArgsArr.length = 0;
        callbackArgsArr.push(startTime);
        callbackArgsArr.push(endTime);

        pHwxPBSTimerCallback(hwxPBSTimerCbCmd.ReqStatusTbls, callbackArgsArr);
    }

	function getBrowserInfo()
	{
		var ua = navigator.userAgent.toLowerCase() ;
		rMsie = /(msie\s|trident.*rv:)([\w.]+)/,     
		rFirefox = /(firefox)\/([\w.]+)/,     
		rOpera = /(opera).+version\/([\w.]+)/,     
		rChrome = /(chrome)\/([\w.]+)/,     
		rSafari = /version\/([\w.]+).*(safari)/;    
		var browser;    
		var version;  
		
		
			var match = rMsie.exec(ua);    
		  if(match != null){ 
		  browser = "IE";
		  version = match[2] || "0";
			return { 
			browser : "IE", version : match[2] || "0" };    
		  }    
		  var match = rFirefox.exec(ua);    
		  if (match != null) {    
			return { browser : match[1] || "", version : match[2] || "0" };    
		  }    
		  var match = rOpera.exec(ua);    
		  if (match != null) {    
			return { browser : match[1] || "", version : match[2] || "0" };    
		  }    
		  var match = rChrome.exec(ua);    
		  if (match != null) {    
			return { browser : match[1] || "", version : match[2] || "0" };    
		  }    
		  var match = rSafari.exec(ua);    
		  if (match != null) {    
			return { browser : match[2] || "", version : match[1] || "0" };    
		  }    
		  if (match != null) {    
			return { browser : "", version : "0" };    
		  }    
	}
	
    /*
        刷新画布
    */
    function CanvasUpdate () {

        /*
        if (mouseDownFlag)
            pause(1000);*/

        myPen.clear();

        drawTimeStrText();

        drawScaleValue();

        drawRecordedStatus();
		
		drawZoomInBtn();
		drawZoomOutBtn();
    }

    //启动定时器
    this.run = function () {
        if (mainTimer == undefined || mainTimer==null)
            mainTimer = setInterval(CanvasUpdate, 100);
    }

    function prun () {
        if (mainTimer == undefined || mainTimer == null)
            mainTimer = setInterval(CanvasUpdate, 100);
    }

    function stop() {
        if (mainTimer != undefined && mainTimer != null) {
            clearInterval(mainTimer);
            mainTimer = null;
        }
    }

    function pause(ms) {
        if (ms == undefined)
            ms = 1000;
        stop();
        setTimeout(prun, ms);
    }


     //文本信息
    function drawTimeStrText() {
        var maxHeight = canvasHeight; 
        var maxWidth = canvasWidth;

        //时间宽度值 1min ,30min , 1h, 24h
        var timeWidth = timeWidthTbls[timeWidthTblIndex];

        var startTime = curPlayTime - parseInt(timeWidth / 2);
        var endTime = curPlayTime + parseInt(timeWidth / 2);



        //鼠标双击事件
        if (mousedblclickFlag) {
            mousedblclickFlag = 0;

            if (mousePosY >= maxHeight / 2) {
                curPlayTime = startTime + parseInt(timeWidth * mousePosX / maxWidth);

                startTime = curPlayTime - parseInt(timeWidth / 2);
                endTime = curPlayTime + parseInt(timeWidth / 2);
                setNewPlayStartTimeCallback();
            }
        }

     
        //文字示例
        //播放时间

        var midTimestrPixLen = 196;

        var date = new Date(curPlayTime * 1000);
        Y = date.getFullYear() + '-';
        M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
        D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';

		
        h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
        m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
        s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());

        var timeStr = Y + M + D + h + m + s;

        myPen.setColor("#FFF68F");
        myPen.setFont('verdana,geneva,helvetica,sans-serif',16, Font.PLAIN);
        myPen.drawString(timeStr, maxWidth / 2 - midTimestrPixLen / 2, 0);
        myPen.paint();

        //画中间播放的刻度线
        myPen.setFont('verdana,geneva,helvetica,sans-serif', 32, Font.PLAIN);

		myPen.setStroke(2);
        myPen.setColor("#FCFCFC");
        myPen.drawLine(maxWidth / 2, maxHeight / 5, maxWidth / 2, maxHeight);
        myPen.paint();
		
		myPen.setStroke(1);

        myPen.setFont('verdana,geneva,helvetica,sans-serif', String.fromCharCode(0x31, 0x32, 0x70, 0x78), Font.PLAIN);


        //当前的时间范围
        myPen.setColor("#FCFCFC");
        myPen.drawString(timeWidthTextTbls[timeWidthTblIndex], maxWidth / 5 * 3, 20);


        //叠加调试信息
        if(dbgStr != undefined && dbgStr.length >0)
        {
            myPen.setColor("#FCFCFC");
            myPen.drawString(dbgStr, 0, 20);
        }






        /*
        var timeStr = timeWidthTextTbls[timeWidthTblIndex];
        context.strokeStyle = "#FCFCFC";
        context.lineWidth = 1.4;
        context.font = "smaller sans-serif";
        context.strokeText(timeStr, maxWidth / 5 * 3, 20);
        */

        timeStrPixLen = 150;

        //当前鼠标位置,对应的时间刻度
        if (mouseOverFlag == 1 && mousePosY >= maxHeight /2) {
           
            var date = new Date((startTime + parseInt(timeWidth * mousePosX / maxWidth)) * 1000);
            Y = date.getFullYear() + '-';
            M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
            D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';

            h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
            m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
            s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());

            var timeStr = Y + M + D + h + m + s;
            var x = mousePosX;

            if (mousePosX + timeStrPixLen > maxWidth)
                x = maxWidth - timeStrPixLen;

            myPen.setColor("#FCFCFC");
            myPen.drawString(timeStr, x, maxHeight/2);
        }
    }

    //画 录像状态条
    function drawRecordedStatus() {
        var rectX = 0;
        var rectW = 0;
        //时间宽度值 1min ,30min , 1h, 24h
        var timeWidth = timeWidthTbls[timeWidthTblIndex];
        var startTime = curPlayTime - parseInt(timeWidth / 2);
        var endTime = curPlayTime + parseInt(timeWidth / 2);
        var maxHeight = canvasHeight;
        var maxWidth = canvasWidth;


        //当前显示区间内录像时间表
        var curSenceTbls = new Array();
        var tblsNum = 0;
        //计算录像区域
        var arrSize = recordedStatusArr.length;

        for (var j = 0; j < arrSize; j++) {
            //大区间
            var recStatus = recordedStatusArr[j];
            if ((startTime >= recStatus.ptimePeriodsArr[0] && startTime <= recStatus.ptimePeriodsArr[1]) || (endTime >= recStatus.ptimePeriodsArr[0] && endTime <= recStatus.ptimePeriodsArr[1])) {
                var recordedTimeTbls = recStatus.precordedTimeTbls;
                for (var i = 0; i < recordedTimeTbls.length; i++) {
                    if (recordedTimeTbls[i][0] < startTime) {
                        if (recordedTimeTbls[i][1] > startTime) {
                            if (recordedTimeTbls[i][1] <= endTime) {
                                curSenceTbls[tblsNum] = new Array(startTime, recordedTimeTbls[i][1]);
                                tblsNum++;
                            }
                            else {
                                curSenceTbls[tblsNum] = new Array(startTime, endTime);
                                tblsNum++;
                            }
                        }
                    }
                    else if (recordedTimeTbls[i][0] >= startTime && recordedTimeTbls[i][0] < endTime) {
                        if (recordedTimeTbls[i][1] <= endTime) {
                            curSenceTbls[tblsNum] = new Array(recordedTimeTbls[i][0], recordedTimeTbls[i][1]);
                            //alert(recordStatusTbls[i][0]+"--"+startTime);
                            tblsNum++;
                        }
                        else {
                            curSenceTbls[tblsNum] = new Array(recordedTimeTbls[i][0], endTime);
                            //alert(recordStatusTbls[i][0]+"--"+recordStatusTbls[i][1]);
                            tblsNum++;
                        }
                    }
                    else {

                    }
                }
            }
        }
        //没有录像
        if (tblsNum <= 0) {
            myPen.setColor("#00EC00");
            myPen.drawString("没有录像", maxWidth / 2, maxHeight / 2);

            myPen.paint();
        }

        for (var i = 0; i < tblsNum; i++) {
            vStatusX = (curSenceTbls[i][0] - startTime) / timeWidth * maxWidth;
            vStatusWidth = (curSenceTbls[i][1] - curSenceTbls[i][0]) / timeWidth * maxWidth;
            myPen.setColor("#00EC00");
            
            /*
            myPen.drawLine(vStatusX, vStatusY, vStatusX + vStatusWidth, vStatusY);
            myPen.drawLine(vStatusX, vStatusY+1, vStatusX + vStatusWidth, vStatusY+1);
            myPen.drawLine(vStatusX, vStatusY+2, vStatusX + vStatusWidth, vStatusY+2);
            myPen.drawLine(vStatusX, vStatusY+3, vStatusX + vStatusWidth, vStatusY+3);
            myPen.drawLine(vStatusX, vStatusY + 4, vStatusX + vStatusWidth, vStatusY + 4);
            */
            myPen.fillRect(vStatusX, vStatusY, vStatusWidth, vStatusHeight-1);

            myPen.paint();
        }
    }

    //画刻度
    function drawScaleValue() {
        //时间宽度值 1min ,30min , 1h, 24h
        var timeWidth = timeWidthTbls[timeWidthTblIndex];
        var startTime = curPlayTime - parseInt(timeWidth / 2);
        var endTime = curPlayTime + parseInt(timeWidth / 2);
        var maxHeight = canvasHeight;
        var maxWidth = canvasWidth;


        //var timeWidthTbls = new Array(60,1800,3600,86400);
        /*
			60               5 秒钟一个刻度值 (12个)
		    1800  30分钟     5 分钟一个刻度值  (6个)
			3600  1小时      10 分钟一个刻度值  (6个)
			86400 24小时     2 小时一个刻度值  (12个)
		*/

        var timeWidth = timeWidthTbls[timeWidthTblIndex];
        var curScale = 0;
        var scaleStrPixlen = 18; //经验值
		var lx,ly;

        switch (timeWidth) {
            case 60:
                var date = new Date(startTime * 1000);
                var startSecond = date.getSeconds();
                for (var i = 0; i < 60; i++) {
                    curScale = startSecond + i;
                    if (curScale >= 60)
                        curScale = curScale - 60;
                    if (curScale % 5 == 0) {
                        //画 刻度值
                        myPen.setColor("#ADADAD");
						if((i * maxWidth / 60 - scaleStrPixlen / 2) >0)
                        myPen.drawString(curScale, i * maxWidth / 60 - scaleStrPixlen / 2, maxHeight /5* 3);
                        myPen.paint();

                        //画 刻度线
                        myPen.setColor("#ADADAD");
                        myPen.drawLine(i * maxWidth / 60, maxHeight / 5 * 4 - 3, i * maxWidth / 60, maxHeight);
                        myPen.paint();

                    }
                }
                break;
            case 1800:
                var date = new Date(startTime * 1000);
                var startHour = date.getHours();
                var startMin = date.getMinutes();
                var startSec = date.getSeconds();

                var curSecOffset = startSec;  //重点

                for (var i = 0; i < 30; i++) {
                    curScale = startMin + i;
                    if (curScale >= 60)
                        curScale = curScale - 60;
                    if (curScale % 5 == 0) {
						lx=(i * 60 - curSecOffset) * maxWidth / 1800;
                        //画 刻度值
                        myPen.setColor("#ADADAD");
						if(lx>=0)
                        myPen.drawString(curScale, lx - scaleStrPixlen / 2, maxHeight /5* 3);
                        myPen.paint();
                        //画 刻度线
                        myPen.setColor("#ADADAD");
						if(lx>=0)
                        myPen.drawLine(lx, maxHeight / 5 * 4 - 3, lx, maxHeight);
                        myPen.paint();
                    }
                }
                break;
            case 3600:
                var date = new Date(startTime * 1000);
                var startHour = date.getHours();
                var startMin = date.getMinutes();
                var startSec = date.getSeconds();

                var curSecOffset = startSec;
                //var curSecOffset = 60- startSec;
                //if(curSecOffset==60)
                //curSecOffset = 0;
                for (var i = 0; i < 60; i++) {
                    curScale = startMin + i;
                    if (curScale >= 60)
                        curScale = curScale - 60;
                    if (curScale % 10 == 0) {
						lx = (i * 60 - curSecOffset) * maxWidth / 3600;
                        //画 刻度值
                        myPen.setColor("#ADADAD");
						if(lx>=0)
                        myPen.drawString(curScale, lx - scaleStrPixlen / 2, maxHeight / 5 *3);
                        myPen.paint();

                        //画 刻度线
                        myPen.setColor("#ADADAD");
						if(lx>=0)
                        myPen.drawLine(lx, maxHeight / 5 * 4 - 3, lx, maxHeight);
                        myPen.paint();
                    }
                }

                break;
            case 86400:
                var date = new Date(startTime * 1000);
                var startHour = date.getHours();
                var startMin = date.getMinutes();
                var startSec = date.getSeconds();
                //var curSecOffset = 3600 - startMin*60- startSec;
                var curSecOffset = startMin * 60 + startSec;
                //if(curSecOffset==3600)
                //curSecOffset = 0;
                for (var i = 0; i < 24; i++) {
                    curScale = startHour + i;
                    if (curScale >= 24)
                        curScale = curScale - 24;
                    if (curScale % 2 == 0) {
                        lx = (i * 3600 - curSecOffset) * maxWidth / 86400;
						//画 刻度值
                        myPen.setColor("#ADADAD");
						if(lx>=0)
							myPen.drawString(curScale, lx - scaleStrPixlen / 2, maxHeight / 5 * 3);
                        myPen.paint();

                        //画 刻度线
                        myPen.setColor("#ADADAD");
						if(lx>=0)
							myPen.drawLine(lx, maxHeight / 5 * 4 - 3, lx, maxHeight);
                        myPen.paint();
                    }
                }
                break;
        }
    }
	//画缩放按钮+
	function drawZoomInBtn(){
		 //时间宽度值 1min ,30min , 1h, 24h
        var timeWidth = timeWidthTbls[timeWidthTblIndex];
        var startTime = curPlayTime - parseInt(timeWidth / 2);
        var endTime = curPlayTime + parseInt(timeWidth / 2);
        var maxHeight = canvasHeight;
        var maxWidth = canvasWidth;
		
		//按钮中心坐标
		var BtnCx = maxWidth/10*9;
		var BtnCy = maxHeight/5;
		var BtnWidth = 20;
		var BtnHeight = 20;
		
		var BtnX = BtnCx - BtnWidth/2 ;
		var BtnY = BtnCy - BtnHeight/2 ;
		
		//画外圈
		myPen.setColor("#4F4F4F");
		myPen.fillRect(BtnX, BtnY, BtnWidth, BtnHeight);
		myPen.paint();
		
		var BtnWidth2 = 14;
		var BtnHeight2 = 14;
		var lineLen = 12;
		
		//动画效果
		if(mouseDownFlag==1){
			if(mousePosX>=BtnX && mousePosX <= BtnX+BtnWidth && 
				mousePosY >=BtnY && mousePosY <= BtnY +BtnHeight){
					BtnWidth2 = 20;
					BtnHeight2 = 20;
					lineLen = 14;
					
					if (timeWidthTblIndex <= 0) {
						timeWidthTblIndex = 0;
					}
					else {
						timeWidthTblIndex--;
					}
					//mouseclickFlag = 0;
				}
		}
		
		var BtnX2 = BtnCx - BtnWidth2/2 ;
		var BtnY2 = BtnCy - BtnHeight2/2 ;
		//画内圈
		myPen.setColor("#6C6C6C");
		myPen.fillRect(BtnX2, BtnY2, BtnWidth2, BtnHeight2);
		myPen.paint();
		
		var lhx1 = BtnCx - lineLen/2-1;
		var lhy1 = BtnCy-1;
		var lhx2 = BtnCx + lineLen/2-1;
		var lhy2 = BtnCy-1;
		
		//画横
		myPen.setStroke(2);
		myPen.setColor("#D0D0D0");
		myPen.drawLine(lhx1, lhy1, lhx2, lhy2);
		myPen.paint();
		
		//画竖
		var lsx1 = BtnCx-1;
		var lsy1 = BtnCy- lineLen/2-1;
		
		var lsx2 = BtnCx-1;
		var lsy2 = BtnCy + lineLen/2-1;

		myPen.setColor("#D0D0D0");
		myPen.drawLine(lsx1, lsy1, lsx2, lsy2);
		myPen.paint();
		
		myPen.setStroke(1);
		
	}
	//画缩放按钮-
	function drawZoomOutBtn(){
		 //时间宽度值 1min ,30min , 1h, 24h
        //时间宽度值 1min ,30min , 1h, 24h
        var timeWidth = timeWidthTbls[timeWidthTblIndex];
        var startTime = curPlayTime - parseInt(timeWidth / 2);
        var endTime = curPlayTime + parseInt(timeWidth / 2);
        var maxHeight = canvasHeight;
        var maxWidth = canvasWidth;
		
		//按钮中心坐标
		var BtnCx = maxWidth/10*9-50;
		var BtnCy = maxHeight/5;
		var BtnWidth = 20;
		var BtnHeight = 20;
		
		var BtnX = BtnCx - BtnWidth/2 ;
		var BtnY = BtnCy - BtnHeight/2 ;
		
		//画外圈
		myPen.setColor("#4F4F4F");
		myPen.fillRect(BtnX, BtnY, BtnWidth, BtnHeight);
		myPen.paint();
		
		var BtnWidth2 = 14;
		var BtnHeight2 = 14;
		var lineLen = 12;
		//动画效果
		if(mouseDownFlag==1){
			if(mousePosX>=BtnX && mousePosX <= BtnX+BtnWidth && 
				mousePosY >=BtnY && mousePosY <= BtnY +BtnHeight){
					BtnWidth2 = 20;
					BtnHeight2 = 20;
					lineLen = 14;
					
					if (timeWidthTblIndex >= (timeWidthTblNum - 1)) {
						timeWidthTblIndex = timeWidthTblNum-1;
					}
					else {
						timeWidthTblIndex++;
					}
					//mouseclickFlag = 0;
				}
		}
		
		var BtnX2 = BtnCx - BtnWidth2/2 ;
		var BtnY2 = BtnCy - BtnHeight2/2 ;
		//画内圈
		myPen.setColor("#6C6C6C");
		myPen.fillRect(BtnX2, BtnY2, BtnWidth2, BtnHeight2);
		myPen.paint();
		
		

		
		var lhx1 = BtnCx - lineLen/2-1;
		var lhy1 = BtnCy;
		var lhx2 = BtnCx + lineLen/2-1;
		var lhy2 = BtnCy;
		
		//画横
		myPen.setStroke(2);
		myPen.setColor("#D0D0D0");
		myPen.drawLine(lhx1, lhy1, lhx2, lhy2);
		myPen.paint();
		myPen.setStroke(1);
	}

    ///
    //鼠标按下事件,这是传统的事件绑定,它非常简单而且稳定,适应不同浏览器.e表示事件,this指向当前元素.
    //但是这样的绑定只会在事件冒泡中运行,捕获不行.一个元素一次只能绑定一个事件函数.
    myMouseCanvas.onmousedown = function (e) {
        var e = window.event || e
        var rect = this.getBoundingClientRect();
        var mouseX = e.clientX - rect.left; //获取鼠标在canvsa中的坐标
        var mouseY = e.clientY - rect.top;

        mouseZoomDownFlag = 1;
        mouseDownFlag = 1;
        mousePosX = mouseX;

        mouseDownPlayTime = curPlayTime;

    }
    //鼠标松开
    myMouseCanvas.onmouseup = function (e) {

        mouseZoomDownFlag = 0;

        if (mouseDownFlag) {
            mouseUpPlayTime = curPlayTime;
            //响应鼠标拖拽状态条
            checkTimePeriods();
            //重新定位开始播放时间

            if (mouseUpPlayTime != mouseDownPlayTime)
                setNewPlayStartTimeCallback();

			//alert("mouse up");
            mouseDownFlag = 0;
        }
    };

    //鼠标移动
    myMouseCanvas.onmousemove = function (e) {
        var e = window.event || e
        var rect = this.getBoundingClientRect();
        var mouseX = e.clientX - rect.left; //获取鼠标在canvsa中的坐标
        var mouseY = e.clientY - rect.top;


        //dbgStr = "鼠标状态:" + mouseDownFlag + "鼠标坐标:" + mouseX + "," + mouseY;

        //鼠标按下状态
        if (mouseDownFlag) {
            //alert("Mouse draging");
            if (mousePosX - mouseX > 0) {
                mouseMoveDir = 1;
                mouseDownMoveStep = Math.abs(mousePosX - mouseX);
                if (mouseDownMoveStep >= 2) {
                    mousePosX = mouseX;
                    curPlayTime = curPlayTime + timeWidthStepTbls[timeWidthTblIndex];
                    //alert("Mouse left step:"+ mouseDownMoveStep);
                }
            }
            else {
                mouseMoveDir = 0;
                mouseDownMoveStep = Math.abs(mousePosX - mouseX);
                if (mouseDownMoveStep >= 2) {
                    mousePosX = mouseX;
                    curPlayTime = curPlayTime - timeWidthStepTbls[timeWidthTblIndex];
                    //alert("Mouse right step:"+ mouseDownMoveStep);
                }
            }
        }
        //鼠标移动
        mouseOverFlag = 1;
        mousePosX = mouseX;
        mousePosY = mouseY;

    }
    //鼠标移出区域
    myMouseCanvas.onmouseout = function (e) {
        //mouseDownFlag = 0;
        //mouseOverFlag = 0;
        //alert("Mouse out");
    }
    //鼠标进去区域
    myMouseCanvas.onmouseover = function (e) {
        var e = window.event || e
        var rect = this.getBoundingClientRect();
        var mouseX = e.clientX - rect.left; //获取鼠标在canvsa中的坐标
        var mouseY = e.clientY - rect.top;

        mouseOverFlag = 1;
        mousePosX = mouseX;
        mousePosY = mouseY;

        //mouseDownFlag = 0;
        //alert("Mouse in");
        this.style.cursor = "pointer";
    }
    myMouseCanvas.onmousewheel = function (e) {
        //alert("Mouse wheel");
        
        if (e == undefined)
            e = window.event; // old IE support  

        var delta = e.wheelDelta / 120;

        if (delta > 0) {
            if (timeWidthTblIndex >= (timeWidthTblNum - 1)) {
                timeWidthTblIndex = timeWidthTblNum-1;
            }
            else {
                timeWidthTblIndex++;
            }
        }
        else {
            if (timeWidthTblIndex <=0) {
                timeWidthTblIndex = 0;
            }
            else {
                timeWidthTblIndex--;
            }
        }
    }
    //单击事件
    myMouseCanvas.onclick = function (e) {
        var e = window.event || e
        var rect = this.getBoundingClientRect();
        var mouseX = e.clientX - rect.left; //获取鼠标在canvsa中的坐标
        var mouseY = e.clientY - rect.top;

        mousePosX = mouseX;
        mousePosY = mouseY;

        mouseclickFlag = 1;

        //alert("click");
    }

    /*
        双击事件在进度条上时获取不到,信号
        处理方法,添加一层透明的div 于最上层 用于捕获鼠标事件
    */
    //双击事件
    myMouseCanvas.ondblclick = function (e) {
        var e = window.event || e
        var rect = this.getBoundingClientRect();
        var mouseX = e.clientX - rect.left; //获取鼠标在canvsa中的坐标
        var mouseY = e.clientY - rect.top;

        mousePosX = mouseX;
        mousePosY = mouseY;

        mousedblclickFlag = 1;

      //  alert("double click");
    }


}

测试结果:

 


 

完整的项目下载路径:

http://download.csdn.net/detail/zhujinghao09/9634299

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 HTML 的 ```<progress>``` 标签来实现原生的进度条。首先,在 HTML 中创建一个 ```<progress>``` 标签,并给它设置一个初始值和最大值。然后,使用 JavaScript 来更新进度条的值。下面是一个简单的示例: ```HTML <progress id="myProgress" value="0" max="100"></progress> ``` ```JavaScript var progressBar = document.getElementById("myProgress"); function updateProgress(newValue) { progressBar.value = newValue; } ``` 在这个例子中,我们通过调用 ```updateProgress(newValue)``` 函数来更新进度条的值。 另外可以使用 css 去修饰进度条的样式,例如背景颜色,大小等。 ### 回答2: 要实现一个进度条,可以使用JavaScript原生的方式操作DOM元素来实现。 首先,在HTML中创建一个包含进度条的容器元素,例如一个div元素,给它一个唯一的id,方便在JavaScript中操作。如下所示: ```html <div id="progress-bar"></div> ``` 然后,在JavaScript中获取该容器元素,并设置它的样式,包括宽度和背景颜色等,表示进度条的外观。可以使用style属性来设置样式。如下所示: ```javascript var progressBar = document.getElementById('progress-bar'); progressBar.style.width = '0%'; progressBar.style.backgroundColor = '#00FF00'; ``` 接着,定义一个函数用于更新进度条进度。该函数的参数可以是表示进度的数值,例如进度的百分比。在函数中,通过修改进度条容器元素的宽度来改变进度条进度。如下所示: ```javascript function updateProgressBar(progress) { progressBar.style.width = progress + '%'; } ``` 最后,在其他地方调用updateProgressBar函数,传入不同的进度值,即可实现进度条的动态更新。例如,可以使用定时器模拟进度的增长。如下所示: ```javascript var progress = 0; var timer = setInterval(function() { progress += 10; // 每次增加10% if (progress >= 100) { clearInterval(timer); // 达到100%时停止定时器 } updateProgressBar(progress); }, 1000); ``` 以上就是使用JavaScript原生实现一个简单的进度条的方法。根据需要可以进行样式、动画等更多的定制和改进。 ### 回答3: 进度条是一种常见的页面元素,可以用来显示任务的进展情况或者加载的进度。在JavaScript中,我们可以通过一些方式来实现一个进度条。 一种简单的方式是利用CSS和JavaScript的动态改变元素样式来实现进度条的效果。首先,在HTML中定义一个容器元素,作为进度条的外框。然后使用CSS样式将其设置为合适的大小、颜色和形状。接着,使用JavaScript获取任务进展的百分比,并根据百分比来改变进度条的宽度,从而显示当前任务的进展情况。 HTML部分: ```html <div id="progress-bar"></div> ``` CSS部分: ```css #progress-bar { width: 0%; height: 20px; background-color: blue; transition: width 0.5s ease-in-out; } ``` JavaScript部分: ```javascript // 获取任务进展的百分比 var progress = 50; // 假设任务已完成50% // 获取进度条元素 var progressBar = document.getElementById('progress-bar'); // 根据任务进展的百分比来设置进度条的宽度 progressBar.style.width = progress + '%'; ``` 这样,当进度为50%时,进度条的宽度会动态地改变为50%。当任务进展更新时,只需要更新`progress`的值,再次执行`progressBar.style.width = progress + '%'`来实现进度条的更新。 以上是一个简单的使用原生JavaScript实现进度条的方法,当然,如果需要更加复杂的效果和功能,可以使用一些库或框架(如Bootstrap、jQuery等)来辅助实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值