焦点 、event对象、事件冒泡、事件绑定、AJAX知识点备忘
焦点:使浏览器能够区分用户输入的对象,当一个元素有焦点的时候,那么他就可以接收用户的输入。
设置焦点的几种方式:
1、点击
2、TAB键
3、JS
onfocus onblur 属性
var oinp=document.getElementById(‘shuru‘)
oinp.onfocus=function(){
if(oinp.value==‘请输入‘){
oinp.value=‘‘
}
}
oinp.onblur=function(){
if(oinp.value==‘‘){
oinp.value=‘请输入‘
}
}
-----------------------------------
JS设置焦点 如点击百度首页 已进入页面 焦点就会自动搜索框里面
focus() blur() select()方法
chrome ff 不支持操作复制 可以用select()方法
xxx.focus()
---------------------------------------------------
事件对象:当一个事件发生的时候,当前这个对象发生的这个事件的一些详细信息(json)被临时保存
到一个指定地方---event对象,必须事件发生后才能用,在事件调用函数里面使用,就像飞机的黑匣子
IE/Chrome :event是一个内置对象 就像document对象一样
如 document.onclick=alert(1) 这个就不是点击事件发生后执行的,这个是一打开网页就执行了,和点击事件没关系
,而事件对象必须是在当前这个事件发生后才能获取相关事件信息,所以用函数把后面这一块包起来,让他点击后才发生后面的事件
document.onclick=function(){alert(event)} 这样才能获取当前点击事件的event信息。
function haha(){
alert(event)
}
haha() //这样就不是事件调用的函数,会返回空或者未定义
document.onclick=haha //这样就是事件调用的,这样就会有点击的事件的相关信息
一个函数是不是事件函数,不在于定义的时候,而是在于调用的时候
FF下面调用事件对象,事件对象是通过事件函数的第一个参数传入的,如果一个函数是被事件调用的
那么这个函数定义的第一个参数就是事件对象
兼容:var ev=ev||event
查看点击事件EVENT事件对象的信息
function haha(ev){
var ev=ev||event
for(var attr in ev){
console.log(attr+‘=‘+ev[event])
}
}
document.onclick=haha
------------------------------------
clientX Y的使用 当一个事件发生的时候,鼠标到可视区的位置
window.onload=function(){
var odiv=document.getElementById(‘jieshao‘)
function haha(ev){
var st=document.documentElement.scrollTop||document.body.scrollTop
var ev=ev||event
odiv.style.display=‘block‘
odiv.style.left=ev.clientX+‘px‘
odiv.style.top=ev.clientY+st+‘px‘
}
document.onmousemove=haha
}
</script>
<body style="height:2000px;">
<p id=‘jieshao‘ style="background:red; position:absolute; display:none">详细信息</p>
</body>
--------------------------------------------
事件冒泡:当一个元素接收到事件(onclick,onmouseover...)的时候,他会把事件传播到他的父级,直到WIndow
也就是一个元素接收到事件的时候,他不仅触发他自己的事件,还会把事件传播到父级,父级又传播到父级.
<style>
div{padding:30px;}
#div1{background:red;}
#div2{background:green;}
#div3{background:blue; position:absolute; top:200px;}
</style>
<script>
window.onload=function(){
var odiv1=document.getElementById(‘div1‘)
var odiv2=document.getElementById(‘div2‘)
var odiv3=document.getElementById(‘div3‘)
function haha(){alert(this.id)}
odiv3.onclick=haha
/*odiv2.onclick=haha*/
odiv1.onclick=haha
}
</script>
<body>
<div id="div1">
<div id="div2">
<div id="div3">
</div>
</div>
</div>
</body>
-------------------------------------------
事件绑定函数
事件冒泡跟绑不绑定函数没关系
例子就如同我捡到100块钱,这就是一个事件,然后这100块钱怎么处理交给谁这就是一个函数
所以如上个例子
odiv3.onclick=haha
odiv2.onclick=haha
odiv1.onclick=‘‘
这里如果不给odiv3绑定函数,他也会冒泡到父级
阻止当前事件对象冒泡:
event.canceleBubble=true
-----------------------
例2.点击按钮显示列表,点击document,隐藏列表
因为input是document的子元素
所以当点击input的时候,列表先显示,然后冒泡把事件传播到document
而document又触发了接收到的点击事件,又把列表隐藏了。。所以切换速度太快,显示结果就是没变化,
<script>
window.onload=function(){
var odiv=document.getElementById(‘div1‘)
var oinp=document.getElementById(‘anniu‘)
oinp.onclick=function(ev){
odiv.style.display=‘block‘
/* var ev=ev||event
ev.cancelBubble=true */ 阻止当前点击事件冒泡
}
document.onclick=function(){
setTimeout(function(){
odiv.style.display=‘none‘
},1500)
}
}
</script>
<body>
<input type="button" id="anniu" value=‘点击‘/>
<div id="div1">
这是一个列表
</div>
</body>
----------------------------------
分享到按钮制作:只给父级加函数,子元素会在事件发生时把事件传播到父级
#div1{background:red;width:100px; height:200px; background:red; position:absolute; left:-100px;top:150px;}
#div2{width:20px; height:65px; position:absolute;right:-20px; top:60px;background:green;padding-top:15px;color:#fff}
</style>
<script>
window.onload=function(){
var odiv1=document.getElementById(‘div1‘)
odiv1.onmouseover=function(){
this.style.left=‘0px‘
}
odiv1.onmouseout=function(){
this.style.left=‘-100px‘
}
}
</script>
<body>
<div id="div1">
<div id="div2">分享到</div>
</div>
</body>
----------------------------------------------------------------------------
事件绑定第二种形式:
我们前面一般是这样绑定的(赋值形式)
xxx.onclick=function(){}
xxx.onmouseover=function(){}
取消绑定:
xxx.onclick=null
但是这样有个不足如下:
function fn1(){}
function fn2(){}
document.onclick=fn1
document.onclick=fn2
这样的话 第二个绑定函数会覆盖第一个绑定函数
为了能给某个对象同一个事件增加多个绑定函数
事件绑定的第二种方式:
IE 下:obj.attachEvent(事件名称,事件函数)
1.不能捕获
2.事件名称有on
3.this指向window
解决指向问题
call是函数下的一个方法
fn1.call()==fn1()
call()方法的第一个参数可以改变函数执行过程中内部this指向的问题
有其他参数的话,后面就紧跟其他的参数
如:
document.attachEvent(‘onclick‘,fn1)
document.attachEvent(‘onclick‘,fn2)
取消绑定:
doccument.deattachEvent(‘onclick‘,fn1)
doccument.deattachEvent(‘onclick‘,fn2)
改变this指向为document
document.attachEvent(‘onclick‘,function(){fn1.call(document)})
document.attachEvent(‘onclick‘,function(){fn2.call(document)})
标准下:obj.addEventListener(事件名称,事件函数,是否捕获)
是否捕获,默认下为false,即冒泡
1.能捕获
2.事件名称没有on
3.指向触发该事件函数的对象
document.addEventListener(‘click‘,fn1,false)
document.addEventListener(‘click‘,fn2,true)
取消绑定:
doccument.removeEventListener(‘click‘,fn1,false)
doccument.removeEventListener(‘click‘,fn2,true)
绑定方法封装:
function bind(obj,evname,fn){
if(obj.attachEvent){
obj.attachEvent(‘on‘+evname,
function(){fn.call(obj)}
)
}
else{
obj.addEventListener(evname,fn,false)
}
}
-----------------------------------------------------------
AJAX:
最简单的流程:
<script>
window.onload=function(){
var obtn=document.getElementById(‘btn‘)
obtn.onclick=function(){
var xhr;
try {
xhr = new XMLHttpRequest();
} catch (e) {
xhr = new ActiveXObject(‘Microsoft.XMLHTTP‘);
}
xhr.open(‘get‘,‘1.txt‘,true)
xhr.send()
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
if(xhr.status==200){
alert(xhr.responseText)}else{alert(‘错误信息:‘+xhr.status)}
}
}
}
}
</script>
<body>
<input type="button" value="按钮" id="btn" />
</body>
-------------------------------------------------------
//过程解释说明
<script>
window.onload=function(){
var obtn=document.getElementById(‘btn‘)
obtn.onclick=function(){
var xhr;
var xhr=new XMLHttpRequest() //创建一个AJAX对象,就像打开浏览器
//IE6下创建AJAX对象:new ActiveXObject(‘Miscrosoft.XMLHTTP‘)
//兼容写法:
/*if(window.XMLHttpRequest){
xhr=new XMLHttpRequest();
}else{xhr=new ActiveXObject(‘Microsoft.XMLHTTP‘)}*/
//或者用try catch的方式
//try catch 的用法
/*try {
//代码尝试执行这个块中的内容,如果有错误,则会执行catch{}, 并且传入错误信息参数
//alert(a);
//new throw();
//throw new Error(‘错了错了‘);直接抛错
} catch (e) {
alert(e);
}*/
try {
xhr = new XMLHttpRequest();
} catch (e) {
xhr = new ActiveXObject(‘Microsoft.XMLHTTP‘);
}
xhr.open(‘get‘,‘1.txt‘,true) //通过什么方式获取,获取东西得地址,是否异步,默认是异步,这一步相当于在浏览器地址栏输入地址
//异步 同步的说明 :异步(非阻塞)的意思是前面代码的不影响后面代码的执行。而同步(阻塞)就是前面代码会影响后面代码的执行
xhr.send()//提交
//等待服务器返回内容
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
alert(xhr.responseText)//获取的是字符串
}
}
}
}
</script>
<body>
<input type="button" value="按钮" id="btn" />
</body>
-----------------------------------------------------
readyState : ajax工作状态
responseText : ajax请求返回的内容就被存放到这个属性下面
on readystate change : 当readyState改变的时候触发
status : 服务器状态,http状态码
xhr.onreadystatechange = function() {
if ( xhr.readyState == 4 ) {
if ( xhr.status == 200 ) {
alert( xhr.responseText );
} else {
alert(‘出错了,Err:‘ + xhr.status);
}}}
-----------------------------------------------------
get方式缓存问题和中文乱码问题:
1.缓存 在url?后面连接一个随机数,时间戳
2.乱码 编码encodeURI
xhr.open(‘get‘,‘2.get.php?username=‘+encodeURI(‘中文‘)+‘&haha=hehe&‘ + new Date().getTime(),true);
xhr.send();
xhr.open(‘post‘,‘2.post.php‘,true);
//post方式,数据放在send()里面作为参数传递
xhr.setRequestHeader(‘content-type‘, ‘application/x-www-form-urlencoded‘);//申明发送的数据类型
//post没有缓存问题
//无需编码
xhr.send(‘username=中文&haha=hehe‘);
-----------------------------------------------------
同步 异步解释
setTimeout(function() {
alert(1);
}, 2000); //在这里定时器不会在2秒后执行后才执行下面的alert(2),这就是异步,不影响后面代码的执行
alert(2)
<script src="jquery.js"></script>-->
<script>
$(function(){}) //在这里如果没有上面的JQ引入,那么这里执行就会出问题,这就是同步,分先后,影响后面代码的执行
</script>
-----------------------------------------------------------
表单提交解释:
action:数据提交的地址, 默认提交当前页
method:提交的方式,默认是get方式
1.get
//age=
把数据名称和数据值用=连接,如果有多个的话,那么他会把多个数据组合用&进行连接,然后把数据放到url?后面传到指定页面
get方式缺点:
1、提交的数据大小限制
2、不安全,浏览器会缓存,通过历史记录会查看到提交的信息
2.post 理论上无限制
enctype : 提交的数据格式,默认application/x-www-form-urlencoded
<form action="1.get.php" enctype="application/x-www-form-urlencoded">
<input type="text" name="username" />
<input type="text" name="age" />
<input type="submit" value="提交" />
</form>
-----------------------------------------------------------
<script src="https://github.com/douglascrockford/JSON-js/blob/master/json2.js"></script>
JSON方法
JSON.stringify
可以把一个对象转成对应字符串
var arr=[1,2,3]
JSON.stringify(arr)
parse : 可以把字符串转成对应对象
var ostring = ‘[1,2,3]‘;
var oarr = JSON.parse(ostring);
//alert(oarr[0])
这里转换成数组
var ostring = ‘{"left":100}‘;
var ojson = JSON.parse(ostring);
alert(ojson.left)
这里转换成json对象
-----------------------------------------------------------
ajax封装:
function ajax(method, url, data, success) {
var xhr = null;
try {
xhr = new XMLHttpRequest();
} catch (e) {
xhr = new ActiveXObject(‘Microsoft.XMLHTTP‘);
}
if (method == ‘get‘ && data) {
url += ‘?‘ + data;
}
xhr.open(method,url,true);
if (method == ‘get‘) {
xhr.send();
} else {
xhr.setRequestHeader(‘content-type‘, ‘application/x-www-form-urlencoded‘);
xhr.send(data);
}
xhr.onreadystatechange = function() {
if ( xhr.readyState == 4 ) {
if ( xhr.status == 200 ) {
success && success(xhr.responseText);
} else {
alert(‘出错了,Err:‘ + xhr.status);
}
}
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。