项目完成了,突然想做个总结但是有点无从下手了。
做之前对于客户端给的接口很模式。然而定义好了格式要求就如此的愉快了。
先说说项目主要实现的功能吧
1,按键精灵
2,获取行情数据
3,各种input输入条件判断
4,发送数据(有json格式和string格式)
5,获取预警条件列表和预警结果列表,
6,排序,
7,预警结果分页获取
8,导出文件(excel,text等)
9,修改
10,删除
11,禁止右键,禁止F5,
12,接口有:新加,修改,删除,获取预警条件列表,获取预警结果,获取预警结果条数,获取第M-N条,导出,查看走势,预警方式,调老的预警,开启关闭预警,设置浏览器对话框大小、位置,有新的预警结果推送,添加成功推送,设置预警结为已读,等等
其实是一个小项目啦。。就简简单单的两个界面。
不过用的交互接口却很多。
1,字符串转换成对象:
var string = '[{}]'; var data = eval("data="+string); data is object
2,导出excel|text格式的文件。
3,单击双击的判定
//定义setTimeout执行方法 var TimeFn = null; $('div').click(function () { // 取消上次延时未执行的方法 clearTimeout(TimeFn); //执行延时 TimeFn = setTimeout(function(){ //do function在此处写单击事件要执行的代码 },300); }); $('div').dblclick(functin () { // 取消上次延时未执行的方法 clearTimeout(TimeFn); //双击事件的执行代码 })
4,//获取location.url中的某一个字段值
function getUrlParam(item) { var value = location.search.match(new RegExp("[\?\&]" + item + "=([^\&]*)(\&?)", "i")); return value ? value[1] : value; }
5,//时间戳转换成 01-02 20:10
function userDate(uData){ var myDate = new Date(uData*1000); var nowDate = new Date(); var nMonth = nowDate.getMonth() + 1; var nDay = nowDate.getDate(); var year = myDate.getFullYear(); var month = myDate.getMonth() + 1; var day = myDate.getDate(); var hours = myDate.getHours(); var minutes = myDate.getMinutes(); if(nMonth == month && nDay == day){ if(hours < 10){ hours = '0'+hours; } if(minutes < 10){ minutes = '0' +minutes; } return '今天' + ' ' + hours + ':' + minutes; }else{ if(month < 10){ month = '0'+month; } if(day < 10){ day = '0'+day; } if(hours < 10){ hours = '0'+hours; } if(minutes < 10){ minutes = '0' +minutes; } return month + '-' + day + ' ' + hours + ':' + minutes; } }
6,获取行情数据
//@charset "utf-8" var hqQuote = { request : function (callback, stock, period) { //ZHANGSHU var dataType = ['ZQMC', 'NEW', 'ZHANGDIEFU', '3934664', 'HUANSHOU','HIGH','LOW','PRE']; try { var thsQuote = external.createObject("Quote"); } catch(e) { alert('需要客户端环境'); return false; } dataType = dataType.join(','); var reqObj = { code: stock, type: dataType, period: period, onready: function() { var result = {}; dataType = dataType.split(','); for (var type in dataType) { if (isNaN(type)) { continue; } var ret = null; if (dataType[type] == '3934664') { ret = { code : stock, type : dataType[type], mode: 'beforecalclastfromsvrnow1st' }; } else { ret = {code : stock, type : dataType[type]}; } try { var data = thsQuote.getData(ret); data = eval(data); for (var i in data) { if (undefined == result[i]) { result[i] = {}; } if ('zqmc' == ret.type || 'ZQMC' == ret.type) { result[i][ret.type] = data[i][ret.type]; continue; } if (isNaN(data[i][ret.type])) { result[i][ret.type] = '--'; continue; } result[i][ret.type] = parseFloat(data[i][ret.type]).toFixed(2); } } catch (exp) { continue; } } callback(result[stock], stock); } }; thsQuote.request(reqObj); } }
var condition = { render : function (data, stock) { var dataZhangdiefu = parseFloat(data['ZHANGDIEFU']).toFixed(2); var dataZhangshu = parseFloat(data['3934664']).toFixed(2); var dataHuanshou = parseFloat(data['HUANSHOU']).toFixed(2); } }
hqQuote.request(condition.render, code, 'now');
7,导出格式
/** * 组合导出格式 * @param string formatType 格式,excel|text */ var tableTh = ['预警品种', '预警内容', '价格', '预警时间']; var assembleText = function (formatType) { formatType = formatType || 'excel'; var trObj = $("#proTableResult table tr"), //分隔符、换行符 delimiter = formatType == 'text' ? '\t' : '\t', newline = formatType == 'text' ? '\r\n' : '\r\n', returnText = tableTh.join(delimiter) + newline, trArr = new Array(); trObj.each(function (i, tr) { var tdArr = new Array(); $(tr).find('td').each(function (i, td) { if (i < tableTh.length) { tdArr.push($(td).html().replace(/<[^>]+>/g, '')); } }); trArr.push(tdArr.join(delimiter)); }); returnText += trArr.join(newline); //alert(returnText); return returnText; }
8,排序
//排序部分 /** * 排序方法 * @param obj domObj 要排序的table对象 * @param string sortType 排序的字段(时间max),'stockcode|time' */ var operaTable = function (tableObj, sortType, sort) { sortType = sortType || 'pcid'; //获取tbody下的tr var tbBodyTr = $(tableObj).children('tbody').find('tr'), tbBodyTrLenght = tbBodyTr.length, isTrue = false, tmp1, tmp2; for (var i = 0; i < tbBodyTrLenght - 1; i++ ) { for (var k = i + 1; k < tbBodyTrLenght; k++) { var kValue1 = $(tbBodyTr[i]).attr(sortType), kValue2 = $(tbBodyTr[k]).attr(sortType); isTrue = sort == 'asc' ? parseFloat(kValue1) > parseFloat(kValue2) : parseFloat(kValue1) < parseFloat(kValue2); if (isTrue) { $(tbBodyTr[i]).next().after($(tbBodyTr[i])); } } } } $(".sort0, .sort1").click(function (e) { var target = $(e.target); var tableObj = $(this).parent().parent().siblings('div').find('table'); //排序方式 var sortType = ''; var sort = 'desc'; if (target.closest('.sort0').length > 0) { sortType = 'Key'; sort = 'asc'; } else if (target.closest('.sort1').length > 0) { sortType = 'Key'; sort = 'desc'; } else { return ; } $(this).siblings('a').show(); $(this).hide(); operaTable(tableObj, sortType, sort); });
9,div里面的滚动条滚到底部加载更多
$("#proTableResult").scroll(function(){ nScrollHight = $(this)[0].scrollHeight; nScrollTop = $(this)[0].scrollTop; if(nScrollTop + nDivHight >= nScrollHight){ //加载更多内容 } )}
10,each,push,join等的使用,
获取自定义属性值attr,
setTimeout,
键/值,
数组,
prototype原型,
实例化方法,
等等