使用jQuery在DOM或window加载后执行动作

页面上的javascript执行,除了用户主动交互的事件外,都是在DOM加载完成或window完全加载后执行的(甚至连定时事件也是在此时开始计时)。以下分别分析jQuery针对这两种情况的处理。 使用ready方法定义在DOM被加载后执行的动作在DOM被加载后执行,不必等要页面元素都渲染完。 三种语法12345678910// Standard.jQuery(document).ready...

Continue Reading →

使用Apache的POI包设置excel列宽

可以使用setColumnWidth方法设置excel列的宽度。例如:

1
sheet.setColumnWidth(i, width);

需要注意语句的顺序,有时候在创建相应的行和列之前使用该语句,没有效果。所以,可以把上面的语句放在代码的最后。

使用java根据url下载并重命名文件

根据url下载并重命名文件,包含以下操作:

告诉浏览器新的文件名称

使用response.setHeader方法,设置filename,为了使中文文件名称不乱码,需要加UTF-8编码,代码如下:

1
response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");

设置contentType

首先,通过FilenameUtils.getExtension获取文件后缀,再根据文件后缀设置contentType,代码中例子为下载xls或xlsx类型的文件:

1
2
3
String contentType = "xls".equals(FilenameUtils.getExtension(fileName))
? "application/vnd.ms-excel" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
response.setContentType(contentType);

通过url读取网络文件的内容并下载文件

1
2
3
4
5
6
7
8
9
10
11
12
13
InputStream inputStream = new URL(filePath).openStream();
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
try {
byte[] buffer = new byte[inputStream.available()];
int length = inputStream.read(buffer);
while (length > 0) {
outputStream.write(buffer, 0, length);
length = inputStream.read(buffer);
}
} finally {
inputStream.close();
outputStream.close();
}

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@RequestMapping(value = "/download", method = RequestMethod.GET)
public void downloadExcelFile(HttpServletResponse response) throws Throwable {
String filePath=""; //文件url
String fileName=""; //新的文件名称,包含后缀
downloadFile(response, budgetTemplateUrl, fileName);
}

public void downloadFile(HttpServletResponse response, String filePath, String fileName) throws Throwable {
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");
String contentType = "xls".equals(FilenameUtils.getExtension(fileName))
? "application/vnd.ms-excel" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
response.setContentType(contentType);
InputStream inputStream = new URL(filePath).openStream();
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
try {
byte[] buffer = new byte[inputStream.available()];
int length = inputStream.read(buffer);
while (length > 0) {
outputStream.write(buffer, 0, length);
length = inputStream.read(buffer);
}
} finally {
inputStream.close();
outputStream.close();
}
}

如何将select控件设置为只读

select控件是否有readonly属性select控件自身没有readonly属性,只有disable属性。 能否使用disable属性设置select控件为只读select设置为disable属性后,确实不可改,起到只读的作用,但设置为disable后,name属性也失效了,传递到后台时,对应的属性值变为null了。有一种解决办法是在提交到后台之前将disable属性去掉,但在页面上...

Continue Reading →

使用MySQL函数计算一段时间内的有效时长

有时候需要计算两个时间点之间的有效时间的长度,比如某天上午几点到某天下午几点之间,上班时间的长度,可以使用下面的函数进行计算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
CREATE FUNCTION `get_eff_time_length`(datetime_start datetime,datetime_end datetime,eff_time_start TIME,eff_time_end TIME) RETURNS int(11)
BEGIN
DECLARE dayCount INTEGER;
DECLARE effMiddleSeconds INTEGER;
DECLARE effSecondsFirst INTEGER;
DECLARE effSecondsLast INTEGER;
DECLARE time_start TIME;
DECLARE time_end TIME;
DECLARE result INTEGER;
SET dayCount = DATEDIFF(datetime_end,datetime_start);
SET time_start=TIME(datetime_start);
SET time_end=TIME(datetime_end);
IF dayCount=0
THEN
IF eff_time_start>time_start
THEN
SET time_start=eff_time_start;
END IF;
IF eff_time_end<time_end
THEN
SET time_end=eff_time_end;
END IF;
IF time_end< time_start
THEN
SET result=0;
ELSE
SET result=TIME_TO_SEC(SUBTIME(time_end,time_start));
END IF;
ELSE
SET effMiddleSeconds=(dayCount-1)*TIME_TO_SEC(TIMEDIFF(eff_time_end,eff_time_start));
IF time_start>eff_time_end THEN
SET effSecondsFirst=0;
ELSE
IF eff_time_start>time_start
THEN
SET time_start=eff_time_start;
END IF;
SET effSecondsFirst=TIME_TO_SEC(SUBTIME(eff_time_end,time_start));
END IF;

IF time_end<eff_time_start THEN
SET effSecondsLast=0;
ELSE
IF eff_time_end<time_end
THEN
SET time_end=eff_time_end;
END IF;
SET effSecondsLast=TIME_TO_SEC(SUBTIME(time_end,eff_time_start));
END IF;
SET result=effSecondsFirst+effMiddleSeconds+effSecondsLast;
END IF;

RETURN result;
END

下面的测试用例计算一段时间内,在9点到21点之间的有效时长(取个对称的时间,方便测试。已经工作了的程序员留个言,看看有没有人经常加班到21点),单位为秒。测试用例没有覆盖所有情况,有兴趣的同学帮忙补一补。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
-- 同一天,两段时间相交,11.5小时,41400秒
SELECT get_eff_time_length(STR_TO_DATE('2015-12-21,09:30:00','%Y-%m-%d,%H:%i:%s')
,STR_TO_DATE('2015-12-21,21:30:30','%Y-%m-%d,%H:%i:%s')
, TIME(STR_TO_DATE('09:00:00','%H:%i:%s'))
, TIME(STR_TO_DATE('21:00:00','%H:%i:%s'))
)

-- 同一天,两段时间不相交,0秒
SELECT get_eff_time_length(STR_TO_DATE('2015-12-21,08:30:00','%Y-%m-%d,%H:%i:%s')
,STR_TO_DATE('2015-12-21,09:00:00','%Y-%m-%d,%H:%i:%s')
, TIME(STR_TO_DATE('09:00:00','%H:%i:%s'))
, TIME(STR_TO_DATE('21:00:00','%H:%i:%s'))
)

-- 同一天,两段时间不相交,0秒
SELECT get_eff_time_length(STR_TO_DATE('2015-12-21,21:30:00','%Y-%m-%d,%H:%i:%s')
,STR_TO_DATE('2015-12-21,22:00:00','%Y-%m-%d,%H:%i:%s')
, TIME(STR_TO_DATE('09:00:00','%H:%i:%s'))
, TIME(STR_TO_DATE('21:00:00','%H:%i:%s'))
)

-- 跨天,都不在有效时间,0秒
SELECT get_eff_time_length(STR_TO_DATE('2015-12-21,21:30:00','%Y-%m-%d,%H:%i:%s')
,STR_TO_DATE('2015-12-22,8:30:00','%Y-%m-%d,%H:%i:%s')
, TIME(STR_TO_DATE('09:00:00','%H:%i:%s'))
, TIME(STR_TO_DATE('21:00:00','%H:%i:%s'))
)

-- 跨天,第一天包含全部有效时间,第二天不在有效时间,12小时,43200秒
SELECT get_eff_time_length(STR_TO_DATE('2015-12-21,8:30:00','%Y-%m-%d,%H:%i:%s')
,STR_TO_DATE('2015-12-22,8:45:00','%Y-%m-%d,%H:%i:%s')
, TIME(STR_TO_DATE('09:00:00','%H:%i:%s'))
, TIME(STR_TO_DATE('21:00:00','%H:%i:%s'))
)

-- 跨天,第二天包含全部有效时间,第一天不在有效时间,12小时,43200秒
SELECT get_eff_time_length(STR_TO_DATE('2015-12-21,22:00:00','%Y-%m-%d,%H:%i:%s')
,STR_TO_DATE('2015-12-22,21:30:00','%Y-%m-%d,%H:%i:%s')
, TIME(STR_TO_DATE('09:00:00','%H:%i:%s'))
, TIME(STR_TO_DATE('21:00:00','%H:%i:%s'))
)

-- 跨天,两天都有部分在有效时间,1.5小时,5400秒
SELECT get_eff_time_length(STR_TO_DATE('2015-12-21,20:00:00','%Y-%m-%d,%H:%i:%s')
,STR_TO_DATE('2015-12-22,9:30:00','%Y-%m-%d,%H:%i:%s')
, TIME(STR_TO_DATE('09:00:00','%H:%i:%s'))
, TIME(STR_TO_DATE('21:00:00','%H:%i:%s'))
)

-- 跨两天,第一天和第三天都有部分在有效时间,13.5小时,48600秒
SELECT get_eff_time_length(STR_TO_DATE('2015-12-21,20:00:00','%Y-%m-%d,%H:%i:%s')
,STR_TO_DATE('2015-12-23,9:30:00','%Y-%m-%d,%H:%i:%s')
, TIME(STR_TO_DATE('09:00:00','%H:%i:%s'))
, TIME(STR_TO_DATE('21:00:00','%H:%i:%s'))
)

Javascript中!!(两个感叹号,双感叹号)的作用

Javascript中!!(两个感叹号,双感叹号)的含义

使用javascript时,有时会在变量前面加上两个感叹号,这样做表示什么含义呢?Javascript中,!表示运算符“非”,如果变量不是布尔类型,会将变量自动转化为布尔类型,再取非,那么用两个!!就可以将变量转化为对应布尔值

Javascript中哪些情况下!!值为真?

Javascript中哪些情况下!!值为真?当变量转化为布尔值true时为真咯!

Javascript中各种类型如何转换为布尔值?

我们至少可以想到undifined和null一定是转化为false的,数字0也一定是false,那么,空字符串,空数组,空对象呢?别急,下面的实验会有清晰的答案。

首先,定义三个转化布尔值的函数,我们后面会看到这三个函数是等价的,并且同时输出三个函数的转化结果

function trueOrFalseIf(toTest){
    if(toTest){
        return true;
    }
    else{
        return false;
    }
}

function trueOrFalseDouble(toTest){
    return !!toTest;
}

function trueOrFalseBoolean(toTest){
    return new Boolean(toTest);
}

function print(toTest){
    document.write(trueOrFalseIf(toTest)+","+trueOrFalseDouble(toTest)+","+trueOrFalseBoolean(toTest)+"<br/>");
}

依次测试undefined,null,空字符串,负0,正0,不确定数值,布尔值false,布尔值true,字符串0,数字1,数字无穷大,字符串true,字符串false,空数组,空对象,函数

function test(){

var toTestArray=[undefined,null,"",-0,0,NaN,false

,true,"0",1,Infinity,"true","false",[],{},function(){}];

for(var i=0;i<toTestArray.length;i++){

    print(toTestArray[i]);

}

}

测试结果如下:

false,false,false

false,false,false

false,false,false

false,false,false

false,false,false

false,false,false

false,false,false

true,true,true

true,true,true

true,true,true

true,true,true

true,true,true

true,true,true

true,true,true

true,true,true

true,true,true

可以看到前面7个值都是false,后面9个值都是true。比较值得一提的结论如下:

众望所归,undefined和null为false。

任意数组,对象,函数(函数是特殊的对象)都转化为真,即使是空数组,空对象。

空字符串为false,非空字符串为true。

数值正负0,不确定值为false,其它为true,无穷大也是true。

字符串”0″和数值0可以相互转换,但它们转换为不同的布尔值,即0可转换为”0″,”0″可转换为true,但0却转换为false,可见Javascript中类型转换不具有传递性。

一个更有趣的现象是布尔值false会转化为字符串”false”,而字符串”false”却转换为布尔值true。

document.write(new String(false));
document.write(new Boolean("false"));

结果为

falsetrue

回到我们的题目,Javascript中!!(两个感叹号,双感叹号)可以用来做什么,可以用来判断一些变量的值啊!如果值为真,首先可以排除undefined和null,根据对象类型,可以做出如下判断:

数值:表示不是0,且有确定含义的值(包括无穷大)

字符串:表示长度大于0的字符串

数组,对象,函数:只能表示不是undefined或null,并不能判断是否有元素和内容。

另外,我们上面比较了三个函数,结果是一样的,所以下面两个用法其实是完全等价的:

if(!!value){

}

if(value){

}

如果作为条件表达式,不需要使用!!进行转换,Javascript会自动转换,!!就只应用于将类型转换为布尔值。

WordPress 后台只有菜单,没有内容的解决办法

有时候在WordPress系统迁移后,或者在动了apache或php后,发现后台菜单都在,但是点击时,右侧窗体却不加载,内容为空白。而插件菜单都可以点击并且正常。惨状就像下面这张图这样:

wordpress后台不加载

或许,你还能发现以下的报错信息:

Fatal error: Access to undeclared static property: WP_Screen::$this
in blog/wp-admin/includes/screen.php on line 706

而你很真的真的很确定自己没有动过WordPress的任何配置啊!这时要怎样修复呢?别当心,stackoverflow上有人遇到同样的问题。只要找到以下文件

/wp-admin/includes/screen.php

用你最喜欢的文本编辑器打开它,然后将

<?php echo self::$this->_help_sidebar; ?> (注意空格个数可能略有不同)

替换为

<?php echo $this->_help_sidebar; ?>

保存之后,看看是不是OK了?

中国电信发送QQ垃圾消息

chinatelecom-spam

2014年1月18日11点23分,也就是刚才,收到一个名为“中国电信”的用户发送的一条QQ消息,内容是促销热门手机。第一反应是有人假冒中国电信发送QQ垃圾消息。事实是…

促销链接地址,居然是189.cn的,whois信息显示这个网址确实属于中国电信,被雷到了。

很难理解电信直接以陌生人身份发送QQ垃圾促销内容的行为,这种用户体验的糟糕程度和新浪微博用私信推送新闻有得一拼了

你们有收到这样的消息吗?

2014年IT行业展望

2014

2014如约而至,今年有许多值得期待的发展。

可穿戴设备

谷歌的Google Glass如果投入量产的话,会对人们的生活习惯造成很大冲击。而诸如苹果的智能手表也能带来很多方便。

智能手机操作系统

比较看好安卓系统的发展,应该在整理版本碎片方面能够取得不错的成绩。苹果明显感觉后劲越来越不足,但仍然有可能带来一些欣喜。

手机网络

韩国大力发展5G网络,而各国也会继续普及4G网络。但并不看好中国大陆地区4G网络的应用,因为资费太贵,流量又用得太快,在按流量计费的情况下,形同鸡肋。虽然相比3G网络,可以降低单位流量的价格,加快和增多非视频移动内容的浏览,从而促进相应网站和应用的发展,但可以随时随地轻松看视频的日子还没有到来。

超级电视

明年的增速将放缓,但随着竞争愈发激烈加上前期的技术积累,以及网络的提速,预计技术革新和三网融合将会加快。

智能路由器

其发展也会是2014年不大不小的亮点。

姑妄言之,总之对2014年IT界的发展是充满信心和期待的。

 

© 2022 谈谈IT All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero