js-事件

目录

一.事件介绍

二.内联模型

三.脚本模型

四.事件处理函数

1.鼠标事件,页面所有元素都可触发

2.键盘事件

3.HTML事件

 传统事件绑定的问题

事件冒泡

事件捕获

W3C事件处理函数

IE事件处理函数

IE 事件里面的this==window

IE 事件里面的传递dom元素

IE 无法通过传参接受event对象

IE&W3C事件兼容

IE&W3C事件兼容--得到事件目标

IE:fromElement       &W3C:relatedTarget

I阻止事件的默认行为

拖放案例                抓取对象以后拖到另一个位置

I阻止事件的默认行为---阻止冒泡

鼠标滚轮(mousewheel)和DOMMouseScroll,用于获取鼠标上下滚轮的距离。

全屏滚动案例

上下文菜单事件:contextmenu

手机事件

本地存储

登录记住用户名案例


JavaScript事件是由访问Web页面的用户引起的一系列操作,例如:用户点击。当用户执行某些操作的时候,再去执行一系列代码。

一.事件介绍

JavaScript有三种事件模型:内联模型、脚本模型和DOM2模型。

二.内联模型

这种模型是最传统接单的一种处理事件的方法。在内联模型中,事件处理函数是HTML标签的一个属性,用于处理指定事件。虽然内联在早期使用较多,但它是和HTML混写的,并没有与HTML分离。

在HTML中把事件处理函数作为属性执行JS代码
<input type="button" value="按钮" οnclick="alert('Lee');"  />    //注意单双引号

//在HTML中把事件处理函数作为属性执行JS函数
<input type="button" value="按钮" οnclick="box();"  />    //执行JS的函数
PS:函数不得放到window.onload里面,这样就看不见了。

三.脚本模型

由于内联模型违反了HTML与JavaScript代码层次分离的原则。为了解决这个问题,我们可以在JavaScript中处理事件。这种处理方式就是脚本模型。

var input = document.getElementsByTagName('input')[0];        //得到input对象
input.onclick = function () {                        //匿名函数执行
        alert('Lee');
    };

通过匿名函数,可以直接触发对应的代码。也可以通过指定的函数名赋值的方式来执行函数(赋值的函数名不要跟着括号)。
input.onclick = box;

四.事件处理函数

JavaScript可以处理的事件类型为:鼠标事件、键盘事件、HTML事件。

所有的事件处理函数都会都有两个部分组成,on + 事件名称,例如click事件的事件处理函数就是:onclick。

1.鼠标事件,页面所有元素都可触发

click:当用户单击鼠标按钮。
    input.onclick = function () {
        alert('Lee');
    };

dblclick:当用户双击主鼠标按钮时触发。
    input.ondblclick = function () {
        alert('Lee');
    };

mousedown:当用户按下了鼠标还未弹起时触发。
    input.onmousedown = function () {
        alert('Lee');
    };

mouseup:当用户释放鼠标按钮时触发。
    input.onmouseup = function () {
        alert('Lee');
    };

mouseover:当鼠标移到某个元素上方时触发。 mouseenter
    input.onmouseover = function () {
        alert('Lee');
    };

mouseout:当鼠标移出某个元素上方时触发。  mouseleave
    input.onmouseout = function () {
        alert('Lee');
    };

mousemove:当鼠标指针在元素上移动时触发。
    input.onmousemove = function () {
        alert('Lee');
    };

2.键盘事件

keydown:当用户按下键盘上任意键触发,如果按住不放,会重复触发。
    document.onkeydown = function (e) {
        alert('Lee');
    };

keypress:当用户按下键盘上的字符键触发,如果按住不放,会重复触发。
    document.onkeypress = function () {
        alert('Lee');
    };

keyup:当用户释放键盘上的键触发。
    document.onkeyup = function () {
        alert('Lee');
    };

3.HTML事件

select:当用户选择文本框(input或textarea)中的一个或多个字符触发。
    input.onselect = function () {
        alert('Lee');
    };

change:当文本框(input或textarea)内容改变且失去焦点后触发。
    input.onchange = function () {
        alert('Lee');
    };

focus:当页面或者元素获得焦点时在window及相关元素上面触发。
    input.onfocus = function () {
        alert('Lee');
    };

blur:当页面或元素失去焦点时在window及相关元素上触发。
    input.onblur = function () {
        alert('Lee');
    };
submit:当用户点击提交按钮在<form>元素上触发。
    form.onsubmit = function () {
        alert('Lee');
    };

reset:当用户点击重置按钮在<form>元素上触发。
form.οnreset= function () {
        alert('Lee');
    };

resize:当窗口或框架的大小变化时在window或框架上触发。
    window.onresize = function () {
        alert('Lee');
    };

scroll:当用户滚动带滚动条的元素时触发。
    window.onscroll = function () {
        alert('Lee');
    };

 

 传统事件绑定的问题

问题一:一个事件处理函数触发两次事件
window.onload = function () {    //第一组程序项目或第一个JS文件
    alert('Lee');
};
window.onload = function () {    /第二组程序项目或第二个JS文件
    alert('Mr.Lee');
};

当两组程序或两个JS文件同时执行的时候,后面一个会把前面一个完全覆盖掉。导致前面的window.onload完全失效了。

事件冒泡

--------事件由最开始的元素接收,然后逐级向上传播到最不具体的那个节点(文档)

事件捕获

--------事件由最最不具体的那个节点(文档)元素接收,然后逐级向下广播到最具体的那个元素

W3C事件处理函数

“DOM2级事件”定义了两个方法,用于添加事件和删除事件处理程序的操作:addEventListener()removeEventListener()。所有DOM节点中都包含这两个方法,并且它们都接受3个参数;事件名、函数、冒泡或捕获的布尔值(true表示捕获,false表示冒泡)。

window.addEventListener('load', function () {
    alert('Lee');
}, false);

window.addEventListener('load', function () {
    alert('Mr.Lee');
}, false);

IE事件处理函数

IE实现了与DOM中类似的两个方法:attachEvent()和detachEvent()。这两个方法接受相同的参数:事件名称和函数。
在使用这两组函数的时候,先把区别说一下:
1.IE不支持捕获,只支持冒泡;
2.IE中的this指向的是window而不是DOM对象。
3在传统事件上,IE是无法接受到event对象的,但使用了attachEvent()却可以,但有些区别。

window.attachEvent('onload', function () {
    var box = document.getElementById('box');
    box.attachEvent('onclick', toBlue);
});

function toRed() {
    var that = window.event.srcElement;
    that.className = 'red';
    that.detachEvent('onclick', toRed);
    that.attachEvent('onclick', toBlue);
}

function toBlue() {
    var that = window.event.srcElement;
    that.className = 'blue';
    that.detachEvent('onclick', toBlue);
    that.attachEvent('onclick', toRed);
}

<body>
    <button id="btn">按钮</button>
</body>
<script>
    var oBtn = document.getElementById("btn");
    // oBtn.onclick = function () {
    //     console.log(this);
    // }
    // oBtn.addEventListener("click", function () {
    //     console.log(this);
    // });

    oBtn.attachEvent("onclick", function () {
        // console.log(this);//window
        // fun.call(oBtn,2,8);
        // fun.apply(oBtn,[2,8]);
        fun.bind(oBtn, [2, 8])();
    });


    function fun(a, b) {
        console.log(this);
        this.style.backgroundColor = "red";
    }

</script>

IE 事件里面的this==window

window.attachEvent('onload', function () {
    var box = document.getElementById('box');
    box.attachEvent('onclick', function () {
        alert(this === window);       //this指向的window
    });
});

IE 事件里面的传递dom元素

window.attachEvent('onload', function () {
    var box = document.getElementById('box');
    box.attachEvent('onclick', function () {        
        fn1.call(box);        //把this直接call过去
    });
});

function  fn1() {
    alert(this.tagName);
}

IE 无法通过传参接受event对象

在传统绑定上,IE是无法像W3C那样通过传参接受event对象,但如果使用了attachEvent()却可以。
box.onclick = function (evt) {
        alert(evt);     //
    }
box.attachEvent('onclick', function (evt) {
    alert(evt);        //object
alert(evt.type);    //click    
    });

IE&W3C事件兼容

function addEvent(obj, type, fn) {                //添加事件兼容
    if (obj.addEventListener) {
        obj.addEventListener(type, fn);
    } else if (obj.attachEvent) {
        obj.attachEvent('on' + type, fn);
    }
}

function removeEvent(obj, type, fn) {            //移除事件兼容
    if (obj.removeEventListener) {
        obj.removeEventListener(type, fn);
    } else if (obj.detachEvent) {
        obj.detachEvent('on' + type, fn);
    }
}

IE&W3C事件兼容--得到事件目标

function getTarget(evt) {                        //得到事件目标
    if (evt.target) {
        return evt.target;
    } else if (window.event.srcElement) {
        return window.event.srcElement;
    }
}

IE:fromElement       &W3C:relatedTarget

box.onmouseover = function (evt) {            /    /鼠标移入box
    alert(window.event.fromElement.tagName);        //获取移入box最近的那个元素对象span
    }

box.onmouseout = function (evt) {                //鼠标移入box
    alert(window.event.toElement.tagName);        //获取移入box最近的那个元素对象span
    }

relatedTarget 事件属性返回与事件的目标节点相关的节点。
对于 mouseover 事件来说,该属性是鼠标指针移到目标节点上时所离开的那个节点。
对于 mouseout 事件来说,该属性是离开目标时,鼠标指针进入的节点。
对于其他类型的事件来说,这个属性没有用。

I阻止事件的默认行为

有时我们需要阻止事件对象的默认行为,比如:一个超链接的默认行为就点击然后跳转到指定的页面。那么阻止默认行为就可以屏蔽跳转的这种操作,而实现自定义操作。
方法一:

link.onclick = function () {
    alert('Lee');
    return false;    //直接给个假,就不会跳转了。
    };

方法二:
W3C:evt.preventDefault();    
IE:   evt.returnValue = false
 returnValue是javascript中html的window对象的属性,目的是返回窗口值

function prevDefault(evt) {
    var e = evt || window.event;
    if (e.preventDefault) {
        e.preventDefault();
    } else {
        e.returnValue = false;//ie
    }
};

<body>
    <a href="http://www.baidu.com" id="link">超链接</a>
</body>
<script>
    var oA = document.getElementById("link");
    oA.onclick = function (ev) {
        var evt = ev || window.event;
        console.log('我要去百度了');
        // return false;
        // ev.preventDefault();//阻止默认行为
        // evt.returnValue = false;//ie8及以下版本
        if (evt.preventDefault) {
            evt.preventDefault();
        } else {
            evt.returnValue = false;//ie8及以下版本
        }
    }
</script>

拖放案例                抓取对象以后拖到另一个位置

思路:
1,把要拖放的元素变成可拖动的元素,加属性draggable=true(是否能拖动)
2,要拖动的元素要有事件 ondragstart,开始拖动(怎么拖动)
3,拖动后,要找目标放到哪,目标要有事件   ondragover(拖动到目标上方)
  ondrop(鼠标松开放下)(拖动后放到哪)

所用知识点:
1,属性:draggable
2,事件:ondragstart,ondragover,ondrop
3,   ev.dataTransfer.setData(“Text”,元素id)    //数据传递属性,以文本的形式存放起来
4,ev.dataTransfer.getData("Text")

默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。

<style>
        .box {
            width: 300px;
            height: 300px;
            box-shadow: 0 0 0 2px #200;
        }
    </style>
</head>

<body>
    <div class="box" ondragover="over(event)" ondrop="drop(event)"></div>
    <img src="./img/down-0.png" alt="" id="pic" draggable="true" ondragstart="start(event)">
    <div class="box" ondragover="over(event)" ondrop="drop(event)"></div>
</body>
<script>
    // 1, 把要拖放的元素变成可拖动的元素,加属性draggable = true(是否能拖动)
    // 2, 要拖动的元素要有事件 ondragstart,开始拖动(怎么拖动)
    // 3, 拖动后,要找目标放到哪,目标要有事件   ondragover(拖动到目标上方)
    // ondrop(鼠标松开放下)(拖动后放到哪)

    // var oImg = document.getElementById("pic");
    function start(ev) {
        console.log("开始拖动了");
        ev.dataTransfer.setData("text", ev.target.id);//把要拖动到元素的id存放起来
    }

    function over(ev) {
        ev.preventDefault();// 默认情况下,数据 / 元素不能放置到其他元素中。 如果要实现改功能,我们需要防止元素的默认处理方法。我们可以通过调用 event.preventDefault() 方法来实现 ondragover 事件。
        // console.log(ev);//dragEvent
        // ev.target.style.boxShadow = "0 0 0 2px #f00"
    }

    function drop(ev) {
        console.log(ev.target);
        // console.log(ev.dataTransfer.getData("text"));//把之前存进去的id值取出来
        var id = ev.dataTransfer.getData("text");
        ev.target.appendChild(document.getElementById(id));
    }
</script>

I阻止事件的默认行为---阻止冒泡

w3c的方法是e.stopPropagation(),IE则是使用e.cancelBubble = true
stopPropagation也是事件对象(Event)的一个方法,作用是阻止目标元素的冒泡事件,但是会不阻止默认行为
取消事件冒泡,在 IE 的事件机制中,触发事件会从子元素向父元素逐级上传,就是说,如果子元素触发了单击事件,那么也会触发父元素的单击事 件;event.cancelBubble=true;可以停止事件继续上传补充一点,IE的事件传递是从下到上的:
事件来源对象->上级对象->上上级对象->.....->body->document->window

兼容写法
function cBuble(evt){
    var e=window.event||evt;
    if(e.stopPropagation){
        e.stopPropagation();
    }else{
        e.cancelBubble=true;
    }
}

<body>
    <div class="father">
        父元素div
        <p class="child">子元素p</p>
    </div>
</body>
<script>
    var oFather = document.querySelector(".father");
    var oChild = document.querySelector(".child");

    oChild.onclick = function (ev) {
        var evt = ev || window.event;
        console.log("你点击的是子节点");
        // ev.stopPropagation();//w3c
        // evt.cancelBubble = true;//ie8
        if (evt.stopPropagation) {
            ev.stopPropagation();//w3c   ie9及以上版本
        } else {
            evt.cancelBubble = true;//ie8
        }
    }
    oFather.onclick = function (ev) {
        // ev.stopPropagation()
        console.log("你点击的是父节点");
    }
    document.onclick = function () {
        console.log("你点击的是老宗主");
    }

</script>

鼠标滚轮(mousewheel)和DOMMouseScroll,用于获取鼠标上下滚轮的距离。

判断滚轮向上或向下在浏览器中也要考虑兼容性,现在五大浏览器(IE、Opera、Safari、Firefox、Chrome)中Firefox 使用detail,其余四类使用wheelDelta;两者只在取值上不一致,代表含义一致,detail与wheelDelta只各取两个 值,detail只取±3,wheelDelta只取±120,其中正数表示为向上,负数表示向下。

addEvent(document, 'mousewheel', function (evt) {        //非火狐
    alert(getWD(evt));//往上滚动120,往下滚动-120
});
addEvent(document, 'DOMMouseScroll', function (evt) {    //火狐
    alert(getWD(evt));
});
function getWD(evt) {
    var e = evt || window.event;
    if (e.wheelDelta) {
        return e.wheelDelta;
    } else if (e.detail) {
        return -e.detail * 40;                //保持计算的统一
    }
}

全屏滚动案例

 <style>
        * {
            margin: 0;
            padding: 0;
        }

        .fullpage {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
        }

        .fullpage .page {
            width: 100%;
            height: 100%;
            text-align: center;
            font-size: 30px;
        }

        .fullpage .page:nth-of-type(1) {
            background-color: #d12;
        }

        .fullpage .page:nth-of-type(2) {
            background-color: #1d2;
        }

        .fullpage .page:nth-of-type(3) {
            background-color: #12d;
        }

        .fullpage .page:nth-of-type(4) {
            background-color: #a5b;
        }

        .fullpage .page:nth-of-type(5) {
            background-color: #b51;
        }

        .fullpage .page:nth-of-type(6) {
            background-color: #6ba;
        }

        .list {
            position: fixed;
            top: 0;
            left: 0;
            display: flex;
            list-style: none;
            background-color: #000;
            opacity: .6;
        }

        .list li {
            width: 100px;
            height: 40px;
            text-align: center;
            line-height: 40px;
            z-index: 9999;
            color: #fff;
            cursor: pointer;
        }
    </style>
</head>

<body>
    <div class="fullpage">
        <div class="page">第1屏</div>
        <div class="page">第2屏</div>
        <div class="page">第3屏</div>
        <div class="page">第4屏</div>
        <div class="page">第5屏</div>
        <div class="page">第6屏</div>
    </div>
    <ul class="list">
        <li style="background-color: red;">第一屏</li>
        <li>第二屏</li>
        <li>第三屏</li>
        <li>第四屏</li>
        <li>第五屏</li>
        <li>第六屏</li>
    </ul>
</body>
<script>
    window.onload = init;
    window.onresize = init;
    function init() {
        var fp = document.querySelector(".fullpage");
        var pages = document.querySelectorAll(".fullpage .page");
        var lis = document.querySelectorAll(".list li");
        var index = 0;//滚出的屏幕的数量 默认0
        var vh = document.documentElement.clientHeight;//获取浏览器可视区域的高度
        for (var i = 0; i < pages.length; i++) {
            pages[i].style.height = vh + "px";
        }
        //move()
        //非火狐
        document.addEventListener("mousewheel", throttle(move, 500));
        //火狐
        document.addEventListener("DOMMouseScroll", throttle(move, 500));
        for (let i = 0; i < lis.length; i++) {
            lis[i].onclick = function () {
                console.log(lis[i]);
                for (let j = 0; j < lis.length; j++) {
                    lis[j].style.backgroundColor = "";
                }
                lis[i].style.backgroundColor = "red"
                fp.style.top = -i * vh + "px";
                fp.style.transition = "0.5s";
                index = i
            }
        }

        function move(ev) {
            if (getWD(ev) < 0) {//往下滚动
                // console.log("往下滚动");
                index++;
                if (index > pages.length - 1) {
                    index = pages.length - 1;
                }
            }
            if (getWD(ev) > 0) {
                index--;
                if (index < 0) {
                    index = 0
                }
            }
            for (let j = 0; j < lis.length; j++) {
                lis[j].style.backgroundColor = "";
            }
            lis[index].style.backgroundColor = "red";
            fp.style.top = -index * vh + "px";
            fp.style.transition = "0.5s";
        }
    }





    //判断滚动方向
    function getWD(ev) {
        var evt = ev || window.event;
        if (evt.wheelDelta) {
            return evt.wheelDelta;//非火狐
        } else if (evt.detail) {
            return -evt.detail * 40;
        }
    }
    //节流
    function throttle(fn, mustRun = 500) {
        const timer = null;
        let previous = null;
        return function () {
            const now = new Date();
            const context = this;
            const args = arguments;
            if (!previous) {
                previous = now;
            }
            const remaining = now - previous;
            if (mustRun && remaining >= mustRun) {
                fn.apply(context, args);
                previous = now;
            }
        }
    }
</script>
<body>
    <div class="title">
        <div class="shishen"><a href="#" class="active" name="pic_tit">绘世花鸟卷</a></div>
        <div class="shishen"><a href="#" name="pic_tit">因幡辉夜姬</a> </div>
        <div class="shishen"><a href="#" name="pic_tit">铃彦姬</a></div>
        <div class="shishen"><a href="#" name="pic_tit">神堕八岐大蛇</a></div>
        <div class="shishen"><a href="#" name="pic_tit">大夜摩天阎王</a></div>
        <div class="shishen"><a href="#" name="pic_tit">心狩鬼女红叶</a></div>
        <div class="shishen"><a href="#" name="pic_tit">帝释天</a> </div>
    </div>
    <div class="fullscreen">
        <div class="page"></div>
        <div class="page"></div>
        <div class="page"></div>
        <div class="page"></div>
        <div class="page"></div>
        <div class="page"></div>
        <div class="page"></div>
    </div>
</body>
<script>
    window.onload = init;
    window.onresize = init;
    function init() {
        var oPtits = document.querySelectorAll(".shishen a")
        var fp = document.querySelector(".fullscreen");
        var pages = document.querySelectorAll(".page");
        var index = 0;
        var vh = document.documentElement.clientHeight;
        for (var i = 0; i < pages.length; i++) {
            pages[i].style.height = vh + "px";
        }
        // document.onmousewheel=throttle(mover,500)
        document.addEventListener("mousewheel", throttle(move,1000));//非火狐
        document.addEventListener("DOMMouseScroll", throttle(move,1000));//火狐
        function move(ev) {
            if (getWD(ev) > 0) {
                index--;
                if (index < 0) {
                    index = 0;
                }

            } else {
                index++;
                if (index >= pages.length - 1) {
                    index = pages.length - 1
                }
            }
            changeColor(index)
        }
        oPtits.forEach((item, k) => {
            item.onclick = function () {
                index = k;
                changeColor(index)
            }
        })
        function changeColor(idx) {
            for (var j = 0; j < oPtits.length; j++) {
                oPtits[j].classList.remove("active")
            }
            oPtits[idx].classList.add("active")
            fp.style.top = -idx * vh + "px"
        }
        function getWD(ev) {
            if (ev.wheelDelta) {
                return ev.wheelDelta;
            } else if (ev.detail) {
                return ev.detail * -40;
            }
        }
        function throttle(handler, wait) {
            var lastTime = 0;
            return function (e) {
                var nowTime = new Date().getTime();
                if (nowTime - lastTime >= wait) {
                    lastTime = nowTime;
                    handler.apply(this, arguments);
                }
            }
        }
        
    }

</script>

 

上下文菜单事件:contextmenu

当我们右击网页的时候,会自动出现windows自带的菜单。那么我们可以使用contextmenu事件来修改我们指定的菜单,但前提是把右击的默认行为取消掉。
var text = document.getElementById('text');
    addEvent(text, 'contextmenu', function (evt) {
        var e = evt || window.event;
        preDef(e);
        var menu = document.getElementById('menu');
        menu.style.left = e.clientX + 'px';
        menu.style.top = e.clientY + 'px';
        menu.style.visibility = 'visible';
        
        addEvent(document, 'click', function () {
            document.getElementById('myMenu').style.visibility = 'hidden';
        });

案例 

<style>
        *{
            margin: 0;
            padding: 0;
        }
        .box {
            width: 1000px;
            margin: 0 auto;
            height: 800px;
            background: #1FA2FF;
            /* fallback for old browsers */
            background: -webkit-linear-gradient(to right, #A6FFCB, #12D8FA, #1FA2FF);
            /* Chrome 10-25, Safari 5.1-6 */
            background: linear-gradient(to right, #A6FFCB, #12D8FA, #1FA2FF);
            /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */


        }

        .list {
            position: absolute;
            left: 0;
            top: 0;
            padding: 4px;
            line-height: 40px;
            list-style: none;
            background: #1CD8D2;
            visibility: hidden;
            /* fallback for old browsers */
            background: -webkit-linear-gradient(to right, #93EDC7, #1CD8D2);
            /* Chrome 10-25, Safari 5.1-6 */
            background: linear-gradient(to right, #93EDC7, #1CD8D2);
            /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
            text-align: center;
            border: 1px solid #fff;
            border-radius: 7px;
        }

        a {
            color: #fff;
            text-decoration: none;
        }

        li:hover a {
            color: #FF8008;
        }
    </style>
</head>

<body>
    <div class="box">

    </div>
    <ul class="list">
        <li><a href="javascript:;">刷新本页面</a></li>
        <li><a href="https://www.taobao.com/">去淘宝</a></li>
        <li><a href="https://www.jd.com/">去京东</a></li>
    </ul>
</body>
<script>
    var oDiv=document.querySelector(".box")
    var oUl=document.querySelector(".list")
    var oLis=document.querySelectorAll(".list li")
    oDiv.addEventListener("contextmenu",function(ev){
        ev.preventDefault()//阻止原本的菜单
        var x=ev.pageX;
        var y=ev.pageY;
        var ulWidth=oUl.offsetWidth;//ul盒子宽度
        var ulHeight=oUl.offsetHeight;//ul盒子宽度
        var divRight=oDiv.getBoundingClientRect().right
        var divBottom=oDiv.getBoundingClientRect().bottom
        if(x>=divRight-ulWidth){
            x=divRight-ulWidth;
        }
        if(y>=divBottom-ulHeight){
            y=divBottom-ulHeight;
        }
        oUl.style.visibility="visible"
        oUl.style.left=x+"px"
        oUl.style.top=y+"px"
    })
    document.addEventListener("click",function(){
        oUl.style.visibility="hidden"
    })
    oLis[0].onclick=function(){
        location.reload();
    }
</script>

手机事件

touchstart:触摸开始的时候触发
touchmove:手指在屏幕上滑动的时候触发
touchend:触摸结束的时候触发
每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点(用来实现多点触控)
事件属性
touches:当前位于屏幕上的所有手指的列表。
targetTouches:位于当前DOM元素上手指的列表。
changedTouches:涉及当前事件手指的列表。

clientX/ clientY:// 触摸点相对于浏览器窗口viewport的位置
pageX / pageY:// 触摸点相对于页面的位置
screenX/screenY ://触摸点相对于屏幕的位置      
上面三者表示动作在屏幕上发生的位置(page包含滚动距离,client不包含滚动距离,screen则以屏幕为基准)
e.targetTouches[0].pageX 获取到 触摸点相对页面的x坐标

<script>
    var oDiv = document.getElementById("box");
    oDiv.addEventListener("touchmove", function (ev) {
        // console.log(ev);// TouchEvent
        // console.log(ev.changedTouches);//屏幕上手指列表
        // console.log(ev.changedTouches[0]);
        // console.log(ev.targetTouches[0]);
        // console.log(ev.changedTouches[0].clientX);
        var x = ev.changedTouches[0].clientX;
        var y = ev.changedTouches[0].clientY;
        oDiv.style.left = x - oDiv.offsetWidth / 2 + "px";
        oDiv.style.top = y - oDiv.offsetHeight / 2 + "px";
    })

    // touchstart 屏幕触摸开始时触发
    // touchend 屏幕触摸结束时触发
    // touchmove 触摸移动时触发
</script>

本地存储

<body>
    <div class="box">
        欢迎你,<span class="nickname"></span>
        <a href="javascript:;" class="logout">退出</a>
    </div>
</body>
<script>
    var ospan = document.querySelector(".box .nickname");
    var oA = document.querySelector(".box .logout");
    var uname = "dyz";
    // localStorage.setItem("name", uname);
    localStorage.name = uname;

    // console.log(localStorage.getItem("name"));
    ospan.innerHTML = localStorage.getItem("name");

    oA.onclick = function () {
        localStorage.removeItem("name");
    }

    本地存储
    存数据
    localStorage.setItem(key, value)
    localStorage.key = value

    取数据
    localStorage.getItem(key)
    localStorage.key

    删除一条数据数据
    localStorage.removeItem(key)

    清空所有数据
    localStorage.clear()

</script>

登录记住用户名案例

<body>
    <form action="">
        用户名:<input type="text" name="uname"><br>
        密码:<input type="password" name="pwd"><br>
        <input type="button" value="登录">
    </form>
</body>
<script>
    var user = document.querySelector("input[name='uname']")
    var pwd = document.querySelector("input[name='pwd']")
    var btn = document.querySelector("input[type='button']");
    btn.onclick = function () {
        var uv = user.value;
        //表单验证
        console.log(localStorage.getItem('user'));
        if (true) {//表单验证成功
            var t = confirm("是否记住用户名");
            if (t) {
                localStorage.setItem("user", uv);
                location.reload();
            }
        }
    }

    if (localStorage.getItem("user") !== null) {
        user.value = localStorage.getItem("user");
    }


</script>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值