JavaScript学习笔记

JS实例-事件对象

2016-10-22  本文已影响0人  lemontree2000

事件对象:存储了(描述了)事件更加详细的信息

    坐标信息(位置):
    横坐标(x轴):
        event.clientX;
        兼容:Chrome,IE系
        
        ev.clientX;
        兼容:高级浏览器
        低级:undefined

    兼容写法:
        var oEvent = ev || event;

查看当前鼠标的坐标位置:
    onmousemove -> 当你移动鼠标时候
    触发非常密 不要用alert 调试

eg:
div跟着鼠标走
*** 使用clientX,clientY 最好加上滚动宽度,高度 防止在滚动的时候DIV不跟随鼠标

事件冒泡:

子元素身上的事件,会传递给父元素,如果事件相同会执行,不相同不会执行,会继续往上冒

发生包含关系,不是平级关系

阻止事件冒泡:
oEvent.cancelBubble = true;

eg 放大镜(淘宝产品图):

a). 鼠标移入、移出small 显示、隐藏span/big
    b). 给small添加移动事件
        1. 让span 跟着鼠标走
            (减去box的offsetLeft/offsetTop)
        2. 限制范围
            1). 左边最大移动距离
            small盒模型宽度/高度-span盒模型宽度/高度
            2). 右边最大移动距离
            大img的盒模型宽度/高度-big盒模型宽度/高度
        3. 算比例
            左边X轴:scaleX = x/maxW
            左边X轴:scaleY = y/maxH
        4. 右边比例 - > 算img的left/top
    scaleX = ? / (oImg.offsetWidth-oBig.offsetWidth)
    scaleY = ? / (oImg.offsetHeight-oBig.offsetHeight)

    比例:变化的数/定死的数

键盘事件:

<b>onkeydown 当按下键盘的时候</b>

键位对应的键码:
oEvent.keyCode -> 键码
对应一个数字
规律
常用的键:

删除键:8
回车键:13

左键:37
上键:38
右键:39
下键:40

组合键:
*** 在js里面键码不能组合使用

    ctrl:
        ctrlKey
    shift:
        shiftKey
    alt: 
        altKey

<b>oncontextmenu 当点击右键时候</b>

默认行为:
右键有菜单 表单能提交 文本框能输入内容 点击a链接能跳转...

阻止默认行为:
return false;

阻止复制内容途径:
a). ctrl + c
b). 右键

<b>eg 拖拽:</b>
a). 按下鼠标
onmousedown 当按下鼠标的时候
b). 移动
onmousemove 当移动鼠标的时候
c). 抬起鼠标
onmouseup 当抬起鼠标的时候

问题:
    a). 快速拖拽div就不跟着走了
        解决:把move和 up加给docuemnt
    b). 会选中文字
        系统自带的
        阻止默认行为
        解决:return false;

        IE低版本出问题
        捕获(IE独有的):

设置捕获
    obj.setCapture();

释放捕获:
    obj.releaseCapture();

克隆:
obj.cloneNode(); -> 浅克隆
返回新的物体

obj.cloneNode(true); -> 深度克隆 会将内容也复制
参数:默认是false -> 浅克隆


事件冲突:
同一个元素身上,添加了一个事件,但是希望执行不同的函数

添加事件的方式:
    a). <input type="button" onclick="xxx"
    b). oBtn.onclick = xxxx;

事件绑定:解决事件冲突
一种全新的添加事件的方式

事件绑定:
obj.addEventListener(事件名,函数名,是否捕获);
事件名 -> 不能加上 "on"

兼容:高级浏览器
obj.attachEvent(事件名,函数名);
事件名 -> 加上 "on"
兼容: IE10-

兼容性:
    a). || 
    b). if  else

封装一个给物体添加绑定事件的函数:
obj -> 哪个物体
sEv -> 事件名
fn  -> 函数名
addEvent(obj,sEv,fn);

事件解绑定:
问题:
碰见匿名函数出问题了
原因:
函数每次都是new出来的,只要是new出来的东西都不相等

关于匿名函数:

obj.removeEventListener(事件名,函数名,是否捕获);
事件名 -> 不能加上‘on’
参数要与事件的绑定保持一致
兼容:高级浏览器

obj.detachEvent(事件名,函数名);
兼容:IE10-

兼容性:
    removeEvent(obj,sEv,fn);

事件冒泡:
子级 -> 父级
事件的捕获(下沉):
父级 -> 子级
事件的捕获没用!! 直接给false
obj.removeEventListener(事件名,函数名,false);


this出问题的地方:
a). 定时器里面的this
b). 函数包了一层
c). 事件绑定有问题(attachEvent)

九宫格拖拽:
4个边,4个角

右边:
var downX = oEvent.clientX;
var oldW = oBox.offsetWidth;
下边:
var downY = oEvent.clientY;
var oldH = oBox.offsetHeight;
左边:
var downX = oEvent.clientX;
var oldW = oBox.offsetWidth;
var oldL = oBox.offsetLeft;
上边:
var downY = oEvent.clientY;
var oldH = oBox.offsetHeight;
var oldT = oBox.offsetTop;


碰撞检测::
a). 什么时候碰上
r1 > l2 && b1 > t2 && l1 < r2 && t1 < b2
b). 判断没碰上 √
r1 < l2 || b1 < t2 || l1 > r2 || t1 > b2

上一篇下一篇

猜你喜欢

热点阅读