• 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代码
        //注意单双引号

    //在HTML中把事件处理函数作为属性执行JS函数
        //执行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.onsubmit = function () {
            alert('Lee');
        };

    reset:当用户点击重置按钮在元素上触发。
    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);
    }

    1. <body>
    2. <button id="btn">按钮button>
    3. body>
    4. <script>
    5. var oBtn = document.getElementById("btn");
    6. // oBtn.onclick = function () {
    7. // console.log(this);
    8. // }
    9. // oBtn.addEventListener("click", function () {
    10. // console.log(this);
    11. // });
    12. oBtn.attachEvent("onclick", function () {
    13. // console.log(this);//window
    14. // fun.call(oBtn,2,8);
    15. // fun.apply(oBtn,[2,8]);
    16. fun.bind(oBtn, [2, 8])();
    17. });
    18. function fun(a, b) {
    19. console.log(this);
    20. this.style.backgroundColor = "red";
    21. }
    22. 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
        }
    };

    1. <body>
    2. <a href="http://www.baidu.com" id="link">超链接a>
    3. body>
    4. <script>
    5. var oA = document.getElementById("link");
    6. oA.onclick = function (ev) {
    7. var evt = ev || window.event;
    8. console.log('我要去百度了');
    9. // return false;
    10. // ev.preventDefault();//阻止默认行为
    11. // evt.returnValue = false;//ie8及以下版本
    12. if (evt.preventDefault) {
    13. evt.preventDefault();
    14. } else {
    15. evt.returnValue = false;//ie8及以下版本
    16. }
    17. }
    18. 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")

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

    1. <style>
    2. .box {
    3. width: 300px;
    4. height: 300px;
    5. box-shadow: 0 0 0 2px #200;
    6. }
    7. style>
    8. head>
    9. <body>
    10. <div class="box" ondragover="over(event)" ondrop="drop(event)">div>
    11. <img src="./img/down-0.png" alt="" id="pic" draggable="true" ondragstart="start(event)">
    12. <div class="box" ondragover="over(event)" ondrop="drop(event)">div>
    13. body>
    14. <script>
    15. // 1, 把要拖放的元素变成可拖动的元素,加属性draggable = true(是否能拖动)
    16. // 2, 要拖动的元素要有事件 ondragstart,开始拖动(怎么拖动)
    17. // 3, 拖动后,要找目标放到哪,目标要有事件 ondragover(拖动到目标上方)
    18. // ondrop(鼠标松开放下)(拖动后放到哪)
    19. // var oImg = document.getElementById("pic");
    20. function start(ev) {
    21. console.log("开始拖动了");
    22. ev.dataTransfer.setData("text", ev.target.id);//把要拖动到元素的id存放起来
    23. }
    24. function over(ev) {
    25. ev.preventDefault();// 默认情况下,数据 / 元素不能放置到其他元素中。 如果要实现改功能,我们需要防止元素的默认处理方法。我们可以通过调用 event.preventDefault() 方法来实现 ondragover 事件。
    26. // console.log(ev);//dragEvent
    27. // ev.target.style.boxShadow = "0 0 0 2px #f00"
    28. }
    29. function drop(ev) {
    30. console.log(ev.target);
    31. // console.log(ev.dataTransfer.getData("text"));//把之前存进去的id值取出来
    32. var id = ev.dataTransfer.getData("text");
    33. ev.target.appendChild(document.getElementById(id));
    34. }
    35. 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;
        }
    }

    1. <body>
    2. <div class="father">
    3. 父元素div
    4. <p class="child">子元素pp>
    5. div>
    6. body>
    7. <script>
    8. var oFather = document.querySelector(".father");
    9. var oChild = document.querySelector(".child");
    10. oChild.onclick = function (ev) {
    11. var evt = ev || window.event;
    12. console.log("你点击的是子节点");
    13. // ev.stopPropagation();//w3c
    14. // evt.cancelBubble = true;//ie8
    15. if (evt.stopPropagation) {
    16. ev.stopPropagation();//w3c ie9及以上版本
    17. } else {
    18. evt.cancelBubble = true;//ie8
    19. }
    20. }
    21. oFather.onclick = function (ev) {
    22. // ev.stopPropagation()
    23. console.log("你点击的是父节点");
    24. }
    25. document.onclick = function () {
    26. console.log("你点击的是老宗主");
    27. }
    28. 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;                //保持计算的统一
        }
    }

    全屏滚动案例

    1. <style>
    2. * {
    3. margin: 0;
    4. padding: 0;
    5. }
    6. .fullpage {
    7. position: fixed;
    8. top: 0;
    9. left: 0;
    10. width: 100%;
    11. height: 100%;
    12. }
    13. .fullpage .page {
    14. width: 100%;
    15. height: 100%;
    16. text-align: center;
    17. font-size: 30px;
    18. }
    19. .fullpage .page:nth-of-type(1) {
    20. background-color: #d12;
    21. }
    22. .fullpage .page:nth-of-type(2) {
    23. background-color: #1d2;
    24. }
    25. .fullpage .page:nth-of-type(3) {
    26. background-color: #12d;
    27. }
    28. .fullpage .page:nth-of-type(4) {
    29. background-color: #a5b;
    30. }
    31. .fullpage .page:nth-of-type(5) {
    32. background-color: #b51;
    33. }
    34. .fullpage .page:nth-of-type(6) {
    35. background-color: #6ba;
    36. }
    37. .list {
    38. position: fixed;
    39. top: 0;
    40. left: 0;
    41. display: flex;
    42. list-style: none;
    43. background-color: #000;
    44. opacity: .6;
    45. }
    46. .list li {
    47. width: 100px;
    48. height: 40px;
    49. text-align: center;
    50. line-height: 40px;
    51. z-index: 9999;
    52. color: #fff;
    53. cursor: pointer;
    54. }
    55. style>
    56. head>
    57. <body>
    58. <div class="fullpage">
    59. <div class="page">第1屏div>
    60. <div class="page">第2屏div>
    61. <div class="page">第3屏div>
    62. <div class="page">第4屏div>
    63. <div class="page">第5屏div>
    64. <div class="page">第6屏div>
    65. div>
    66. <ul class="list">
    67. <li style="background-color: red;">第一屏li>
    68. <li>第二屏li>
    69. <li>第三屏li>
    70. <li>第四屏li>
    71. <li>第五屏li>
    72. <li>第六屏li>
    73. ul>
    74. body>
    75. <script>
    76. window.onload = init;
    77. window.onresize = init;
    78. function init() {
    79. var fp = document.querySelector(".fullpage");
    80. var pages = document.querySelectorAll(".fullpage .page");
    81. var lis = document.querySelectorAll(".list li");
    82. var index = 0;//滚出的屏幕的数量 默认0
    83. var vh = document.documentElement.clientHeight;//获取浏览器可视区域的高度
    84. for (var i = 0; i < pages.length; i++) {
    85. pages[i].style.height = vh + "px";
    86. }
    87. //move()
    88. //非火狐
    89. document.addEventListener("mousewheel", throttle(move, 500));
    90. //火狐
    91. document.addEventListener("DOMMouseScroll", throttle(move, 500));
    92. for (let i = 0; i < lis.length; i++) {
    93. lis[i].onclick = function () {
    94. console.log(lis[i]);
    95. for (let j = 0; j < lis.length; j++) {
    96. lis[j].style.backgroundColor = "";
    97. }
    98. lis[i].style.backgroundColor = "red"
    99. fp.style.top = -i * vh + "px";
    100. fp.style.transition = "0.5s";
    101. index = i
    102. }
    103. }
    104. function move(ev) {
    105. if (getWD(ev) < 0) {//往下滚动
    106. // console.log("往下滚动");
    107. index++;
    108. if (index > pages.length - 1) {
    109. index = pages.length - 1;
    110. }
    111. }
    112. if (getWD(ev) > 0) {
    113. index--;
    114. if (index < 0) {
    115. index = 0
    116. }
    117. }
    118. for (let j = 0; j < lis.length; j++) {
    119. lis[j].style.backgroundColor = "";
    120. }
    121. lis[index].style.backgroundColor = "red";
    122. fp.style.top = -index * vh + "px";
    123. fp.style.transition = "0.5s";
    124. }
    125. }
    126. //判断滚动方向
    127. function getWD(ev) {
    128. var evt = ev || window.event;
    129. if (evt.wheelDelta) {
    130. return evt.wheelDelta;//非火狐
    131. } else if (evt.detail) {
    132. return -evt.detail * 40;
    133. }
    134. }
    135. //节流
    136. function throttle(fn, mustRun = 500) {
    137. const timer = null;
    138. let previous = null;
    139. return function () {
    140. const now = new Date();
    141. const context = this;
    142. const args = arguments;
    143. if (!previous) {
    144. previous = now;
    145. }
    146. const remaining = now - previous;
    147. if (mustRun && remaining >= mustRun) {
    148. fn.apply(context, args);
    149. previous = now;
    150. }
    151. }
    152. }
    153. script>
    1. <body>
    2. <div class="title">
    3. <div class="shishen"><a href="#" class="active" name="pic_tit">绘世花鸟卷a>div>
    4. <div class="shishen"><a href="#" name="pic_tit">因幡辉夜姬a> div>
    5. <div class="shishen"><a href="#" name="pic_tit">铃彦姬a>div>
    6. <div class="shishen"><a href="#" name="pic_tit">神堕八岐大蛇a>div>
    7. <div class="shishen"><a href="#" name="pic_tit">大夜摩天阎王a>div>
    8. <div class="shishen"><a href="#" name="pic_tit">心狩鬼女红叶a>div>
    9. <div class="shishen"><a href="#" name="pic_tit">帝释天a> div>
    10. div>
    11. <div class="fullscreen">
    12. <div class="page">div>
    13. <div class="page">div>
    14. <div class="page">div>
    15. <div class="page">div>
    16. <div class="page">div>
    17. <div class="page">div>
    18. <div class="page">div>
    19. div>
    20. body>
    21. <script>
    22. window.onload = init;
    23. window.onresize = init;
    24. function init() {
    25. var oPtits = document.querySelectorAll(".shishen a")
    26. var fp = document.querySelector(".fullscreen");
    27. var pages = document.querySelectorAll(".page");
    28. var index = 0;
    29. var vh = document.documentElement.clientHeight;
    30. for (var i = 0; i < pages.length; i++) {
    31. pages[i].style.height = vh + "px";
    32. }
    33. // document.onmousewheel=throttle(mover,500)
    34. document.addEventListener("mousewheel", throttle(move,1000));//非火狐
    35. document.addEventListener("DOMMouseScroll", throttle(move,1000));//火狐
    36. function move(ev) {
    37. if (getWD(ev) > 0) {
    38. index--;
    39. if (index < 0) {
    40. index = 0;
    41. }
    42. } else {
    43. index++;
    44. if (index >= pages.length - 1) {
    45. index = pages.length - 1
    46. }
    47. }
    48. changeColor(index)
    49. }
    50. oPtits.forEach((item, k) => {
    51. item.onclick = function () {
    52. index = k;
    53. changeColor(index)
    54. }
    55. })
    56. function changeColor(idx) {
    57. for (var j = 0; j < oPtits.length; j++) {
    58. oPtits[j].classList.remove("active")
    59. }
    60. oPtits[idx].classList.add("active")
    61. fp.style.top = -idx * vh + "px"
    62. }
    63. function getWD(ev) {
    64. if (ev.wheelDelta) {
    65. return ev.wheelDelta;
    66. } else if (ev.detail) {
    67. return ev.detail * -40;
    68. }
    69. }
    70. function throttle(handler, wait) {
    71. var lastTime = 0;
    72. return function (e) {
    73. var nowTime = new Date().getTime();
    74. if (nowTime - lastTime >= wait) {
    75. lastTime = nowTime;
    76. handler.apply(this, arguments);
    77. }
    78. }
    79. }
    80. }
    81. 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';
            });

    案例 

    1. <style>
    2. *{
    3. margin: 0;
    4. padding: 0;
    5. }
    6. .box {
    7. width: 1000px;
    8. margin: 0 auto;
    9. height: 800px;
    10. background: #1FA2FF;
    11. /* fallback for old browsers */
    12. background: -webkit-linear-gradient(to right, #A6FFCB, #12D8FA, #1FA2FF);
    13. /* Chrome 10-25, Safari 5.1-6 */
    14. background: linear-gradient(to right, #A6FFCB, #12D8FA, #1FA2FF);
    15. /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
    16. }
    17. .list {
    18. position: absolute;
    19. left: 0;
    20. top: 0;
    21. padding: 4px;
    22. line-height: 40px;
    23. list-style: none;
    24. background: #1CD8D2;
    25. visibility: hidden;
    26. /* fallback for old browsers */
    27. background: -webkit-linear-gradient(to right, #93EDC7, #1CD8D2);
    28. /* Chrome 10-25, Safari 5.1-6 */
    29. background: linear-gradient(to right, #93EDC7, #1CD8D2);
    30. /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
    31. text-align: center;
    32. border: 1px solid #fff;
    33. border-radius: 7px;
    34. }
    35. a {
    36. color: #fff;
    37. text-decoration: none;
    38. }
    39. li:hover a {
    40. color: #FF8008;
    41. }
    42. style>
    43. head>
    44. <body>
    45. <div class="box">
    46. div>
    47. <ul class="list">
    48. <li><a href="javascript:;">刷新本页面a>li>
    49. <li><a href="https://www.taobao.com/">去淘宝a>li>
    50. <li><a href="https://www.jd.com/">去京东a>li>
    51. ul>
    52. body>
    53. <script>
    54. var oDiv=document.querySelector(".box")
    55. var oUl=document.querySelector(".list")
    56. var oLis=document.querySelectorAll(".list li")
    57. oDiv.addEventListener("contextmenu",function(ev){
    58. ev.preventDefault()//阻止原本的菜单
    59. var x=ev.pageX;
    60. var y=ev.pageY;
    61. var ulWidth=oUl.offsetWidth;//ul盒子宽度
    62. var ulHeight=oUl.offsetHeight;//ul盒子宽度
    63. var divRight=oDiv.getBoundingClientRect().right
    64. var divBottom=oDiv.getBoundingClientRect().bottom
    65. if(x>=divRight-ulWidth){
    66. x=divRight-ulWidth;
    67. }
    68. if(y>=divBottom-ulHeight){
    69. y=divBottom-ulHeight;
    70. }
    71. oUl.style.visibility="visible"
    72. oUl.style.left=x+"px"
    73. oUl.style.top=y+"px"
    74. })
    75. document.addEventListener("click",function(){
    76. oUl.style.visibility="hidden"
    77. })
    78. oLis[0].onclick=function(){
    79. location.reload();
    80. }
    81. script>

    手机事件

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

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

    1. <script>
    2. var oDiv = document.getElementById("box");
    3. oDiv.addEventListener("touchmove", function (ev) {
    4. // console.log(ev);// TouchEvent
    5. // console.log(ev.changedTouches);//屏幕上手指列表
    6. // console.log(ev.changedTouches[0]);
    7. // console.log(ev.targetTouches[0]);
    8. // console.log(ev.changedTouches[0].clientX);
    9. var x = ev.changedTouches[0].clientX;
    10. var y = ev.changedTouches[0].clientY;
    11. oDiv.style.left = x - oDiv.offsetWidth / 2 + "px";
    12. oDiv.style.top = y - oDiv.offsetHeight / 2 + "px";
    13. })
    14. // touchstart 屏幕触摸开始时触发
    15. // touchend 屏幕触摸结束时触发
    16. // touchmove 触摸移动时触发
    17. script>

    本地存储

    1. <body>
    2. <div class="box">
    3. 欢迎你,<span class="nickname">span>
    4. <a href="javascript:;" class="logout">退出a>
    5. div>
    6. body>
    7. <script>
    8. var ospan = document.querySelector(".box .nickname");
    9. var oA = document.querySelector(".box .logout");
    10. var uname = "dyz";
    11. // localStorage.setItem("name", uname);
    12. localStorage.name = uname;
    13. // console.log(localStorage.getItem("name"));
    14. ospan.innerHTML = localStorage.getItem("name");
    15. oA.onclick = function () {
    16. localStorage.removeItem("name");
    17. }
    18. 本地存储
    19. 存数据
    20. localStorage.setItem(key, value)
    21. localStorage.key = value
    22. 取数据
    23. localStorage.getItem(key)
    24. localStorage.key
    25. 删除一条数据数据
    26. localStorage.removeItem(key)
    27. 清空所有数据
    28. localStorage.clear()
    29. script>

    登录记住用户名案例

    1. <body>
    2. <form action="">
    3. 用户名:<input type="text" name="uname"><br>
    4. 密码:<input type="password" name="pwd"><br>
    5. <input type="button" value="登录">
    6. form>
    7. body>
    8. <script>
    9. var user = document.querySelector("input[name='uname']")
    10. var pwd = document.querySelector("input[name='pwd']")
    11. var btn = document.querySelector("input[type='button']");
    12. btn.onclick = function () {
    13. var uv = user.value;
    14. //表单验证
    15. console.log(localStorage.getItem('user'));
    16. if (true) {//表单验证成功
    17. var t = confirm("是否记住用户名");
    18. if (t) {
    19. localStorage.setItem("user", uv);
    20. location.reload();
    21. }
    22. }
    23. }
    24. if (localStorage.getItem("user") !== null) {
    25. user.value = localStorage.getItem("user");
    26. }
    27. script>

  • 相关阅读:
    python通过自相关对两个时序数据进行匹配、对时
    【数据结构】堆(万字详解)
    Ceph分布式存储:资源池Pool的管理与MDS、RBD、RGW接口的部署
    Upper and lower bounds
    【软考:系统集成项目管理】之 项目成本管理
    【Verilog】时序逻辑电路 -- 有限同步状态机[补充]
    【测试】 Java如何优雅的生成测试数据
    LambdaQueryWrapper 自定义返回字段(分组后统计)
    会议OA项目(查询&是否参会&反馈详情)
    使用Python调用API接口获取淘宝商品数据
  • 原文地址:https://blog.csdn.net/m0_59642141/article/details/126511659