js实现给图片做标注

效果图:


image.png

js代码

window.onload = function() {//页面一加载调用
            bindEvent();
            loadMark();
            document.getElementById("clearpin").addEventListener("click", function() {//点击清除按钮
                clearMark();
            });
            
            var container = getid('container');
            console.log("container:", container)
            var reg = new RegExp('"',"g");
            var map = document.getElementById("map");
            var canvasNew = document.createElement('canvas');
            var Newimage  = document.createElement('img');
            var context   = canvasNew.getContext('2d');
            var imgData   = localStorage.getItem('pdfsaveimg');
            var pdfPageIndex = localStorage.getItem('pageindex');
            var canvasWidth  = localStorage.getItem('imgWidth');
            var canvasHeight = localStorage.getItem('imgHeight');
            console.log("pdfPageIndex", pdfPageIndex);
            console.log("Width, Height", canvasWidth, canvasHeight);
            console.log("canvasNew", canvasNew);
            Newimage.src = imgData;
            container.style.width  = canvasWidth + 'px'
            container.style.height = canvasHeight + 'px'
            container.style.margin = "40px auto"
            map.appendChild(Newimage);
        };

        var arr = [];
        var mark = {}; //创建一个对象,
        function getid(id) { //封装函数,通过id获取该id的html标签对象
            return document.getElementById(id);
        }
        function getOffset(obj) {//封装坐标函数
            var x = 0,
                y = 0;
            while(obj) {
                x += obj.offsetLeft;//offsetLeft返回的就是元素距离父元素左边的距离,单位是像素
                y += obj.offsetTop;//offsetTop返回的就是元素距离父元素上边的距离,单位是像素
                obj = obj.offsetParent;//指定的父元素
            }
            return {//返回x和y的坐标
                x: x,
                y: y
            };
        }

        function addMark(p, x, y, text_val, index) {//封装创建小红点和输入文字内容的函数
            var div = document.createElement("div");//创建div元素
            div.id = "mark" + index;//给div元素添加id
            div.className = "mark";//给div元素添加class
            div.style.left = x + "px";//div的css属性
            div.style.top = y + "px";
            p.appendChild(div);//把这个div元素追加到传过来的元素的下面
            var content_p = document.createElement("p");
            content_p.className = "content_p";
            console.log("text_val::" + text_val);
            content_p.innerHTML = text_val;//给p标签添加内容
            content_p.id = "content_p" + index;
            content_p.style.left = x + "px";
            content_p.style.top = y + "px";
            p.appendChild(content_p);

        }

        function addInput(p, x, y, index) {//封装创建输入框和确认按钮的函数
            var div = document.createElement("div");
            div.id = "input_div" + index;
            div.className = "mark_input";
            div.style.left = x + 5 + "px";
            div.style.top = y + "px";
            var inp = document.createElement("input");
            inp.id = "mark_input";
            inp.className = "text_input";
            inp.type = "text";
            inp.value = "";
            var inp2 = document.createElement("input");
            inp2.id = "sub_input";
            inp2.className = "sub_input";
            inp2.type = "submit";
            inp2.value = "OK";
            div.appendChild(inp);
            div.appendChild(inp2);
            p.appendChild(div);
            console.log(div)
        }

        function bindEvent() {
            getid("map").onclick = function(oEvent) {    //点击图片时调用
                    console.log(arr);
                oEvent = oEvent || event;
                var container = getid("container");
                var offset = getOffset(container);      //调用getOffset函数
                console.log(offset.y);
                console.log(oEvent.clientY);
                var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
                console.log(scrollTop);  
                var x = oEvent.clientX - offset.x;      //用浏览器窗口的可视区域减去getOffset函数返回的x值
                var y = oEvent.clientY - offset.y + scrollTop;
                addInput(container, x, y, arr.length);
                var i = arr.length;
                getid("sub_input").onclick = function() {//点击确认按钮时调用
                     console.log(arr);
                    text_val = getid("mark_input").value;//输入框内容
                    container.removeChild(getid("input_div" + i));//删除container元素下面的input_div
                    console.log(text_val);
                    addMark(container, x, y, text_val, arr.length);//创建内容
                    mark.x = x;
                    mark.y = y;
                    mark.text_val = text_val;
                    arr = sessionStorage['arr']   //获取本地存储里面的值
                    if(arr !='' && arr != undefined){
                        arr = JSON.parse(arr)
                    }else{
                            arr = [];
                           console.log('本地存储没有值')
                    }
                    console.log(mark)
                    arr.push(mark);//把x,y坐标和文字内容放到数组里面
                    console.log(arr);
                    saveMark();//调用本地存储的函数

                }

            };

        }
        
        function saveMark() {//封装本地存储的函数
            arr = JSON.stringify(arr);
            console.log('保存至对话存储', arr);
            sessionStorage['arr'] = arr;
            pin_ajax();
        }

        function loadMark() {//页面一加载的时候调用这个函数
            var arr = sessionStorage['arr']//获取本地存储里面的值
            if(arr !='' && arr != undefined){
                console.log(arr)
                arr = JSON.parse(arr)
            }else{
                    arr = [];
                   console.log('本地存储没有值')
            }
            console.log(arr)
            if(arr) {//判断本地存储里面是否有值
                var container = getid("container");
                for(var i = 0; i < arr.length; i++) {
                    console.log(arr[i])
                    addMark(container, arr[i].x, arr[i].y, arr[i].text_val, i);//在页面上创建和本地存储对应的内容
                }
            }
        }

        function clearMark() {//点击清楚标记时调用
            arr = sessionStorage['arr']   //获取本地存储里面的值
            if(arr !='' && arr != undefined){
                arr = JSON.parse(arr)
            }
            if(arr.length === 0) {
                alert('标记已全部清除')
            } else {
                var container = getid("container");
                var i = arr.length - 1;
                console.log(i);
                container.removeChild(getid("mark" + i));
                container.removeChild(getid("content_p" + i));
                arr.length = arr.length - 1;
                saveMark();
            }

        }
}

以下是html代码

<div class="bg">
         <div id="container" >
            <div id="map">
                
            </div>
         </div>
    </div>

以下是css代码

* {
            margin: 0;
            padding: 0;
        }
        
        #container {
            position: relative;
            margin-left: 20px;
            margin-top: 30px;
            width: 1200px;
            height: 800px;
            border: 1px solid #CCC;
            overflow: hidden;
        }
        
        #map {
            position: absolute;
        }
        
        .mark {
            position: absolute;
            width: 20px;
            height: 20px;
            font-size: 0px;
            background: url("/img/td.png") no-repeat left center;
            background-size:100% ;
        }
        
        .mark_input {
            position: absolute;
        }
        
        .content_p {
            position: absolute;
            height: 20px;
            line-height: 20px;
            margin-top: -7px;
            margin-left: 22px;
            padding:3px 10px 23px 10px;
            border: 1px solid blue;
            background-color: #fff;
        }
        #clear{
            margin-left: 50px;
        }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1 Webpack 1.1 概念简介 1.1.1 WebPack是什么 1、一个打包工具 2、一个模块加载工具 3...
    Kevin_Junbaozi阅读 6,629评论 0 16
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • 几年前,我一直坚信一句话,想做什么就去做吧。即使有时候过程很坎坷,可是你遵从内心,脚步是动着的,长久下去,你一定会...
    Curtain_1c96阅读 501评论 0 1
  • 推荐书籍——《向前一步》谢丽尔·桑德伯格 今天的晨读文章让我想到以前经常阅读的杂志——《悦己》,这本杂志的理念和今...
    清野拾梦阅读 516评论 3 7
  • 初恋的味道,有一股清濛味,酸酸的、甜甜的。 喜欢一个人,很简单,每天能见到他就能高兴一整天。 看到他和别的女生玩得...
    如画的日常阅读 533评论 6 11