在图片上用热点(map area)做弹出层(tips)

探讨并解决了使用http://onehackoranother.com/projects/jquery/tipsy/#options时出现的定位不准问题,最终通过切换到http://craigsworks.com/projects/qtip/docs/reference/#position-corner找到了合适的解决方案。

我开始用http://onehackoranother.com/projects/jquery/tipsy/#options,发现定位不准,

后面改:http://craigsworks.com/projects/qtip/docs/reference/#position-corner

转载于:https://my.oschina.net/deanzhao/blog/112820

function btn_opt_handle(id){ switch(id){ case 'opt-pager': optionRealPaging(); break; case 'opt-text-pager': textPager(); break; case 'opt-monitor': let ids = selectDeviceID(); if(ids.length > 1){ msgShow('select-device-only'); break; }else if(ids.length === 0){ msgShow('not-select-devices'); break; } let dev = getDevice(ids[0]); if(dev !== undefined) playCamera(dev.vid); break; case 'opt-listen': if($('#top-opt-listen .top-button-icon').hasClass('text-color-warning')){ httpPOST('device/monitor/stop', {}, function(r){ msgShow('operation-success'); $('#top-opt-listen .top-button-icon').removeClass('text-color-warning'); }, function(r){ $('#top-opt-listen .top-button-icon').removeClass('text-color-warning'); return 0 }); }else{ let ids = selectDeviceID(); if(ids.length > 1){ msgShow('select-device-only'); break; }else if(ids.length === 0){ msgShow('not-select-devices'); break; } httpPOST('device/monitor/start', {deviceID: ids[0]}, function(r){ $('#top-opt-listen .top-button-icon').addClass('text-color-warning') msgShow('operation-success'); }); } break; case 'opt-SPC': selectDeviceCtrlSPC(); break; case 'opt-search': searchDeviceRender(); break; case 'opt-intercom': break; case 'opt-alarm': weatherAlarmConfig() break; case 'opt-map': electronicMapConfig(); break; case 'opt-offlinemap': offlineMapConfig(); break; case 'opt-dashboard': electronicDashboard(); break; case 'opt-adap':{ let devids = selectDeviceID(); if(devids.length > 1){ msgShow('select-device-only'); break; }else if(devids.length === 0){ msgShow('not-select-devices'); break; } adap_control(devids[0]); } break; case 'opt-factory-debug': dialog_factory_network(); break; case 'opt-select-all': selectAll(); break; } } function opt_handle(id, title='unknown'){ let subWinData={ type: 2, title: title, area: ['90%', (getDefaultHeight() - 150) + 'px'], fixed: false, //不固定 maxmin: false, resize: false, shadeClose: true, success: subWinSuccess, end: ()=>{ ws.iframeCb['system/task/list/refresh'] = undefined; ws.iframeCb['terminal/upgrade/status'] = undefined; ws.iframeCb['terminal/timer/sync/status'] = undefined; ws.iframeCb['sip/event/notice'] = undefined; ws.iframeCb['system/service/ping'] = undefined; ws.iframeCb['device/update'] = undefined; ws.iframeCb['terminal/sip/plan'] = undefined; ws.iframeCb['system/sync/refresh'] = undefined; }, }; if(id === 'opt-play'){ playSong($('.audio-list-active .current')); }else if(id === 'opt-media'){ subWinData.content = 'media.html'; layer.open(subWinData); }else if(id === 'opt-stop'){ let d={}; d['devices'] = selectDeviceID(); if(d.devices.length > 0) httpPOST('music/song/stop', d); else msgShow('not-select-devices'); }else if(id === 'opt-tasks'){ subWinData.content = 'tasks.html'; layer.open(subWinData); }else if(id === 'opt-group'){ subWinData.content = 'groups.html'; layer.open(subWinData); }else if(id === 'opt-schemes'){ subWinData.area = ['95%', (getDefaultHeight() - 80) + 'px']; subWinData.content = 'schemes.html'; layer.open(subWinData); }else if(id === 'opt-devices'){ subWinData.area = ['95%', (getDefaultHeight() - 80) + 'px']; subWinData.content = 'devices.html'; layer.open(subWinData); }else if(id === 'opt-intercom'){ subWinData.content = 'intercom.html'; layer.open(subWinData); }else if(id === 'opt-alert'){ httpGet('system/alarm/start', function(r){ if(r.started === 0){ layer.confirm('确定所有设备进入消防状态?', function(index){ httpPOST('system/alarm/start',{userID: parseInt($('#top-opt-user').attr('user-id'))},function(r){ layer.msg("设置成功", {icon: 1, time: 800}, function(){ }); }, function(r){ if(r.code === 610){ layer.confirm('当前消防状态已启动是否停止?', function(index1){ httpPOST('system/alarm/stop',{userID: parseInt($('#top-opt-user').attr('user-id'))}); layer.close(index1); }) }else{ httpResponseCheck(r.code) } return 0; }); layer.close(index); }); return; }else{ layer.confirm('当前消防状态已启动是否停止?', function(index1){ httpPOST('system/alarm/stop',{userID: parseInt($('#top-opt-user').attr('user-id'))}); layer.close(index1); }) } }) }else if(id === 'opt-bullying'){ subWinData.content = 'bullying.html'; subWinData.area = ['95%', (getDefaultHeight() - 80) + 'px']; layer.open(subWinData); }else if(id === 'opt-patrol'){ subWinData.content = 'patrol.html'; subWinData.area = ['95%', (getDefaultHeight() - 80) + 'px']; layer.open(subWinData); }else if(id === 'opt-logout'){ layer.confirm('确定注销登录?', function(index){ httplogout(parseInt($('#top-opt-user').attr('user-id'))); layer.close(index); }); }else if(id === 'opt-settings'){ subWinData.content = 'settings.html'; subWinData.area = ['95%', (getDefaultHeight() - 80) + 'px']; layer.open(subWinData); }else if(id === 'opt-video'){ subWinData.content = 'video.html'; subWinData.area = ['95%', (getDefaultHeight() - 80) + 'px']; layer.open(subWinData); }else{ btn_opt_handle(id); } } function more_func_init(){ let def_cfgs=[{ title: '防欺凌' ,templet: '<i class="mdi mdi-run-fast icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,enable: getEnableFuncTable().bully ,click: function(obj){ opt_handle('opt-bullying', obj.title) } },{ title: '定时巡更' ,templet: '<i class="mdi mdi-clipboard-text-search-outline icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,enable: getEnableFuncTable().patrol ,click: function(obj){ opt_handle('opt-patrol', obj.title) } },{ title: '监控' ,templet: '<i class="fa fa-video-camera icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,enable: getEnableFuncTable().mediamtx ,click: function(obj){ opt_handle('opt-monitor', obj.title) } },{ title: '视频管理' ,templet: '<i class="mdi mdi-webcam icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,enable: getEnableFuncTable().mediamtx ,click: function(obj){ opt_handle('opt-video', obj.title) } },{ title: '气象预警' ,templet: '<i class="fa ion-fireball icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,enable: getEnableFuncTable().alarm ,click: function(obj){ opt_handle('opt-alarm', obj.title) } },{ title: '电子地图' ,templet: '<i class="mdi mdi-map-marker-radius-outline icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,enable: getEnableFuncTable().offlineMap ,click: function(obj){ opt_handle('opt-offlinemap', obj.title) } },{ title: 'AI自适应' ,templet: '<i class="mdi mdi-refresh-auto icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,enable: getEnableFuncTable().volAdap ,click: function(obj){ opt_handle('opt-adap', obj.title) } },{ title: '数据监控' ,templet: '<i class="mdi mdi-monitor-dashboard icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,enable: getEnableFuncTable().dashboard ,click: function(obj){ opt_handle('opt-dashboard', obj.title) } },{ title: '退出' ,templet: '<i class="fa fa-sign-out icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,click: function(obj){ opt_handle('opt-logout', obj.title) } }]; let cfgs = []; for(var i in def_cfgs){ if(def_cfgs[i].enable === undefined || def_cfgs[i].enable === 1){ cfgs.push(def_cfgs[i]); } } layui.dropdown.render({ elem: '.btn-opt-more-func' ,trigger: 'hover'//'hover' ,className: 'opt-more-func-dropdown' ,id: 'more-func' ,align: 'left' ,data: cfgs ,click: function(obj, othis){ obj.click(obj) } ,ready: function(elemView, elem, target){ let elemRect = document.getElementById("opt-more-func").getBoundingClientRect(); let elemHeight = parseInt($(elemView).css('height'), 10); let windowHeight = window.innerHeight; let topPosition = elemRect.top; if (topPosition + elemHeight > windowHeight - 120) { topPosition = windowHeight - 120 - elemHeight; } $(elemView).css({ top: topPosition + "px", left: (elemRect.right + 30) + "px" }); } }); } $(document).ready(function(){ notice_list_show_init() // $('.zone-box').sortable({ // update: function(event, ui){ // let data = []; // $('.zone-box').each(function(){ // let id = $(this).attr('id'); // let name = $(this).find('.zone-name').text(); // let devs = []; // $(this).find('.device-box').each(function(){ // let did = $(this).attr('id'); // devs.push(did); // }) // console.log(id, name, devs) // }) // } // }); request_system_time(); update_user_info(); device_type_list_update(); playListUpdate(); groupListUpdate(devicesListUpdate); wsConnect(); // timer_list_render(); timer_info_show(); refresh_user_listen_status(); more_func_init(); $('.opt-button').click(function(){ opt_handle($(this).attr('id'), $(this).find("span").text()) }); var Tvol; slider_theme = getComputedStyle(document.documentElement).getPropertyValue('--master-color'); slider_sta = layui.slider.render({ elem: '#slider-volume-box' // ,input: true //输入框 ,theme: slider_theme //主题色 ,value: 50 //初始值 ,min: 0 //最小值 ,max: 100 //最大值 ,tips: false ,change: function (val) { $('.slider-volume-value').text(val+'%'); slider_cur_val = val; if(volFakeSet){ volFakeSet=0; return; } clearTimeout(Tvol); Tvol = setTimeout(function(){ let u='device/update'; let sltIDS; sltIDS = selectDeviceID(); if(sltIDS.length === 0){ msgShow('not-select-devices'); return; } let ids=[]; for(var i in sltIDS){ ids.push({id: sltIDS[i], vol: val}); } httpPOST(u,{list:ids},function(r){ }); }, 200); } }); function newuserClose(index){ $('.user-content').css("display","none"); } function chpassSubmit(idx){ var oldpass = $('#oldpass').val(); var newpass = $('#newpass').val(); var u={ id: parseInt($('input[type="text"][name="user-text"]').attr('id')) ,oldpass: $.md5(oldpass) ,newpass: $.md5(newpass) } var npass = $('#ag-newpass').val(); if(oldpass.length < 4||newpass.length < 4||npass.length < 4){ layer.msg('密码长度小于4个字符'); return; } if(oldpass.length > 16||newpass.length > 16||npass.length > 16){ layer.msg('密码长度大于16个字符'); return; } if(npass !== newpass){ layer.msg('新密码输入不一致'); return; } httpPOST('system/user/password/update', u, function(r){ layer.msg('修改成功!', {icon: 1, time: 800}, function(){ layer.close(idx); }); }, function(r){ if(r.code===605){ layer.msg('用户不存在'); return 0; } if(r.code===602){ layer.msg('原始密码不正确'); return 0; } }); } function chpassDialog(user){ layer.open({ type: 1 //Page类型 ,area: ['400px', '380px'] ,title: '修改用户密码' ,shade: 0.6 //遮罩透明度 ,anim: 0 //0-6的动画形式,-1不开启 ,btn: ['确认', '取消'] ,closeBtn: 0 ,btnAlign: 'c' ,moveType: 1 //拖拽模式,0或者1 ,id: 'chpassDialog' ,content: $('.user-content') ,btn1: chpassSubmit ,btn2: newuserClose ,end: newuserClose ,success: function(layero){ $('.user-content').html($('#ch-pass').html()); $('input[type="text"][name="user-text"]').attr('id', user.id); $('input[type="text"][name="user-text"]').val(user.name); layui.form.render(); } }); } //自定义事件 - hover layui.dropdown.render({ elem: '#top-opt-user' ,trigger: 'hover'//'hover' ,className: 'user-dropdown' ,data: [{ title: '基本信息' ,templet: '<i class="fa fa-info icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,id: 1001 },{ title: '修改密码' ,templet: '<i class="fa fa-lock icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,id: 1002 },{ title: '退出' ,templet: '<i class="fa fa-sign-out icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,id: 1004 }] ,click: function(obj){ switch(obj.id){ case 1001: httpGet('system/user/list?id=' + $('#top-opt-user').attr('user-id'), function (j) { layer.open({ type: 1, title: '用户信息', area: ['420px', '420px'], fixed: false, //不固定 maxmin: false, resize: false, content: $('.user-info-box'), shadeClose: true, success: function(layero, index){ $('.user-info-box').html($('#user-info-content').html()); $('.text-user-name').text(cutString(j.name, 18)); $('.text-user-online').text(j.onlineTime); $('.text-user-playmode').text(playModeName(j.playMode)); if(j.monitor.monitID === 0 || j.monitor.monitID < 0) $('.text-user-monitor-device').text('未设置'); else $('.text-user-monitor-device').text(j.monitor.monitID + '(' + j.monitor.deviceName + ')'); if(j.aorsMax >= 9999){ $('.text-user-connection').text( j.aors.length + '/无限制'); }else{ $('.text-user-connection').text( j.aors.length + '/' + j.aorsMax); } $('.text-user-pager-vol').text(j.pagerVol); $('.text-user-type').text(j.permissions.super==1?'管理员':'普通用户'); $('.text-user-ip').text(j.ip); } }); }) break; case 1002: chpassDialog({id: $('#top-opt-user').attr('user-id'), name: getLocalLoginName()}); break; case 1003: break; case 1004: layer.confirm('确定注销登录?', function(index){ httplogout(parseInt($('#top-opt-user').attr('user-id'))); layer.close(index); }); break; default: break; } } ,ready: function(elemView, elem, target){ $(elemView).css({ left: "50px" }); } }); layui.dropdown.render({ elem: '.play-mode-opt' ,trigger: 'hover'//'hover' ,className: 'play-mode-dropdown' ,data: [{ title: '单曲播放' ,templet: '<i class="mdi mdi-numeric-1-box-multiple-outline icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,id: 101 },{ title: '单曲循环' ,templet: '<i class="mdi mdi-repeat-once icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,id: 102 },{ title: '顺序播放' ,templet: '<i class="mdi mdi-shuffle-disabled icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,id: 103 },{ title: '列表循环' ,templet: '<i class="mdi mdi-repeat icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,id: 104 },{ title: '随机播放' ,templet: '<i class="mdi mdi-shuffle-variant icon-card-dropdown"></i><span class="card-dropdown-title">{{d.title}}</span>' ,id: 105 }] ,click: function(obj, othis){ httpPOST('system/play/mode',{mode: obj.id - 100}, function(r){ uiSetPlayMode(r.mode); }); } ,ready: function(elemView, elem, target){ } }); httpGet('system/play/mode', function(r){ uiSetPlayMode(r.mode); }); $(".zone-search-input").keyup(function(){ if(card_list == null){ devicesListUpdate(); }else{ if(!isShowGroup()) devicesBoxReload(card_list); } if(group_card_list === null){ groupListUpdate(); }else{ if(isShowGroup()) groupsBoxReload(group_card_list); } }); $('.switch-box #show-group').click(function(){ if(isShowGroup()) groupListUpdate(); else devicesListUpdate(); }); $('.switch-box #show-online').click(function(){ if(isShowGroup()) groupListUpdate(); else devicesListUpdate(); }); logoClick_timer = null; logoClick_cnt=0; $('.logo-background').click(function(e){ if(logoClick_timer !== null ) clearTimeout(logoClick_timer); logoClick_cnt++; if(logoClick_cnt>10){ layer.confirm('上传logo图片?', function(index){ $('#uploadLogoFile').click(); layer.close(index) }) } logoClick_timer = setTimeout(function(){ logoClick_cnt=0; }, 200); }); layui.upload.render({ elem: '#uploadLogoFile' ,url: httpAddress() + 'system/upload/logo' ,headers: getLayuiHttpReqHeaders() ,auto: true ,accept: 'images' ,exts: 'png|jpg|jpeg' ,size: 100 ,before: function(obj){ layer.msg('上传中', {icon: 16, time: 0}); return true; } ,done: function(res){ if(res.code == 200){ layer.msg('上传成功', {icon: 1}); }else{ layer.msg('上传失败 :'+res.code, {icon: 2}); } } ,error: function(){ layer.msg('上传失败', {icon: 2, time: 800}); } }); });全部写注释,每一行
最新发布
07-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值