日志地址

从七月初开始用md在github上写技术日志,每天一篇,提醒自己不能放松。

后来逐渐发现如果文件名上只有日期的话,会很不方便查阅,于是便想着将每篇日志的标题放到文件名上来,这样在没有网络的时候,我也可以随时在本地找到。

这样改的话工程量毕竟很大,于是今天试着用PHP对文件进行操作,统一更改文件名。

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
<?php  
header("Content-Type:text/html;charset=utf-8");

// 日志所在文件夹
$diaryDir = "./07/";


function tree($directory)
{

$mydir = dir($directory);
echo "<ul>\n";
while($file = $mydir->read())
{
if((is_dir("$directory/$file")) && ($file!=".") && ($file!=".."))
{
echo "<li><font color=\"#ff00cc\"><b>$file</b></font></li>\n";
tree("$directory/$file");
}
else if ($file != "." && $file != "..")
{
// 在这里进行文件处理
$reg = "/#{1}\s+(.*)\s+#{1}/";
$arr = array();
$str = htmlspecialchars(file_get_contents($diaryDir.$file));
// echo $str;
preg_match($reg, $str, $arr);

print_r(trim($arr[1]));
rename($diaryDir.$file, $diaryDir.substr($file, 0, 10).'('.iconv('UTF-8', 'GB2312', $arr[1]).')'.'.md');
echo "<br>";
}
}

echo "</ul>\n";
$mydir->close();
}


//开始运行
tree($diaryDir);

CSS3方法

DEMO演示

@keyframes,animation, transform三样便可以搞定

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
#center {
width:10px;
height: 10px;
border-radius: 5px;
background: #000;
position: relative;
margin: 200px auto;
}

#dot {
width: 10px;
height: 10px;
background: red;
position: absolute;
border-radius: 5px;
left: 200px;
top: 0;

-o-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-webkit-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);

-o-transform-origin: -2000%;
-webkit-transform-origin: -2000%;
-moz-transform-origin: -2000%;
-ms-transform-origin: -2000%;
transform-origin: -2000%;

animation: rot 3s linear 0s infinite;
-o-animation: rot 3s linear 0s infinite;
-ms-animation: rot 3s linear 0s infinite;
-webkit-animation: rot 3s linear 0s infinite;
-moz-animation: rot 3s linear 0s infinite;
}


@keyframes rot {
from{
transform: rotate(0deg);
}

to{
transform: rotate(360deg);
}

}
@-o-keyframes rot {
from{
-o-transform: rotate(0deg);
}

to{
-o-transform: rotate(360deg);
}

}
@-webkit-keyframes rot {
from{
-webkit-transform: rotate(0deg);
}

to{
-webkit-transform: rotate(360deg);
}

}
@-moz-keyframes rot {
from{
-moz-transform: rotate(0deg);
}

to{
-moz-transform: rotate(360deg);
}

}
@-ms-keyframes rot {
from{
-ms-transform: rotate(0deg);
}

to{
-ms-transform: rotate(360deg);
}

}
</style>

</head>
<body>
<div id="center">
<div id="dot"></div>
</div>
</body>
</html>

javascript

DEMO演示

Math.cos(), Math.sin(),这两个函数的参数都是弧度,所以可以用 Math.PI * 2/360将角度转化成弧度。

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
#center {
width:10px;
height: 10px;
border-radius: 5px;
background: #000;
position: relative;
margin: 200px auto;
}

#dot {
width: 10px;
height: 10px;
background: red;
position: absolute;
border-radius: 5px;
left: 200px;
top: 0;
}

</style>

</head>
<body>
<div id="center">
<div id="dot"></div>
</div>

<script type="text/javascript">
var oDot = document.getElementById('dot');
var deg = 0;
var timer = null;
var radius = oDot.offsetLeft; // 旋转半径

timer = setInterval(function() {
var radian = (2*Math.PI/360)*deg;
var theTop = Math.ceil(Math.sin(radian)*radius);
var theLeft = Math.ceil(Math.cos(radian)*radius);
oDot.style.top = theTop + 'px';
oDot.style.left = theLeft + 'px';
deg += 0.5;
if (deg === 361) {
deg = 0;
}
},1);
</script>

</body>
</html>

查看demo

这几天准备阿里巴巴的笔试,可以说已经是心力交瘁,自从阿里和蘑菇街的内推被刷掉之后,开始越来越怀疑起自己的能力来,虽然这点打击应该是微不足道的。毕竟校招在刚刚开始拉开帷幕,精彩的还在后头,内推不过,还有机会去秋招,这次秋招不过,还有明年的春招。但是明年的春招我可能等不起了,我迫不及待地需要一份工作,需要一份我向往的工作。

今天看书看到canvas部分,便用它来写了一个时钟,原理很简单,用context.arc(100, 100, 99, 0, Math.PI*2, false);绘制圆形作为表盘,context.fillText(i, textX, textY);绘制表盘上的数字,context.lineTo(secondsX, secondsY);绘制秒针,时针和分针的原理与此相同。接着就是正弦和余弦函数的运用。

开代码:

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>canvas时钟</title>
</head>
<body>
<canvas id="drawing" width="400" height="400"></canvas>

<script>
var draw = document.getElementById('drawing');
var time = null;
var seconds = 0;
var minutes = 0;
var hours = 0;
var secondsAngle = 0;
var minutesAngle = 0;
var hoursAngle = 0;
var secondsX = 0;
var secondsY = 0;
var minutesX = 0;
var minutesY = 0;
var hoursX = 0;
var hoursY = 0;
if (draw.getContext) {
var context = draw.getContext('2d');

// 绘制外圆
context.arc(100, 100, 99, 0, Math.PI*2, false);

// 绘制内圆
context.moveTo(194, 100);
context.arc(100, 100, 94, 0, Math.PI*2, false);
context.stroke();

context.font = "bold 14px Arial";
context.textAlign = 'center';
context.textBaseline = 'middle';
// context.fillText('12', 100, 20);
var i = 1;
var textAngle = 0;
var textX = 0;
var textY = 0;
for (i = 1; i < 13; i++) {
textAngle = i * (Math.PI*2/12);
textY = 100 - 83*Math.cos(textAngle);
textX = 100 + 83*Math.sin(textAngle);
context.fillText(i, textX, textY);
}
drawClock();
setInterval(drawClock, 1000);

}

function getTime() {
var date = new Date();
var res = {};
res.seconds = date.getSeconds();
res.minutes = date.getMinutes();
res.hours = date.getHours();
return res;
}

function drawClock() {
// 开始路径
context.beginPath();

context.clearRect(35, 35, 130, 130);



time = getTime();
seconds = time.seconds;
minutes = time.minutes;
hours = time.hours > 12 ? time.hours-12: time.hours;

// 绘制秒针
// context.rePaint();
context.moveTo(100, 100);
secondsAngle = (seconds/60)*Math.PI*2;
secondsY = 100 - 65*Math.cos(secondsAngle);
secondsX = 100 + 65*Math.sin(secondsAngle);
context.lineTo(secondsX, secondsY);


// 绘制分针
context.moveTo(100, 100);
minutesAngle = ((minutes*60+seconds)/(60*60))*Math.PI*2;
minutesY = 100 - 50*Math.cos(minutesAngle);
minutesX = 100 + 50*Math.sin(minutesAngle);
context.lineTo(minutesX, minutesY);

// 绘制时针
context.moveTo(100, 100);
hoursAngle = ((hours*60*60+minutes*60+seconds)/(12*60*60))*Math.PI*2;
hoursY = 100 - 35*Math.cos(hoursAngle);
hoursX = 100 + 35*Math.sin(hoursAngle);
context.lineTo(hoursX, hoursY);



// 描边路径
context.stroke();
}
</script>

</body>
</html>

查看DEMO

通过 CSS3,我们能够创建动画,这可以在许多网页中取代动画图片、Flash 动画以及 JavaScript。

先来认识一下css3的animation

animation的简写animation: name duration timing-function delay iteration-count direction;

其次就是@keyframes

好了,接下来运用上述两个属性做一个可以旋转的齿轮

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
57
58
59
60
61
62
<style>
.img {
margin: 0 auto;
text-align: center;
width: 400px;
height: 400px;
padding: 0;

animation-name:myrotate;
animation-duration:3s;
animation-timing-function:linear;
animation-delay:0s;
animation-iteration-count:infinite;
animation-direction:normal;
animation-play-state:running;

-moz-animation-name:myrotate;
-moz-animation-duration:3s;
-moz-animation-timing-function:linear;
-moz-animation-delay:0s;
-moz-animation-iteration-count:infinite;
-moz-animation-direction:normal;
-moz-animation-play-state:running;

-webkit-animation-name:myrotate;
-webkit-animation-duration:3s;
-webkit-animation-timing-function:linear;
-webkit-animation-delay:0s;
-webkit-animation-iteration-count:infinite;
-webkit-animation-direction:normal;
-webkit-animation-play-state:running;

-o-animation-name:myrotate;
-o-animation-duration:3s;
-o-animation-timing-function:linear;
-o-animation-delay:0s;
-o-animation-iteration-count:infinite;
-o-animation-direction:normal;
-o-animation-play-state:running;
}


@keyframes myrotate {
from {transform: rotate(0deg);}
to {transform: rotate(360deg);}
}
@-moz-keyframes myrotate {
from {-moz-transform: rotate(0deg);}
to {-moz-transform: rotate(360deg);}
}
@-webkit-keyframes myrotate {
from {-webkit-transform: rotate(0deg);}
to {-webkit-transform: rotate(360deg);}
}
@-o-keyframes myrotate {
from {-o-transform: rotate(0deg);}
to {-o-transform: rotate(360deg);}
}
</style>


<div class="img">
<img src="chilun.png" alt="">
</div>

Div由拖拽改变大小

演示demo
当我们运用html元素”textarea”写一个文本输入框时,浏览器会自动生成以下样式

用鼠标拖动右下角的小三角就可以对文本框的大小进行重新设置,于是我们试着在一个div中实现与上述相似的功能

先看布局

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
<style>
#div1 {
width:10px;
height:10px;
background:red;
position:absolute;
z-index:2;
bottom:0;
right: 0;
cursor: nw-resize;
background: url(images/drag_ico.gif);
}

#div2 {
position: relative;
width: 200px;
height: 150px;
background: #ccc;
}

.box {
position: absolute;
border: 1px dashed #000;
}

</style>



<div id="div2">
<div id="div1"></div>
</div>

用父元素div2代替“文本框”,用div1代替小三角,这里的定位,为后面的js实现方法打下了基础

JS的实现方法

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
<script>
window.onload = function() {
var oDiv = document.getElementById('div1');
var oDiv2 = document.getElementById('div2');

oDiv.onmousedown = function(ev) {
var oEvent = ev || event;
var disX = oEvent.clientX - oDiv.offsetLeft;
var disY = oEvent.clientY - oDiv.offsetTop;

document.onmousemove = function(ev) {
var oEvent = ev || event;
oDiv2.style.width = oEvent.clientX - disX + oDiv.offsetWidth + 'px';
oDiv2.style.height = oEvent.clientY - disY + oDiv.offsetHeight + 'px';

};

document.onmouseup = function() {
document.onmousemove = null;
document.onmouseup = null;
};

return false;
};
};
</script>

将小三角移动的x轴和y轴长度反应到其父元素的宽高上面,便得到了这样的效果

在拖动过程中检测两个div是否有重合

布局并不麻烦,两个div,定宽高、背景颜色即可
演示demo
逆向思维:既然我们要检测div在运动过程中是否重合,那如果知道什么时候不重合,剩下的情况就是重合了,在这里,分析不重合的情况显然比分析重合的情况要容易
如图,当r1r2, t2>b2,这四个条件只要有任意一个成立,都会导致两个div不重合,这里的t,l,b,r在下面的代码中有详细定义。

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
<script>
window.onload = function() {
var oDiv = document.getElementById('div1');
var oDiv2 = document.getElementById('div2');

oDiv.onmousedown = function(ev) {
var oEvent = ev || event;
var disX = oEvent.clientX - oDiv.offsetLeft;
var disY = oEvent.clientY - oDiv.offsetTop;

document.onmousemove = function(ev) {
var oEvent = ev || event;

oDiv.style.left = oEvent.clientX - disX + 'px';
oDiv.style.top = oEvent.clientY - disY + 'px';

var l1 = oDiv.offsetLeft;
var r1 = l1 + oDiv.offsetWidth;
var t1 = oDiv.offsetTop;
var b1 = t1 + oDiv.offsetHeight;

var l2 = oDiv2.offsetLeft;
var r2 = l2 + oDiv2.offsetWidth;
var t2 = oDiv2.offsetTop;
var b2 = t2 + oDiv2.offsetHeight;

if (r1 < l2 || l1 > r2 || b1 < t2 || t1 > b2) {
oDiv2.style.backgroundColor = 'yellow';

} else {
// 发生碰撞的时候
oDiv2.style.backgroundColor = 'green';
}
};

document.onmouseup = function() {
document.onmousemove = null;
document.onmouseup = null;
};
};
};
</script>

写出position属性的属性值,简述各值的感化与差别

position: static;

元素框正常生成,块级元素生成一个矩形框,作为文档流的一部分,行内元素则会创建一个或多个行框,置于其父元素中

position: relative;

元素框偏移某个距离,元素仍然保持位定位前的形状,它原本所占的空间仍然保留

position: absolute;

元素从文档流完全删除,相对于包含块定位,包含块可能是元素中的另一个元素或者初始包含块()。元素原先在正常文档流中所占的空间被关闭,且定位后的元素会生成一个块级框

position: fixed;

相当于包含块是视窗的position: absolute;

写出一个两列等高,左列固定宽度为300px,右列自适应浏览器的布局

这里参考豆瓣克军大牛的一篇文章

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
<style>
body {
height: 500px;
}

.left {
background: yellow;
width: 300px;
float: left;
height: 100%;
}

.right {
overflow: hidden;
zoom: 1;
background: green;
height: 100%;
}

</style>

<body>
<div class="left"></div>
<div class="right">
<p>abcd</p>
<p>abcd</p>
<p>abcd</p>
<p>abcd</p>
<p>abcd</p>
<p>abcd</p>
<p>abcd</p>
<p>abcd</p>
<p>abcd</p>
<p>abcd</p>
</div>
</body>

写一个获取url中参数的值的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function getRequest() {

var url = window.location.search;

var oRequest = new Object();

if (url.indexOf('?') !== -1) {

url = url.substr(1); // 取得?以后的字符串

var reqArr = url.split('&');

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

oRequest[(reqArr[i].split('='))[0]] = unescape((reqArr[i].split('='))[1]);
}

}

return oRequest;

}

有字符串在的地方就少不了正则表达式

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
// 根据参数获取参数值
function getQueryString(name) {

var reg = new RegExp("(^|&)"+name+"=([^&]*)(&|$)", "i");

var ret = location.search.substr(1).match(reg);

return ret === null ? null : ret[2];
}

console.log(getQueryString("key"));


// 返回参数与参数的值对象
function getRequest() {
var searchStr = decodeURI(window.location.search);
var reg = /([\u4E00-\u9FFFa-zA-Z0-9_]+=[\u4E00-\u9FFFa-zA-Z0-9_]+)/g;
var aRes = [];
var oRequest = {};
var i = 0;
aRes = searchStr.match(reg);
for (i = 0; i < aRes.length; i++) {
oRequest[(aRes[i].split('='))[0]] = (aRes[i].split('='))[1];
}
return oRequest;
}
console.log(getRequest());

写出一个3X5的方格一共有几许个矩形的推导过程以及成果

每个矩形都是由两条水平直线和两条竖直直线组成的,那么水平直线的取法有 32/(21) = 3,竖直线的取法有 54/(21) = 10,则矩形个数为30(不知道这里正方形算不算矩形……)

  • 简单用代码实现下JS中的原型持续,并且画图申明其父类与子类的原型关系
  • 用JS代码简单介绍本身
  • JS中的数据类型?如何断定一个变量是否是String类型

在ECMAScript有5种基本数据类型: Undefined/Null/Boolean/Number/String, 以及一种复杂数据类型Object。

1
2
3
4
5
6
7
8
var str = new String("abcd");
console.log(typeof str); // object
console.log(Object.prototype.toString.call(str) === "[object String]"); // true

var str1 = "abcd";

console.log(typeof str1); // string
console.log(Object.prototype.toString.call(str1) === "[object String]"); // true

子查询(Subquery)是指出现在其他 SQL 语句内的select子句

例如:

1
select * from t1 where col1 = (select col2 from t2);

其中 select * from t1, 称为Outer Query/Outer Statement

select col2 from t2 ,称为 SubQuery

子查询指嵌套在查询内部,并且始终出现在圆括号内

子查询有多个关键字或条件,如 distinct , group by, order by, limit, 函数
子查询的外层查询可以是 : select, insert, update, setdo

子查询可以返回标量、一行、一列或子查询

由比较运算符(=,>,<,>=,<=,<>,!=,<=>)引发的子查询

语法结构 : operand comparison_operator subquery
子查询实例

求所有商品的平均价格

1
select round(avg(goods_price), 2) from tdb_goods;

列出所有商品价格在平均价格之上的商品

1
2
3
select goods_id,goods_name,goods_price from tdb_goods

where goods_price >= (select round(avg(goods_price),2) from tdb_goods);

用 SOME(任意一个),ANY(任意一个),ALL(所有的) 修饰比较运算符

由 [NOT] IN 、[NOT] EXISTS引发的查询

= ANY运算符 与IN 等效,!=ALL<>ALLNOT IN 等效;
如果子查询返回任何行,EXIST将返回TRUE,否则返回false;

使用 INSERT…SELECT 插入记录(便于使用外键实现)

在一个数据表的分类中,可能存在大量重复的数据,这时候可以奖建立两个数据表关联,提高查询效率。
实例

1
2
将查询结果写入数据表
Insert tdb_goods_cates(cate_name) select goods_cate from tdb_goods group by goods_cate;

多表更新

多表的更新基本上与单表更新相似。
连接类型

1
2
3
4
5
6
7
8
9
INNER JOIN(与JOIN,CROSS JOIN等价) 内连接,

LEFT[OUTER] JOIN 左外连接

RIGHT[OUTER] JOIN 右外连接

SQL语句实例

update tdb_goods inner join tdb_goods_cates on goods_cate = cate_name set goods_cate = cate_id;

多表更新之一步到位 – CREATE … SELECT

SQL语句实例

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create table tdb_goods_brands

    (

    brand_id smallint unsigned primary key auto_increment,

    brand_name varchar(40) not null

    )
    select brand_name from tdb_goods group by brand_name;

  2. 当两个表的字段名相同时,可以为两个表分别起一个别名,例如下面的g和b:

1
update tdb_goods as g inner join tdb_goods_brands as b on g.brand_name = b.brand_name set g.brand_name = b.brand_id;
  1. 修改表的结构
1
alter table tdb_goods change goods_cate cate_id smallint unsigned not null,change brand_name brand_id smallint unsigned not null;

连接的语法结构

内连接 INNER JOIN

通常使用 ON 关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤。
内连接:显示左表及右表符合条件的记录(交集)。
SQL语句实例

1
select goods_id,goods_name,cate_name from tdb_goods inner join tdb_goods_cates on tdb_goods.cate_id =tdb_goods_cates.cate_id;

外连接 OUTER JOIN

  1. 左外连接: 显示左表中的全部和右表中符合条件的部分。
1
select goods_id,goods_name,cate_name from tdb_goods left join tdb_goods_cates on tdb_goods.cate_id = tdb_goods_cates.cate_id;
  1. 右外连接: 显示右表中的全部和左表中符合条件的部分。
1
select goods_id,goods_name,cate_name from tdb_goods right join tdb_goods_cates on tdb_goods.cate_id =tdb_goods_cates.cate_id;

多表连接

1
2
3
4
5
select goods_id,goods_name,cate_name,brand_name,goods_price from tdb_goods as g

inner join tdb_goods_cates as c on g.cate_id = c.cate_id

inner join tdb_goods_brands as b on g.brand_id = b.brand_id\G;

查看Demo

思路

  1. div盒子
  2. 鼠标按下事件onmousedown
  3. 鼠标移动事件onmousemove,获得鼠标的坐标,将div移动至鼠标的当前坐标
  4. 鼠标抬起事件omouseup,清除鼠标移动事件和鼠标抬起事件

布局和代码

1
2
3
4
5
6
7
8
9
<style>
#div1 {
background: rgb(40,40,40);
width: 100px;
height: 100px;
position: absolute;
color: #fff;
}

</style>

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
57
58
59
60
    <body>
实例文字实例文字实例文字实例文字
<div id="div1">实例文字</div>
实例文字实例文字实例文字实例文字
<script>
window.onload = function() {
drag("div1");
}
function drag(id) {
var oDiv = document.getElementById(id);

oDiv.onmousedown = function(ev) {
var oEvent = event || ev;
var disX = oEvent.clientX - oDiv.offsetLeft;
var disY = oEvent.clientY - oDiv.offsetTop;
oDiv.style.cursor = "move";

// for IE
if (oDiv.setCapture) {
oDiv.onmousemove = fnMove;
oDiv.onmouseup = fnUp;
oDiv.setCapture();
} else {

document.onmousemove = fnMove;
document.onmouseup = fnUp;
}

function fnMove(ev) {
var oEvent = event || ev;
var l = oEvent.clientX - disX;
var t = oEvent.clientY - disY;

// 磁性吸附
if (l < 50) {
l = 0;
} else if (l > document.documentElement.clientWidth - oDiv.offsetWidth-50) {
l = document.documentElement.clientWidth - oDiv.offsetWidth;
}
if (t < 50) {
t = 0;
} else if (t > document.documentElement.clientHeight - oDiv.offsetHeight-50) {
t = document.documentElement.clientHeight - oDiv.offsetHeight;
}
oDiv.style.left = l + 'px';
oDiv.style.top = t + 'px';

};
function fnUp() {
this.onmousemove = null;
this.onmouseup = null;
if (this.releaseCapture) {
this.releaseCapture();
}
}
return false; // 阻止文字选中
}
}
</script>

</body>

DEBUG

  • 当页面中有其他元素的时候,鼠标拖拽时,会默认地去选中其他的诸如文字之类的东西,布局中的“实例文字”就是为此准备的。我们可以加入return false来解决掉很多浏览器默认事件,在这里就有一个很好的应用
  • 微软的IE总是有自己的一套,这给js兼容带来了很大的麻烦,上述的bug解决方法在IE6下根本无效,因此这里引入了IE特有的setCapture(),IE中,假设id为div1一个元素设置了setCapture(),然后再绑定事件,比如一个点击事件,接下来,无论你点击哪里,被触发的都是div1元素的点击事件了,甚至你点击浏览器的地址栏,工具栏,都会触发div1的点击事件()。此时你的ie浏览器会像中毒一样,点击关闭按钮都是在触发div1的点击事件(),其他元素不管在div之上还是之下的,他们绑定的点击事件全部失效。
  • 这里刚好可以运用IE的setCapturereleaseCapture,当鼠标的div1上按下时,为div1 setCapture,这时所有的事件都集中到了div1身上,捕获所有事件,再也不会去选中其他的元素了,在鼠标抬起后,运用releaseCapture,不再捕获。

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
57
58
59
60
61
62
63
64
65
66
67
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="http://www.baidu.com" id="frm">
用户名<input type="text" name="" id="">
密码<input type="password" name="" id="">
<input type="submit" value="登陆">
<a href="javascript:;" id="clear">清除记录</a>
</form>

<script>
function setCookie (name, value, iDay){
var oDate = new Date();
oDate.setDate(oDate.getDate()+iDay);
document.cookie = name+"="+value+";expires="+oDate;
}

function getCookie (name){
var cookieArr = document.cookie.split("; ");

for (var i = 0; i < cookieArr.length; i++) {
var oneCookie = cookieArr[i].split("=");
if (oneCookie[0] === name) {
return oneCookie[1];
}
}

return '';
}

function removeCookie (name) {
setCookie(name, '1', -1);
}

function addListener (target, type, handler) {
if (target.attachEventListener) {
target.attachEventListener(type, handler, false);
} else if (target.attachEvent) {
target.attachEvent("on"+type, handler);
} else {
target["on"+type] = handler;
}
}

window.onload = function (){
var oForm = document.getElementById("frm");
var oUser = oForm.getElementsByTagName("input")[0];
var oClear = oForm.getElementsByTagName("a")[0];
oForm.onsubmit = function (){
var username = oUser.value;
setCookie("username", username, 30);
}

oUser.value = getCookie('username');

addListener(oClear, "click", function(){
removeCookie("username");
oUser.value = '';
});
}
</script>

</body>
</html>

系统分区

  1. 磁盘分区
    使用分区编辑器(partition editor)在磁盘上划分几个逻辑部分。碟片一旦划分成 数个分区,不同类的目录与文件可以存储进不同的分区。
  2. 分区类型
    主分区:最多只能有4个。
    扩展分区:最多只能有1个。主分区加扩展分区最多有4个。不能写入数据,只能包 含逻辑分区。
    逻辑分区
  3. 格式化(高级格式化)
    它是指根据用户选定的文件系统(如 FAT16,FAT32,NTFS,EXT2,EXT3,EXT4等),在磁盘的特定区域写入数据,在分区中划分出一片用于存放文件分配表、目录表等用于文件管理的磁盘空间。
  4. iNode 号
    inode包含文件的元信息,具体来说有以下内容:
1
2
3
4
5
6
7
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime 指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
  1. 硬件设备文件名
    在linux 中,每个硬件都对应一个设备文件名
  2. 挂载
    必须分区
    根分区
    swap分区(交换分区,内存2倍,不超过2GB)
    
    推荐分区
    /boot (启动分区 200MB)
    

Linux 系统安装

设置Linux的IP地址 ifconfig eth0 192.168.233.2

linux 常用命令

4.1.1  命令格式与目录处理命令ls
    ls -a 可以看到隐藏文件(带有.)
    ls -l  长格式显示
    ls -lh  长格式人性化显示(自动转换文件大小的单位)

    ls -ld /etc  查看指定目录的详细信息
    ls-i 查看 inode 节点

    文件类型: -普通文件 d目录 l软链接
        r所属人 g所属组 o其他人
    文件权限    r读 w写 x执行
4.1.2 目录处理命令    
    mkdir 创建目录
    mkdir /tmp/zhongshan 可以同时创建多个目录
    mkdir -p /tmp/zhongshan/liu   当/zhongshan 目录不存在的时候创建 /liu 目录

    cd 目录名  change directory切换目录
    cd ..       返回上一级目录
    pwd          print working directory 显示当前工作目录

    rmdir  remove empty directory  删除空目录
    cp -rp [原文件或目录][目标目录]  复制过程中可以改文件名
         -r  复制目录
         -p 保留文件属性(修改时间等)
    mv [原文件或目录][目标目录]   剪切文件、改名,move
    rm -rf [文件或目录]
         -r 删除目录
         -f 强行执行( false )
    ctrl+c 终止命令 , ctrl+l 清屏
4.1.3 文件处理命令
    touch [文件名] 创建文件 文件名允许使用大多数字符,除了'/'
    cat 显示文件内容
    cat -n 显示行号
    tac 文件倒着显示
    more 显示长文件,使用空格或f翻页,(enter)换行,q退出
    less 与more类似,显示长文件。按(page up)可向前翻页,按(^)可向上翻行。'/'+关键词可以搜索关键词,此时可以按'n'查找下一个高亮显示
    head/tail -n 20 /etc/services   查看文件的前(后)20行,如果不指定行数,默认显示前10行
    tail -f [文件名]   动态显示文件末尾的内容, ctrl+c 终止命令
4.1.4 链接命令
    ln -s [原文件][目标文件]  创建软链接,软链接特征类似于Windows的快捷方式,它的权限不影响原文件的权限,软链接可以跨分区,可以针对目录使用
    ln [原文件][目标文件]  创建硬链接,硬链接不能跨分区,两个文件可以同步更新,且他们的i节点相同,不可以针对目录使用
4.2.1 权限管理命令
    chmod (change the permissions mode of file)  
    chmod [{ugoa}{+-=}{rwx}][文件名]
               [421][文件名]
               -R 递归修改,更改其子目录的权限
    -------------------权限有继承关系----------------------------------------------
    directory     r:ls
           w: touch/mkdir/rmdir/rm
           x: cd (一般r和x 成对出现)
4.2.2 其他权限管理命令
    chown (change file ownership)更改文件的所有者(只有root 可以改)
    chgrp (change file group ownership) 更改文件的所属组(只有root 可以改)
    umask -S 查看新建文件默认的权限(任何新建的文件都不具备x可执行)
    umask 023 可以更改当前新建文件的默认权限
4.3.1 文件搜索命令
    find [搜索范围][匹配条件]
    find /etc -name init  在/etc 目录下查找文件init,精准的搜索
    find /etc -name *init* 在/etc 目录下查找包含init的文件,模糊的搜索
    find /etc -name init???  匹配以 init 开头,后面有3个字符的文件
    (ctrl+q解决secureCRT 假死问题)
    find /etc -iname init???  忽略文件名大小写
    find / -size +n 搜索文件大小大于n 的文件(一个数据块是0.5kb)
    find /home -user zhongshan 查找所有者为 zhongshan 的文件
    find /home -group brothers 查找所属组为 brothers的文件
    find /etc -cmin -(+)5 在/etc 在查找5分钟内(外)被修改过属性的文件和目录
                 -amin      访问时间access
                 -mmin    文件内容modify 
    -o --->or        -a ---->and
    find /etc -size +163840 -a -size -204800   (and)查找大于80M小于100M的文件
                  -o      or或
    -type根据文件类型查找  f文件 d目录 l软链接文件
    find /etc -name inittab -exec ls -l {} \;   在/etc 下查找inittab文件并显示其详细信息    
    find /etc -name inittab -ok ls -l {} \;   在/etc 下查找inittab文件并显示其详细信息询问确认        

    find . -inum 130715 -exec rm {} \;   在当前目录下根据 i 节点找到文件并删除
4.4 帮助命令-帮助命令
    man    原义为manual 
    man ls 查看ls命令的帮助信息
    man services  查看配置文件的帮助信息
    1  命令的帮助, 5  配置文件的帮助
    man 5 passwd   查看passwd 配置文件的帮助
    whatis ls 得到ls 命令的一个简短的信息
    apropos services  查看配置文件的简短信息
    touch --help  查看命令的选项
    date 070222552015.00  更改系统时间
    info         与man相似
    help umask    shell内置命令的详细信息(找不到命令所在位置的命令)
4.5 文件搜索命令-用户管理命令
    useradd 用户名     添加用户(用户名不要太复杂)
    passwd 用户名     修改用户名密码
    who     查看在线登陆用户信息,tty为本地登陆,pts表示远程终端
    w   得到更为详细的登陆信息
    uptime   查看系统使用情况
4.6 文件搜索命令-压缩解压命令
    压缩格式:.gz  .zip(windows和linux兼容)
    gzip 文件名     压缩文件,只能压缩文件,不可压缩目录,不保留原文件
    gunzip 文件名     解压文件
    tar -cvf Japan.tar Japan   将Japan目录打包成Japan.tar文件
    tar -zcf Japan.tar.gz Japan       打包压缩一步完成
    tar -zx(v)f Japan.tar.gz    解压命令
    zip Japan.zip Japan      将Japan 压缩成Japan.zip 
    unzip Japan.zip         解压文件
    bzip2  -k boduo       压缩文件且保留原文件
    tar -cjf Japan.tar.bz2 Japan  打包压缩一步完成
    tar -xjf Japan.tz2           解压缩
4.7 网络命令
    write 用户名     给在线用户发信息 ctrl+D 保存结束
    wall 给所有在线用户发信息
    ping 选项 IP地址 -c指定发送次数   packet loss(丢包率)
    ifconfig 查看当前网卡状态
    mail [用户名]  查看发送电子邮件
    mail 查看邮件, 序列号查看邮件内容, h查看列表, d+序列号删除邮件,q退出邮件系统
    last 统计计算机所有的登录用户以及重启记录
    lastlog  查看某特定用户上次登录的时间
    lastlog -u 520 查看用户id为502的上次登录时间
    traceroute www.lampbrother.com  显示数据包到主机的路径
    netstat [选项] 显示网络相关信息
        -t    TCP协议
        -u   UDP协议
        -l    监听
        -r   路由
        -n  显示IP地址和端口号
    netstat -tlun 查询当前本机监听的端口
    netstat -an  查询本机所有的网络连接
    netstat -rn   查询本机路由表
    setup   配置网络(永久生效)
    service network restart 重启网络服务
    mount  -t iso9660 /dev/sr0 /mnt/cdrom/ 挂载光盘
    umount /dev/sr0 卸载光盘
4.8 关机重启命令
    shutdown -h now 现在关机
    shutdown -r now  现在
    shutdown -c  取消前一个关机命令
    reboot 重    启
    init 6   重启
    runlevel 查询当前运行级别
    logout  退出登录
5.1 Vim常用操作
    vi filename   进入
    按下ESC  进入命令模式
    进入命令模式后
        a 在光标所在字符后插入
        A 在光标所在行行尾插入
        i 在光标所在字符前插入
        I 在光标所在行行首插入
        o 在光标下插入新行
        O 在光标上插入新行
        :set nu  设置行号
        :set nonu 取消行号
        gg 到第一行
        G 到最后一行
        nG 到第n行
        :n  到第n行
        $  移至行尾
        0  移至行首
        x  删除光标所在处的字符
        n 删除光标所在处n个字符
        dd 删除光标所在行, ndd删除n行
        dG 删除光标所在行到文件末尾内容
        D 删除光标所在处到文件末尾的内容
        :n1,n2d 删除光标所在范围内行
        yy 复制当前行
        nyy 复制当前行以下n行
        dd 剪切当前行
        ndd 剪切当前行以下n行
        p/P  粘贴在当前光标所在行下或行上
        u 取消上一步操作
        r  取代光标所在处字符
        R 从光标所在处开始替换字符,按ESC结束
        set ic 不区分大小写
        set noic 不区分大小写
        /string 指定搜索字符串
        n 搜索指定字符串的下一个位置
        :%s/old/new/g  全文搜索替换指定字符串
        :%s/old/new/g  全文搜索替换指定字符串(询问确认)
        :n1,n2s/old/new/g  在一定范围内搜索替换指定字符串
        :w 保存修改
        :w new_filename 另存为指定文件
        :wq 保存退出
        ZZ 快捷键,保存修改并退出
        :q! 不保存修改退出
        :wq! 保存修改并退出(文件所有者以及root可使用)
5.2 Vim使用技巧
    :r 文件名   导入文件的内容
    :r !命令   导入命令执行结果
    定义快捷键
        map 快捷键 触发命令
    :map ^p(ctrl+v+p) I#<ESC>  ctrl+p 设置快捷键跳到行首添加#
    :map ^B 0x  跳到行首删除第一个字符
    连续行注释
        :n1,n2s/^/#/g
        :n1,n2s/^#//g   去掉行首的#
        :n1,n2s/^/\/\//g   替换时转义
    :ab zhongshan zhongshanshanshanshan
    /home/username/.vimrc   配置相关快捷键(永久生效)
6.1 软件包管理
    软件包分类:源码包(脚本安装包)和二进制包(RPM包、系统默认包)