概要
cookies
replace中正则的坑
数组越界及undefined的大小问题
dom的效率 dom方式设置元素的兼容性
html中js文件的加载顺序
excel文件的BOM+utf-8编码
post默认提交form或页面变量
redis hmset hgetall
jquery重复绑定同一个动作不会失败
弹出子页面modal
echarts设置connect、光标信息、重复legend grid设置页边距、y:-300设置位置不可见
散列图设置 series.type:”scatter” data为单个坐标点
array.splice()语法
关于async
console.time() console.timeEnd()
mongodb stream
1、操作cookies
express提供了bodyParser来操作cookies和sessions,不过通过jQuery操作cookie更方便:
在html中添加cookies.js的引用:
<script src="plugins/jquery.cookie.js"></script>
在js中去cookie:
var preData = $.cookie("reportPageInfo");
设置cookie的值:
$.cookie("reportPageInfo", JSON.stringify(preData), {expires:30});
2、string.replace()的问题
string.replace()中第一个参数为想要被替换的对象,但是replace的默认机制是只替换一次,如果要处理的字符串中存在多个需替换的字符,最好使用正则表达式并指定全局替换:
> "2015/12/20".replace(///g, '')
'20151220'
3、数组越界问题与undefined的大小
不知道是不是js通性,在nodejs中,数组下标越界时,不会提示错误,而是返回undefined,这样如果不确定算法的边界条件,就可能产生一系列预想之外的结果。
> l1 = [1, 2, 3, 4]
[ 1, 2, 3, 4 ]
> l1[5]
undefined
即使undefined作为数组下标,仍然不会出错,而是返回undefined。目前对js了解不深,但是感觉这样的语法有点不够严谨。
> l2=[]
[]
> l2[l1[66]]
undefined
undefined是个特殊的对象:
> undefined > 0
false
> undefined < 0
false
> undefined == 0
false
> undefined == 345
false
> undefined > 345
false
> undefined < 345
false
> undefined > 'erwtSD'
false
> undefined < 'erwtSD'
false
> undefined == 'erwtSD'
false
> undefined > ''
false
> undefined < ''
false
> undefined == ''
false
无论与什么类型比较,undefined都返回false,在if...else...结构中,配合数组越界问题,即使程序正常执行了,也很难确定程序是按照预想逻辑执行的。
可能需要结合||排除undefined干扰。
4、DOM的效率及兼容性
通过DOM直接操作页面元素时,页面元素的每次改变都会触发页面整体重新渲染,即使是改变元素所属类。因此DOM方式效率较差。
可通过在DOM对象中完成全部操作,再一次执行。
关于兼容性,在实践中DOM方式创建的元素在Chrome中可以正常显示,FireFox中则TextNode内容无法显示,换用jquery方式设定后恢复正常,不知是否有其他问题。
5、HTML中文件加载顺序
HTML中文件按照书写顺序先后加载,如果先加载的js文件需要用到后加载的js文件内容,则会找不到所需内容。
HTML中直接加载HTML:
<% include ./../../include/footer.html %>
6、Excel文件编码
Excel文件内容的编码为BOM+utf-8,如果写入空白Excel文件中的字符只设定了utf-8编码而没有BOM,则同样会出现乱码。
BOM:'uFEFF’
7、setInterval与clearInterval
使用轮询方式开始socket监听之后,如果不关闭,轮询在方法结束后仍会存在,影响进度条判断,需要在使用完毕后关闭轮询。
setInterval(func, time);方法会返回一个生成的轮询对应的id,在关闭轮询时,将这个id传给clearInterval即可。
clearInterval(socketID);
8、post默认提交form或页面变量
当HTML页面中存在form时,如果ajax.post方法没有参数,可能会将页面内容(全局变量)作为参数进行传递。如果全局变量中内容过大,可能导致request entity too large错误。
9、redis操作
option.tooltip.formatter = function(params) {
var res = params[0].name + '<br/>';
res += params[0].seriesName + " : " + params[0].value;
return res;
}
设置legend的y属性,隐藏legend
{legend: {
y: -300,
data: createConnectedSeriesName(obj, data)
}
}
13、散列图设置
xAxis与yAxis的type都为"value",在series中所有数据的type都是"scatter",数据的data部分每个元素都是一个包含横纵坐标的点,因此不需要设定xAxis的data部分。
14、关于array.splice()
splice方法可用于插入元素、删除指定位置的元素,用法为:
arrayObject.splice(index,howmany,item1,.....,itemX)
index为数组下标,第二个参数为删除元素的个数,设置为0时,会在指定元素之后插入第三个参数开始的指定内容。
15、关于流程控制--async
console.time("label1");
...
console.timeEnd("label1");
统计两者之间的代码执行时间,单位为毫秒。time与timeEnd的参数必须一一对应,否则会报错找不到何时开始或终止。
17、mongoose.stream
mongoose中find方法将结果转换为Query对象返回,当返回结果数据量较大时可能会逼近nodejs引擎的内存上限,使程序终止。
mongoose.stream方式将查询结果每次返回一条,相对而言可提高效率。
1 var stream = table.find(query, projection).sort({ 2 ct: 1, 3 duk: 1 4 }).lean(true).stream(); 5 stream.on('data', function(singleRec) { 6 datas.push(singleRec); 7 }).on('error', function(err) { 8 callBack(err, null); 9 }).on("close", function() { 10 console.log("rec length:", datas.length); 11 callBack(null, datas); 12 });