关于html5 通讯录功能
我们手机端的通讯录是用的技术html5 sqlite 加上jquery 实现单机缓存功能 头像是用base 64 进行渲染
/*************************************/ /* Helman, heldes.com */ /* helman at heldes dot com */ /* sqlitedb.js */ /* SQLite Database Class For HTML5 */ /*************************************/ function cDB(confs){ var ret = { _db: null, _response: null, _error: null, check : function(tbl){ if(!this._db) return false; var _sql = ‘‘, _sqlField=‘‘, _field=[]; for(var i=0;i<tbl.length;i++){ _sql = "CREATE TABLE IF NOT EXISTS "+tbl[i].table+" ("; _field = tbl[i].properties; _sqlField = ‘‘; for (var j=0;j<_field.length;j++){ _sqlField += ‘,`‘+_field[j].name+‘` ‘+_field[j].type; } _sql += _sqlField.substr(1)+");"; this.query(_sql,null,null,null); } return true; }, getResult:function(){ return this._response; }, getError:function(){ return this._error; }, callback_error: function(tx,_er){ var err = ‘‘; if(typeof(tx) == ‘object‘){ for(var q in tx){ err += q+‘ = "‘+tx[q]+‘"; ‘; } }else{ err += tx+‘; ‘; } if(typeof(_er) == ‘object‘){ for(var q in _er){ err += q+‘ = "‘+_er[q]+‘"; ‘; } }else if(typeof(_er) == ‘undefined‘){ err += _er+‘; ‘; } console.log(err); //if(callback) callback(); return false; }, query: function(sql,callback,params,er){ if(!this._db) return false; var self = this; function _er(tx,__er){ __er = jQuery.extend(__er,{sql:sql}); if(er) er(tx,__er); else self.callback_error(tx,__er); }; this._db.transaction(function(tx){ tx.executeSql(sql,(params?params:[]),callback,_er); }, _er); }, update:function(tbl,sets,clauses,callback){ var __sql = ‘UPDATE ‘+tbl, _field = null, __set = ‘‘, __clause = ‘‘,__values=[]; for(var i=0;i<sets.length;i++){0 _field = sets[i]; for(var j=0;j<_field.length;j++){ __set += ‘,`‘+_field[j].name+‘`=?‘; __values.push(_field[j].value); } } for(var i=0;i<clauses.length;i++){ __clause += ‘,`‘+clauses[i].name+‘`=?‘; __values.push(clauses[i].value); } __sql += ((__set!=‘‘)?‘ SET ‘+__set.substr(1):‘‘)+((__clause!=‘‘)?‘ WHERE ‘+__clause.substr(1):‘‘)+‘;‘; this.query(__sql,callback,__values); return true; }, remove:function(tbl,clauses){ var __sql = ‘DELETE FROM ‘+tbl, __clause = ‘‘; for(var i=0;i<clauses.length;i++) __clause += ‘,`‘+clauses[i].name+‘`="‘+escape(clauses[i].value)+‘"‘; __sql += ‘ WHERE ‘+((__clause!=‘‘)?__clause.substr(1):‘FALSE‘)+‘;‘; this.query(__sql); return true; }, multiInsert: function(tbl,rows,callback,er){ if(!this._db) return false; var self = this; var __sql = ‘‘, _field = null, __field = ‘‘, __qs = [], __values = []; this._db.transaction(function(tx){ for(var i=0;i<rows.length;i++){ __qs = []; __values = []; __field = ‘‘; _field = rows[i]; for(var j=0;j<_field.length;j++){ __field += ‘,`‘+_field[j].name+‘`‘; __qs.push(‘?‘); __values.push(_field[j].value); } tx.executeSql(‘INSERT INTO ‘+tbl+‘ (‘+__field.substr(1)+‘) VALUES(‘+__qs.join(‘,‘)+‘);‘,__values,function(){return false;},(er ? er : self.callback_error)); } }, self.callback_error, function(){ if(callback) callback(); return true; }); return true; }, insert:function(tbl,rows,callback){ var __sql = ‘‘, _field = null, __field = ‘‘, __qs = [], __values = [], __debug = ‘‘; for(var i=0;i<rows.length;i++){ __qs = []; __field = ‘‘; _field = rows[i]; __debug += _field[0].name+‘ = ‘+_field[0].value+‘;‘; for(var j=0;j<_field.length;j++){ __field += ‘,`‘+_field[j].name+‘`‘; __qs.push(‘?‘); __values.push(_field[j].value); } __sql += ‘INSERT INTO ‘+tbl+‘ (‘+__field.substr(1)+‘) VALUES(‘+__qs.join(‘,‘)+‘);‘; } this.query(__sql,callback,__values); return true; }, insertReplace:function(tbl,rows,debug){ var __sql = ‘‘, _field = null, __field = ‘‘, __qs = [], __values = [], __debug = ‘‘; for(var i=0;i<rows.length;i++){ __qs = []; __field = ‘‘; _field = rows[i]; __debug += _field[0].name+‘ = ‘+_field[0].value+‘;‘; for(var j=0;j<_field.length;j++){ __field += ‘,`‘+_field[j].name+‘`‘; __qs.push(‘?‘); __values.push(_field[j].value); } __sql += ‘INSERT OR REPLACE INTO ‘+tbl+‘ (‘+__field.substr(1)+‘) VALUES(‘+__qs.join(‘,‘)+‘);‘; } this.query(__sql,null,__values); return true; }, dropTable:function(tbl,callback){ var __sql = ‘‘; if(tbl==null) return false; __sql = ‘DROP TABLE IF EXISTS ‘+tbl; this.query(__sql,callback); return true; } } return jQuery.extend(ret,confs); }这个是sqlite 基本crud代码
输入框搜索 执行代码
<input class="search-input ub ub-f1" id="search_" oninput="OnInput()" placeholder=" "/>
初始化sqlite数据库持久化脚本
db : new cDB({_db:window.openDatabase("websiteDB", "", "website DB", 5*1000*1000*10)}),创建通讯录表接口
dbTable : [ { table:‘contacat‘,properties: [ //员工编号,主键 {name:‘empSno‘, type: ‘INT PRIMARY KEY ASC‘}, //姓名 {name:‘username‘,type: ‘‘}, //头像 {name:‘imgBase64‘,type: ‘‘}, //部门 {name:‘deptName‘,type: ‘‘}, //邮箱 {name:‘email‘,type: ‘‘}, //手机号 {name:‘mp‘,type: ‘‘}, //职位 {name:‘positionName‘,type: ‘‘}, //公司号码 {name:‘companySno‘, type: ‘‘} , {name:‘positionNameEn‘, type: ‘‘} , {name:‘deptNameEn‘,type: ‘‘} ] } ], modifyTable : [ { table:‘modifyTimeTable‘,properties: [ {name:‘companySno‘, type: ‘‘}, {name:‘modifyTime‘, type: ‘‘} ] } ], modifyDate:"", isGetService:true, loadDataFlag:true, reloadData:function(){ //先清空列表 $("#list").html("") //清空搜索框 $("#search_").val("") //开始重新同步 contact.isGetService=false; //设置第一次同步 setstorage("isCacheContrat",null); //变量控制 contact.isInit=null; //获取数据 contact.initData(); },
每次点击同步操作 检查网络 如果是3G情况下提示 每次更新仅仅更新修改过的数据
reData:function(){ if(!contact.isGetService){ msgPrompt(getLang("contactWaiting")); return false; } uexDevice.getInfo(‘13‘); uexDevice.cbGetInfo = function(opCode, dataType, data) { //获取手机返回字符串,转换json var device = eval(‘(‘ + data + ‘)‘); var connectStatus=device.connectStatus; //判断当前网络情况 if(connectStatus!=null&&connectStatus.length>0) { //网络不可用返回connectionstatus=1 wifi情况下返回0 connectionstatus1或者是conectionstatus=2是3g或者2g if(connectStatus==-1) { //网络不可能用提示操作 msgPrompt(getLang("wlbukeyong")); return; }else if(connectStatus==0) { //wifi情况直接同步 contact.reloadData() }else if(connectStatus==1 || connectStatus==2) { //如果对话框进行确定或者取消会触发回调函数 uexWindow.cbConfirm = function ConfirmSuccess(opId, dataType, data) { //如果点击确定的话data返回0 if (data == 0) { //同步数据 contact.reloadData() } }; //如果是3g情况进行弹出confirm进行提示 uexWindow.confirm(getLang("sureMsg"), getLang("tongbutishi"), [getLang("sure"), getLang("nosure")]); } } } },查询sqlite 代码
//清空列表 $("#list").html(""); //渲染操作控制 if(!contact.loadDataFlag) { return false; } contact.loadDataFlag=false; var query = ""; //如果有搜索操作进行追加搜索条件 if(filter!=null) { query = ‘SELECT * FROM contacat where (username like "%‘+filter +‘%" COLLATE NOCASE or email like "%‘+filter+‘%" COLLATE NOCASE or mp like "%‘ +filter+‘%" COLLATE NOCASE ) and companySno="‘+contact.user.companySno+‘" order by email asc‘; } else { query = ‘SELECT * FROM contacat where companySno="‘+contact.user.companySno+‘" order by email asc‘; } contact.db.query(query,function(tx,res) { if(res.rows.length) { //获取数据循环操作 for (var i = 0; i < res.rows.length; i++) { //根据下标进行获取数据 var result = res.rows.item(i); var imgpt = ""; //如果二进制图片不存在显示默认图片 if (result.imgBase64 == null || result.imgBase64 == undefined|| result.imgBase64 == "") { imgpt = "css/myImg/person.png"; } else { //显示二进制图片 imgpt = "data:image/gif;base64," + result.imgBase64; } contact.pullAppend(result, imgpt); } } contact.loadDataFlag = true;
因为后台是sass 架构 所以A 的通讯录看不到B通讯录 防止切换账号产生脏数据
//根据companysno查询修改时间 防止切换用户重新加载数据 var query = "select * from modifyTimeTable where companySno=‘"+contact.user.companySno+"‘"; //查询操作 进行回调 因为是查询是异步操作所以需要把同步数据放到回调操作 contact.db.query(query,function(tx,res) { //如果有数据操作把数据取出来 if(res.rows.length) { //把上次同步时间 contact.modifyDate = res.rows.item(0).modifyTime; }else { //如果是null表示没有进行同步操作 contact.modifyDate=""; } //如果是第一次操作或者是修改为空的情况进行同步操作,否则直接从数据库渲染 if (contact.isInit == null||contact.isInit==""||contact.modifyDate=="") { //进度条 uexWindow.toast(1, 5,getLang("loadContacts"), -1); //延迟加载数据 setTimeout(function(){ contact.loadGetData(); },200); }else{ //渲染加载 setTimeout(function(){ contact.insertList(null); },1000); }刚装机器第一次同步时候
//根据companysno查询修改时间 防止切换用户重新加载数据 var query = "select * from modifyTimeTable where companySno=‘"+contact.user.companySno+"‘"; //查询操作 进行回调 因为是查询是异步操作所以需要把同步数据放到回调操作 contact.db.query(query,function(tx,res) { //如果有数据操作把数据取出来 if(res.rows.length) { //把上次同步时间 contact.modifyDate = res.rows.item(0).modifyTime; }else { //如果是null表示没有进行同步操作 contact.modifyDate=""; } //如果是第一次操作或者是修改为空的情况进行同步操作,否则直接从数据库渲染 if (contact.isInit == null||contact.isInit==""||contact.modifyDate=="") { //进度条 uexWindow.toast(1, 5,getLang("loadContacts"), -1); //延迟加载数据 setTimeout(function(){ contact.loadGetData(); },200); }else{ //渲染加载 setTimeout(function(){ contact.insertList(null); },1000); }递归请求获取每个用户的头像
//获取完毕进行操作 if(index>length-1){ setTimeout(function(){ contact.isGetService=true; //查询最后一次操作事件 var query = "select * from modifyTimeTable where companySno="+contact.user.companySno; contact.db.query(query,function(tx,res) { var data= [ { ‘name‘: ‘companySno‘, ‘value‘: contact.user.companySno }, { ‘name‘: ‘modifyTime‘, ‘value‘: new Date().getTime() } ] //存在进行先删除后插入 if(res.rows.length) { contact.db.remove(‘modifyTimeTable‘, [{ ‘name‘: ‘companySno‘, ‘value‘: contact.user.companySno }]); } var row = []; //存放数据 row.push(data); //进行插入操作 contact.db.insert(‘modifyTimeTable‘, row); //进行渲染列表 contact.insertList(null); uexWindow.closeToast(); setstorage("isCacheContrat",123); }) contact.isInit=123; },3000) return false; } var empSno = pep[index].empSno var url = ApIp + "ManagerDemo/user/empPhotoAction.do?token=" + contact.token + "&empSno=" + empSno+"&index="+index; $.ajax({ url: url, data: { "userName": contact.user.userName, "privilegeGroupId": contact.privilegeGroupId }, type: ‘POST‘, dataType: "json", error: function(){ contact.getImage(index,pep.length,pep) }, success: function(data) { //获取单个头像登录失效 if (data.msg == 205) { //登录失效进行跳转登录页面置空session uexWindow.toast(1, 5, getLang("loginFail"), 0); setInterval(function(){ setstorage("sessionId", null); uexWindow.closeToast(); openNewWin(‘login‘, ‘../login/login.html‘, ‘5‘); winClose() }, 2000) }else { uexWindow.toast(1, 5, sync1 + (parseInt(data.index) + 1) + sync2 + sync3 + pep.length + sync4, -1); empSno1 = pep[data.index].empSno var query = ‘SELECT * FROM contacat where empSno =‘ + pep[index].empSno; contact.db.query(query, function(tx, res){ if (pep[data.index].status == "0") { contact.db.remove(‘contacat‘, [{ ‘name‘: ‘empSno‘, ‘value‘: pep[data.index].empSno }]); } else { var contactData = [ {‘name‘: ‘empSno‘,‘value‘: pep[data.index].empSno}, {‘name‘: ‘positionName‘,‘value‘: pep[data.index].positionName}, {‘name‘: ‘mp‘,‘value‘: pep[data.index].mp}, {‘name‘: ‘email‘,‘value‘: pep[data.index].email}, {‘name‘: ‘deptName‘,‘value‘: pep[data.index].deptName}, {‘name‘: ‘username‘,‘value‘: pep[data.index].name}, {‘name‘: ‘companySno‘,‘value‘: pep[data.index].companySno}, {‘name‘: ‘imgBase64‘,‘value‘: data.data}, {name:‘positionNameEn‘, value: pep[data.index].positionNameEn} , {name:‘deptNameEn‘,value: pep[data.index].deptNameEn} ] if (res.rows.length) { contact.db.remove(‘contacat‘, [{ ‘name‘: ‘empSno‘, ‘value‘: pep[data.index].empSno }]); } var row = []; row.push(contactData); contact.db.insert(‘contacat‘, row); } //下标 index = parseInt(data.index) + 1; //获取下一个用户的头像 contact.getImage(index, pep.length, pep) }); } },error:function(XMLHttpRequest, textStatus, errorThrown){ index=index+1; contact.getImage(index,pep.length,pep) } });
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。