2021-10-16

JS小白学习笔记(day_10)

一、获取窗口属性,获取dom尺寸

window.pageYOffset//滚动条Y轴
window.pageXOffset
document.body.scrollLeft/Top ie8 ie5
document.documentElement.scorllLeft/Top ie7 ie6

function getScrollOffset(){
	if(window.pageXOffset){
		return{
		    x:windows.pageXOffset,
		    y:windows.pageYOffset
		}
	}else{
	    return{
		x:document.body.scrollLeft+document.documentElement.scorllLeft,
		Y:document.body.scrollTop+document.documentElement.scorllTop
		}
    }
}
二、获取当前页面的宽高

控制台获取,支持ie8以上
window.innerWidth/Height
标准模式
document.documentElement.ClientWidth/clientHeight
怪异模式下
document.body.clientWidth/clientHeight

怎么看标准模式还是怪异模式
控制台输入:document.compatMode
CSS1Compat 标准模式
BackCompat 怪异模式

div.offsetWidth//div看起来是什么样加上padding值
div.offsetHeight
div.offsetLeft//对于有定位父级返回相对于最近的有定位的父级的坐标无定位的父级元素返回相对文档的坐标
dom.offsetParent//有定位的父级

三、获取滚动条位置
  1. body里面有默认的8像素
    window.scrool(x,y)//当前位置,不是当前距离
    window.scroolTo(x,y)//与上面功能一样
    window.scroolBy(x,y)//累加滚动距离

实现自动阅读功能

     <script>
    var div = document.getElementsByTagName('div')[0];
    var start = document.getElementsByTagName('div')[1];
    var over = document.getElementsByTagName('div')[2];
    var timer = 0;
    var key = true;
    start.onclick=function(){
        if(key){   
            timer = setInterval(function(){
            window.scrollBy(0,1);
        } ,100);
            key = false;
    }
}
    over.onclick = function(){     
        clearInterval(timer);
            key = true;
    }
  </script>
四、js获取行间样式

obj.style.width
1.复合型变成小头峰式命名
2.div.style.cssFloat=div.style.float//为了避免冲突
3.复合属性必须拆解
4.写入的值必须是字符串格式
除了.style没有任何方法可以写入css
window.getComputedStyle(div,null).width;
//获取元素根据权重问题(获取的最后值是经过计算的),返回是是计算样式,值都是绝对值,null可以获取伪元素的值

//window.getComputedStyle(div,"after").width;
//行内大于样式(如果加width=100px!important;)行内权重大
div.currentStyle.width//获取的不是经过计算的IE独有的属性
封装getStyle()
function getStyle(elem,prop){
	if(window.getComputedStyle){
		return window.getComputedStyle(elem,null)[prop];
}else{
	return elem.currentStyle[prop];
	}
}

//使用原生的js,addeventListener给每一个元素绑定一个click事件并且输出他们的顺序

    var myli = document.getElementsByTagName('li');
    for(var i = 0;i < myli.length;i++){
        (function(n){
            myli[n].addEventListener('click',function(){
            console.log(n+1);
        },false);
      }(i))
    }
五、事件

1.obj.onclick=funcion(){}
兼容性很好,但是只能绑定一个处理程序,基本等同于写在HTML行间上,this指向的是程序跟本身
2.obj.addEventListener('click',function(){},false);
IE9以下不兼容,可以为多个时间处理多个程度序可以给一个对象的一个事件绑定多个处理函数(不能给一个函数绑定多次)this指向的是程序跟本身。
3.obj.attachEvent('on'+type,fn);
只适合ie浏览器this指向window

封装addEvent函数绑定函数


   function addEvent(type,elem,handle){
        if(elem.addEventListener){
            elem.addEventListener(type,handle,false);
        }else{
            if(elem.attachEvent){
                elem.attachEvent("on" + type ,function(){
                    handle.call(elem);
                })
            }else{
                elem["on" + type] = handle; 
            }
        }
    }
    div.onclick=null;
    div.removeEventListener(type,fn,false);
    div.detachEvent('on',type,fn);

事件冒泡
结构上存在父子元素存在冒泡功能,结构上(非视觉上)嵌套关系的元素,会存在事件,自子元素冒泡向父元素。(自底向下)一个对象的一个事件类型就只有一个事件模型->捕获/冒泡。
事件捕获:
结构上非视觉上,嵌套关系的元素,会存在冒泡功能事件,自父元素捕获至子元素(事件源元素)。IE上没有捕获事件。触发顺序,先捕获,后冒泡。

focus,blur,change,submit,reset,select等事件不发生冒泡
W3C标准,e.stopPropagation();
IE独有e.cancelBubble=ture;

封装冒泡

div.onclick = function(e){
    stopBubble(e);
}
function stopBubble(event){
    if(event.stopPropagation){
	event.stopPropagation();
}   else{
	event.cancel.Bubble = ture;
	}
}

阻止默认事件oncontentmenu
return false;//以对象属性的方式注册的时间才生效
event.preventDefault();//W3C标准,IE以下不兼容
event.returnValue = false;//兼容IE

封装阻止默认事件的函数cancelHandler(event);

function cancelHandler(event){
    if(event.preventDefault){
	event.preventDefalut();
    }else{
	event.returnValue = false;
    }
}//可以把a标签的默认事件取消<a href="javascript:void(false)"></a>
    //加警告<a href="javascript:alert('a')"></a>

event||window.event用于ie
事件源对象:
event.target 火狐只有这个
event.srcElement ie只有这个
这俩都有chrome

兼容写法

div.onclick = function(e){
	var event = e||window.event;
	var target = event.target||event.srcElement;
	console.log(target);
}

事件委托

	var ul = document.getElementsByTagName('ul')[0];
	ul.onclick = function(e){
	var evant = e || window.event;
	var target = event.targey||event.srcElement;
	console.log(target.innerText);
}

不用for循环写的优点:
1、性能不需要循环所有的元素一个个的绑定事件
2、灵活 当有新的子元素时不需要重新绑定事件

鼠标事件

click、触发点击事件
mousedown、鼠标按下事件
mousemove、鼠标移动事件
mouseup、鼠标抬起事件
contextmenu、阻止默认事件
mouseover、鼠标覆盖事件
mouseout、鼠标移走事件
mouseenter、鼠标覆盖事件
mouseleave、鼠标移走事件

方块跟随鼠标移动

    var disX,disY;
    var div =document.getElementsByTagName('div')[0];
    div.onmousedown = function(e){
        disX = e.pageX - parseInt(div.style.left);
        disY = e.pageY - parseInt(div.style.top);
        document.onmousemove = function(e){
        var event = e || window.event;
        div.style.left = e.pageX - disX + "px";
        div.style.top = e.pageY - disY + "px";
    } 
        document.onmouseup = function(){
        document.onmousemove = null;
        }
}

如何解决mousedown和click冲突问题

  function leaveClick(){
    var key = false;
    var startTime = 0,
        lastTime =0;
    var div = document.getElementsByTagName('div')[0];
    document.onmousedown = function(){
        startTime = new Date().getTime();
    }
    document.onmouseup = function(){
        lastTime = new Date().getTime();
        if(lastTime - startTime < 300){
            key = true;
        }
    }
    document.onclick = function(){
        if(key){
            key = false;
        }
    }
}

移动端
touchstart touchmove touchend
可以类似成一个click=一个mousedown+mouseup

键盘事件

onkeypress
onkeydown 所有键盘键的按键 > keypress 字符类按键(ASCII码有的) > onkeyup
onkeyup

keydown和keypress区别

//keydown可以相应任何键盘按键,keypress只可以找到相应的字符类键盘按键keypress返回相应的ASCII码可以转换成相应的字符
  document.onkeypress = function(e){
      console.log(String.fromCharCode(e.charCode));
  }

input、onchange、onfocus、onblur、onload

1.input事件无论删除还是添加一个字符都出发input事件
2.onchange对比的是鼠标聚焦还有失去焦点触发事件
3.onfocus
4.onload一般不用用来把script加在div前面的一个方法.非常慢,所有的加载项已经全部完成,效率最低
5.程序的执行顺序:
domTree cssTree ->renderTree渲染树

<input type="text" value="姓名" onfocus="if(this.value=='姓名'){this.value='';this.style.color='#424242'}"
 onblur="if(this.value==''){this.value='姓名';this.style.color='#999'}">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可可鸭~

想吃糖~我会甜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值