在学习过程中零碎的知识点记录以及一些想法,加深印象,强化记忆。
五、Ajax
~ 无刷新数据读取;用户注册、在线地图、聊天室、webQQ、微博;
Ajax能且仅能 从服务器读取一个文件,要注意文本文件和网页的编码要统一(utf-8)
只读一次,后面加载缓存,?t=1213 用get提交数据
可以用?t=new Date().getTime 使每次都重新加载;
eval()计算字符串里的值,如果参数是一个表达式,eval() 函数将执行表达式。如果参数是Javascript语句,eval()将执行 Javascript 语句。
原理:
Http请求方法:GET - 获取数据(浏览帖子) POST - 上传数据(用户注册);
form的action属性是用来确定表单提交到哪里,method属性默认为get
<form action="www.baidu.com" method="get" accept-charset="utf-8">
用户名:<input type="text" name="user"/>
密码:<input type="password" name="pass" />
</form>
get方式把数据放到url 里面提交;post把数据放在http content里;
get安全性很低;post安全性一般;
get容量很低;post容量几乎不限
get便于分享;post不便于分享
~ 编写Ajax
1.创建ajax对象
//创建AJAX对象 var oAjax = null; if(window.XMLHttpRequest){ //不存在的变量会报错,不存在的属性仅仅是undefined oAjax = new XMLHttpRequest(); }else{ oAjax = new ActiveXObject("Microsoft.XMLHttp"); }
2.跟服务器连接
oAjax.open(方法,URL,异步);
3.发送请求
oAjax.send();
4.接收返回
oAjax.onreadystatechange = function(){ if(oAjax.readyState == 4){ if(oAjax.status == 200){ alert('成功'+oAjax.responseText); //获得字符串形式的响应数据 }else{ alert('失败'); } } };
六、运动
var timer = null; var btn = document.getElementById("btn"); function startMove(){ clearInterval(timer);//先清定时器,防止定时器叠加 var odiv = document.getElementById("div"); timer = setInterval(function(){ var ispeed = 1; //设定速度 if (odiv.offsetLeft >= 300) {//到300距离停止 clearInterval(timer); }else{ //用了else到达位置后不执行 odiv.style.left = odiv.offsetLeft + ispeed +'px'; } },30); } btn.onclick = startMove;
运动框架
开始运动时,关闭已有定时器,把运动和停止隔开(if..else)
JS匀速运动:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
#div1 {100px; height:100px; background:red; position:absolute; left:600px; top:50px;}
#div2 {1px; height:300px; position:absolute; left:300px; top:0; background:black;}
#div3 {1px; height:300px; position:absolute; left:100px; top:0; background:black;}
</style>
<script>
window.onload=function(){
var btn1 = document.getElementById('btn1');
var btn2 = document.getElementById('btn2');
var btn3 = document.getElementById('btn3');
var btn4 = document.getElementById('btn4');
var oDiv = document.getElementById('div1');
var timer = null;
btn1.onclick = function(){
startMove(100);
}
btn2.onclick = function(){
startMove(300);
}
function startMove(iTarget){
clearInterval(timer);
timer = setInterval(function(){
var speed = 0;
if(oDiv.offsetLeft<iTarget){
speed = 7;
}else{
speed = -7;
}
if(Math.abs(iTarget-oDiv.offsetLeft)<=7){
clearInterval(timer);
oDiv.style.left = iTarget+'px'; //最后一步小于speed7时 让它直接到达目标
}else{
oDiv.style.left=oDiv.offsetLeft+speed+'px';
}
},30)
}
}
</script>
</head>
<body>
<input type="button" id="btn1" name="" value="到100" >
<input type="button" id="btn2" name="" value="到300">
<input type="button" id="btn3" name="" value="运动到100">
<input type="button" id="btn4" name="" value="运动到300">
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
</body>
</html>
JS缓冲运动
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>缓冲运动</title> <style> #div1 {100px; height:100px; background:red; position:absolute; left:600px; top:50px;} #div2 {1px; height:300px; background:black; position:absolute; left:300px; top:0;} </style> <script> window.onload = function(){ var btn = document.getElementById('btn1'); var oDiv = document.getElementById('div1'); var timer = null; btn.onclick = function(){ startMove(300); }; function startMove(iTarget){ clearInterval(timer); timer = setInterval(function(){ var speed = (iTarget - oDiv.offsetLeft) / 10; //但凡用到缓冲运动,一定要0+向上/0-向下取整 speed = speed>0?Math.ceil(speed) : Math.floor(speed); oDiv.style.left = oDiv.offsetLeft+speed+'px'; },30); } }; </script> </head> <body> <input id="btn1" type="button" value="缓冲运动到300" /> <div id="div1"></div> <div id="div2"></div> </body> </html>
JS多物体缓冲运动+解决BUG:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style type="text/css" media="screen">
div{
100px;
height: 100px;
background: red;
margin: 10px;
border: 1px solid black;
}
</style>
<script>
window.onload = function(){
var aDiv = document.getElementsByTagName('div');
for (var i = 0; i < aDiv.length; i++) {
aDiv[i].timer = null;
aDiv[i].onmouseover = function(){
startMove(this,400);
}
aDiv[i].onmouseout = function(){
startMove(this,100);
}
};
}
function startMove(obj,iTarget){
clearInterval(obj.timer);//清理各自的定时器
obj.timer = setInterval(function(){
//每个运动的物体,都开一个属于自己的定时器
var speed = (iTarget - parseInt(getStyle(obj,'width'))) / 6;//这里也要换成getStyle()
speed = speed>0 ?Math.ceil(speed):Math.floor(speed);
if (obj.offsetWidth == iTarget) {
clearInterval(obj.timer);
} else{
obj.style.width = parseInt(getStyle(obj,'width'))+speed +'px';
//因为有边框,width和offsetWidth获取的值不同,所以要用getStyle()防止出现回不到原位的问题
};
},30);
function getStyle(obj,attr){
if (obj.currentStyle) {
return obj.currentStyle[attr];//兼容IE,不兼容火狐谷歌
} else{
return getComputedStyle(obj, false)[attr];//兼容火狐谷歌不兼容IE
};
}
};
</script>
</head>
<body>
<div></div>
<div></div>
<div></div>
</body>
</html>
类似offsetWidth和offsetHeight 都会包括边框,但是width和height不包含边框 所以就会有BUG 需要用 obj.currentStyle 或者getComputedStyle 获取只是width 或height的样式
function getStyle(obj,attr){ return obj.currentStyle ? obj.currentStyle[attr] : window.getComputedStyle(obj,false)[attr]; }
~ 任意值运动框架
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style type="text/css" media="screen">
div{
100px;
height: 100px;
margin: 20px;
float: left;
background: #ccc;
border: 10px solid black;
font-size: 14px;
}
</style>
<script>
window.onload=function(){
var oDiv1= document.getElementById('div1');
var oDiv2= document.getElementById('div2');
var oDiv3= document.getElementById('div3');
var oDiv4= document.getElementById('div4');
oDiv1.onmouseover = function(){
startMove(this,'height',400);
};
oDiv1.onmouseout = function(){
startMove(this,'height',100)
};
oDiv2.onmouseover = function(){
startMove(this,'width',400);
};
oDiv2.onmouseout = function(){
startMove(this,'width',100)
};
oDiv3.onmouseover = function(){
startMove(this,'fontSize',30);
};
oDiv3.onmouseout = function(){
startMove(this,'fontSize',14)
};
oDiv4.onmouseover = function(){
startMove(this,'borderWidth',30);
};
oDiv4.onmouseout = function(){
startMove(this,'borderWidth',10)
};
}
//开始运动
function startMove(obj,attr,iTarget){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
var current = parseInt(getStyle(obj,attr));
var speed = (iTarget-current)/6;
speed = speed>0 ? Math.ceil(speed):Math.floor(speed);
if (current == iTarget) {
clearInterval(obj.timer)
} else{
obj.style[attr] = current+speed +'px';
};
},30)
}
//获取综合样式
function getStyle(obj,attr){
return obj.currentStyle ? obj.currentStyle[attr] : window.getComputedStyle(obj,false)[attr];
}
</script>
</head>
<body>
<div id="div1">变高</div>
<div id="div2">变宽</div>
<div id="div3">abcdefg</div>
<div id="div4"></div>
</body>
</html>