11、事件(上)

1、获取外联样式

                window.onload = function(){
                // 获取div的css样式
                var oDiv = document.getElementById("div1");
                // alert(oDiv.style); //object CSS2Properties
                /*alert(oDiv.style.width);
                alert(oDiv.style.backgroundColor);*/

                /*alert(oDiv.style.color);
                alert(oDiv.style.height);*/

如果你想获取当前标签外联样式,通过具体的函数获取。

                // alert(oDiv.currentStyle["color"]); //IE
                // alert(getComputedStyle(oDiv)["color"]); //火狐和谷歌支持的

浏览器兼容写法

                /*
                    获取的是当前有效样式
                */
                alert(getStyle(oDiv, "height"));
            }

            //获取当前样式
            function getStyle(node, styleName){
                if(node.currentStyle){
                    //IE
                    return node.currentStyle[styleName];//返回属性值
                }else{
                    return getComputedStyle(node)[styleName];//返回属性值
                }
            }

2、document.querySelector

==node.querySelector(参数);==
参数:字符串,选择器样式的字符串 #id .class
返回值:只返回符合要求的++第一个节点++。

==document.querySelectorAll(参数);==
返回值:++肯定是数组++,数组里面装着++++所有符合条件的元素++++,就算选择是id。

上述这两个方法,可以传参数,和你能写的css选择器的数量一致。

                window.onload = function(){
                // var node = document.querySelector("#div1");

                // var node = document.querySelector("li");

                // var nodes = document.querySelectorAll("li");
                // var nodes = document.querySelectorAll("#div1");
                // var nodes = document.querySelectorAll(".box");
                var nodes = document.querySelectorAll("ul li");


                alert(nodes.length);

                for(var i = 0; i < nodes.length; i++){
                    nodes[i].style.backgroundColor = "red";
                }
            }

3、++innerHTML。outerHTML。innerText。nodeValue++

innerHTML
获取标签间的内容,包括子标签。

文本1<strong>粗体文本</strong>文本2

outerHTML
除了包含innerHTML的全部内容外, 还包含对象标签本身。

<div id="div1">文本1<strong>粗体文本</strong>文本2</div>

innerText

文本1粗体文本文本2 
【注】只会获取该节点中 ,子节点的文本 纯文本,不包括子标签

nodeValue

元素节点   返回:null
文本节点   返回:文本的内容
            window.onload = function(){
                var oDiv = document.getElementById("div1");
                // alert(oDiv.innerHTML);
                // oDiv.innerHTML = "<h1>h1</h1>";
                // alert(oDiv.outerHTML);

                // alert(oDiv.innerText);
                // oDiv.innerText = "<h1>h1</h1>";

                var nodes = oDiv.childNodes;

                alert(nodes[0].nodeValue); //文本节点
                nodes[0].nodeValue = "<h1>h1</h1>"
                // alert(nodes[1].nodeValue); //元素节点
            }
    <body>
        <div id = "div1">文本1<strong>粗体文本</strong>文本2</div>
    </body>

4、认知事件

        <style>
            #div1{
                width: 100px;
                height: 100px;
                background-color: blue;
                color: white
            }
        </style>
        <script>

事件:
1、事件发生了
2、针对事件,进行对应的操作

在JS中有哪些事件?

1、鼠标事件
click 单击事件
onclick 处理事件的函数。
dblclick 双击 两次单击不能间隔太长
mouseover 移入
mouseout 移出
mousemove 在某一个标签上移动,会触发
mousedown 按下鼠标
mouseup 抬起鼠标

事件绑定格式:
元素节点.on事件类型 = 函数

2、键盘事件

3、HTML事件

                1、事件
                2、事件处理的操作
                【注】应该如何链接起来。
                【注】事件绑定 = 事件 + 事件发生处理函数
                    1、内联模式
                    2、外联模式/脚本模式
                window.onload = function(){
                // 外联模式
                /*
                    html
                    css
        【注】分模块,分文件的格式要求,一般写成外联的模式。
                */
                var oDiv = document.getElementById('div1');
                /*oDiv.onclick = function(){
                    alert("单击");
                }*/
                /*document.onclick = function(){
                    alert("触发");
                }*/

                /*oDiv.ondblclick = function(){
                    alert("双击");
                }*/

                /*oDiv.onmouseover = function(){
                    oDiv.style.backgroundColor = "red";
                }
                oDiv.onmouseout = function(){
                    oDiv.style.backgroundColor = "yellow";
                }*/

                //移动就执行
                /*var i = 0;
                oDiv.onmousemove = function(){
                    oDiv.innerHTML = i++;
                }*/

                oDiv.onmousedown = function(){
                    oDiv.innerHTML = "按下";
                }

                oDiv.onmouseup = function(){
                    oDiv.innerHTML = "抬起";
                }
            }
        </script>

    </head>
    <body>
        <!-- 内联 onclick = "要去执行js语句"; -->
        <!-- <div id = "div1" onclick = "btnClick();"></div> -->
        <div id = "div1">div</div>
    </body>

5、键盘事件

keydown 按下键 按下任何键
如果长按,会重复触发

keyup 抬起键

keypress 按下键 按下字符键有效,功能不触发
如果长按,会重复触发

事件绑定:
1、输入,input textare
2、window 全局

            window.onload = function(){
                var i = 0;
                /*window.onkeydown = function(){
                    // document.title = "按下";
                    document.title = i++;
                }
                window.onkeyup = function(){
                    document.title = "抬起";
                }*/

                window.onkeypress = function(){
                    // document.title = "按下";
                    document.title = i++;
                }
                window.onkeyup = function(){
                    document.title = "抬起";
                }
            }

6、HTML事件

<script>

HTML事件
1、window事件

load 页面加载完成以后触发

unload 页面解构的时候触发, IE兼容
点击刷新,上一页面会解构
window.onunload = function(){}

scroll 页面滚动,会触发
resize 页面大小发生变化会触发。

2、表单事件 form input textarea

blur 失去焦点

focus 获取焦点

change 文本发生改变,并失去焦点的时候触发

select 当文本被选中的时候触发

【注】表单事件,必须添加在form表单才能生效

            window.onload = function(){
                // var i = 0;
                /*window.onscroll = function(){
                    //页面滚动
                    document.title = i++;
                }*/

                /*window.onresize = function(){
                    document.title = i++;
                }*/
                var oInput = document.getElementById("input1");
                /*oInput.onblur = function(){
                    oInput.value = "失去焦点";
                }
                oInput.onfocus = function(){
                    oInput.value = "获取焦点";
                }*/
                /*oInput.onchange = function(){
                    alert("改变了");
                }*/
                /*oInput.onselect = function(){
                    alert("被选中了");
                }*/


                var oForm = document.getElementById("form");
                oForm.onsubmit = function(){
                    alert("当点击submit按钮触发")
                }
                oForm.onreset = function(){
                    alert("当点击reset按钮触发")
                }
            }
        </script>
    </head>
    <body style = "height: 3000px">
        
    </body>
    <input type="text" value = "文本" id = "input1" />
    <form action="#" id = "form">
        <input type="submit" />
        <input type="reset" />
    </form>

7、事件对象

事件绑定:
元素节点/目标对象.on事件类型 = 函数
1、目标对象
2、on + 事件类型
3、触发事件,要去执行的函数

系统:当你把事件绑定绑定成功以后,会将上述三者融城一个对象,这个对象,叫做事件对象。

获取事件对象:由系统,去调用事件处理函数的时候,当做第一个参数传入。

            document.onclick = function(event){
                // alert(123);
                // alert(arguments.length);
                // alert(arguments[0]); //object MouseEvent


                //访问事件对象
                // alert(event);
                /*
                    IE8以下不能,直接通过形参获取对象。
                        window.event
                */
                /*
                    通过或运算的短路操作,进行浏览器兼容
                */
                var e = event || window.event;
                alert(e);
            }

短路操作:

        var res = 10 < 3 || alert(a);
            alert(res);

8、事件对象属性

window.onload = function(){

button属性(IE对于button的兼容也有问题)
鼠标事件对象属性:
0 左键
1 滚轮
2 右键

clientX clientY
【注】原点位置,可视区域html标签的左上角,可视区域页面的左上角。
【注】不包含滚动出去的页面

pageX pageY
【注】包含滚动出去的页面,原点位置,html标签的左上角,页面的左上角。

screenX screenY
【注】原点位置,你电脑屏幕的左上角

                document.onclick = function(event){
                    var e = event || window.event;
                    // alert(e.button);

                    alert(e.clientX + ", " + e.clientY);
                    // alert(e.screenX + ", " + e.screenY);
                    alert(e.pageX + ", " + e.pageY);
                }

            }

9、坐标的实时显示

    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            #div1{
                width: 500px;
                height: 500px;
                border: 1px solid black;
                margin: 50px auto;
                position: relative;
            }
            #span1{
                position: absolute;
                bottom: 10px;
                left: 10px
            }
        </style>
        <script src = "js/tool.js"></script>
        <script>
            window.onload = function(){
                var oDiv = document.getElementById("div1");
                var oSpan = document.getElementById("span1");
                //获取div1的left top
                // alert(getStyle(oDiv, "top"));

                oDiv.onmousemove = function(event){
                    var e = event || window.event;
                    var X = e.clientX - oDiv.offsetLeft;
                    var Y = e.clientY - oDiv.offsetTop;
                    //实时的更新鼠标的坐标
                    oSpan.innerHTML = X + ", " + Y;
                }
            }
        </script>
    </head>
    <body>
        <div id = "div1">
            <span id = "span1">0, 0</span>
        </div>
    </body>

10、offset系列

offsetLeft,offsetTop可以理解为==里面盒子==到==外面盒子==(有position的父元素,如果没有往上找)边框的距离

offsetWidth,offsetHeight是元素的宽和高

            window.onload = function(){
                var oDiv = document.getElementById("div1");

                /*
                直接获取当前元素节点的样式
                    offsetLeft
                    offsetTop

                    offsetWidth
                    offsetHeight
                */
                // alert(oDiv.offsetLeft);//获取节点oDiv左侧距离;
                // alert(oDiv.offsetTop);//获取节点oDiv上侧距离;

                // alert(typeof getStyle(oDiv, "width"));

                
                alert(typeof oDiv.offsetWidth);
            }

11、跟随鼠标的提示框

    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            a{
                font-size: 30px;
                margin: 30px;
                display: inline-block;
            }
            #desc{
                width: 600px;
                height: 150px;
                background-color: gray;
                border: 1px solid black;
                position: absolute;
                display: none;
                color: white;
                font-size: 15px
            }

        </style>
        <script>

            var arr = ["孙悟空,本名卡卡罗特,日本漫画及改编动画《龙珠》系列的主角,是来自贝吉塔行星的赛亚人。小时候以“下级战士”的身份被送到地球。被武道家孙悟饭收养并取名为“孙悟空”。小时候失控变成大猩猩踩死悟饭后独自生活在深山。有一天结识少女...", "出生地:第7宇宙-贝吉塔行星简介:贝吉塔,日本动漫《龙珠》系列中的主要角色之一。是战斗民族赛亚人的王子,拥有极高的自尊心。过去贝吉塔行星被弗利萨破坏后(不知情,一直以为是被陨石撞击而毁灭。)以前在弗利萨军团那儿做事。初登场时是个侵略地球的反派角色,后被孙悟..", "小丸子是一名小学二年级的女生,她活泼,好动,懒惰,什么事情都拖到最后一刻才做,学习不认真,成绩平平,经常和姐姐斗气,爱幻想,做事没恒心……在小丸子...", "小学生木之本樱(丹下樱 配音)是一个平凡的女孩,有一个温柔的爸爸木之本藤隆(田中秀幸 配音)和一个体贴的好友大道寺知世(岩男润子 配音)。一天,在父"];



            window.onload = function(){
                var nodes = document.getElementsByTagName("a");
                var oDesc = document.getElementById("desc");

                for(var i = 0; i < nodes.length; i++){
                    //给每一个a标签添加下标
                    nodes[i].index = i;


                    nodes[i].onmouseover = function(event){
                        //1、让div显示  2、让div位置挪动到鼠标移入的位置

                        var e = event || window.event;
                        oDesc.style.display = "block";
                        oDesc.innerHTML = arr[this.index];
                        oDesc.style.left = e.clientX + 5 + "px";
                        oDesc.style.top = e.clientY + 5 + "px";
                    }
                    nodes[i].onmousemove = function(event){
                        var e = event || window.event;
                        oDesc.style.left = e.clientX + 5 + "px";
                        oDesc.style.top = e.clientY + 5 + "px";
                    }


                    nodes[i].onmouseout = function(){
                        //让div隐藏
                        oDesc.style.display = "none";
                    }
                }
            }
        </script>
    </head>
    <body>
        <ul>
            <li>
                <a href="#">孙悟空</a>
            </li>
            <li>
                <a href="#">贝吉塔</a>
            </li>
            <li>
                <a href="#">樱桃小丸子</a>
            </li>
            <li>
                <a href="#">百变小樱</a>
            </li>
        </ul>
        <div id = "desc"></div>
    </body>

12、事件对象

//传参

        function add(num1, num2){
                alert(num1 + num2);
            }

            add(10, 20);

            window.onload = function(){

                //事件绑定完成
                document.onclick = function(event){
                    alert(event);
                }
            }

13、点击按钮输入按钮对应下标

        <script>
            window.onload = function(){
                var aBtns = document.getElementsByTagName("button");

                /*
                    【注】这个for循环只是绑定事件。有几个button,就有几个onclick函数。
                */
                for(var i = 0; i < aBtns.length; i++){
                    aBtns[i].index = i;
                    //绑定事件
                    aBtns[i].onclick = function(){
                        alert(this.index);
                    }
                }

            }
        </script>
    </head>
    <body>
        <button>111</button>
        <!-- index = 0  onclick -->
        <button>222</button>
        <!-- index = 1  onclick-->
        <button>333</button>
        <!-- index = 2  onclick-->
    </body>

14、this变量

【注】每一个函数,都有一个内置的变量叫做this。
【注】this永远存储着,当前这个函数主人的地址。
【注】仔细当前函数的主人是谁。看该函数调用的时候,前面是谁。

如果当前函数,没有主人,统一this代表window对象。

            /*function show(){
                alert(this);
            }*/
            // show(); //object Window

            /*var xiaoming = {
                name: "小明",
                age: 40,
                show: function(){
                    // alert(this);
                    // alert(xiaoming.name);
                    alert(this.name);
                }
            }

            xiaoming.show();*/
            window.onload = function(){
                var oDiv = document.getElementById("div1");
                oDiv.onclick = function(){
                    alert(this.tagName);
                }
            }

15、事件对象属性_修改键

都是事件对象的属性:
功能:有没有按下对应的键。
【注】在任何的事件对象里都能,访问这四个属性。

e.ctrlKey
如果你按下了ctrl键,值为true,否则为false

e.shiftKey
如果你按下了shift键,值为true,否则为false

e.altKey
如果你按下了alt键,值为true,否则为false

e.metaKey 如果你按下了 windows/command 键,值为true,否则为false

【注】主要用于实现组合键。

            window.onload = function(){
                document.onclick = function(event){
                    var e = event || window.event;
                    /*if(e.shiftKey == true){
                        alert("点击 + shift")
                    }else{
                        alert("点击")
                    }*/
                    alert(getArr(e));
                }
            }

            function getArr(event){
                var arr = [];
                if(event.shiftKey){
                    arr.push("shift");
                }
                if(event.ctrlKey){
                    arr.push("ctrl");
                }
                if(event.altKey){
                    arr.push("alt");
                }
                if(event.metaKey){
                    arr.push("windows");
                }
                return arr;
            }

16、键盘事件对象属性

keydown
keyup

keypress 只有字符键支持

            window.onload = function(){
                /*window.onkeydown = function(event){
                    var e = event || window.event;*/
                    // alert(e); //object KeyboardEvent]
                    /*
                        属性:
                        键码: keyCode 
                        注意: 只有才keydown和keyup下才有
                        功能: 输出对应按下的键的ASCII码值,无论你按下的字符是大写还是小写,统一返回大写字母的ASCII码值。
                        【注】有一部分键是和ASCII值不符合的。
                        【注】不支持charCode
                    */
                    /*alert(e.keyCode);

                }*/

                /*
                    keypress
                    字符码:charCode
                    特点:1、只支持字符键 2、区分大小写
                    【注】不支持keyCode
                */
                window.onkeypress = function(event){
                    var e = event || window.event;
                    // alert(e.charCode);

                    /*var str = String.fromCharCode(e.charCode)
                    alert(str);*/
                }
            }

17、小游戏

上下左右    上下左右走

如果按下shift+上下左右键   快快的走 10倍速度。

左上右下 37 38 39 40

<style>
            #xiaoming{
                width: 100px;
                height: 100px;
                position: absolute;
            }
            #xiaoming img{
                width: 100px;
                height: 100px
            }
        </style>
        <script>
            
            window.onload = function(){

                var xiaoming = document.getElementById("xiaoming");

                window.onkeydown = function(event){
                    var e = event || window.event;
                    // alert(e.keyCode);
                    var speed = 5;
                    //判断是否按下了shiftkey
                    if(e.shiftKey){
                        speed *= 10;
                    }


                    switch(e.keyCode){
                        case 37: //左
                            xiaoming.style.left = xiaoming.offsetLeft - speed + "px";
                            break;
                        case 38:
                            xiaoming.style.top = xiaoming.offsetTop - speed + "px";
                            break;
                        case 39: //右
                            xiaoming.style.left = xiaoming.offsetLeft + speed + "px";
                            break;
                        case 40:
                            xiaoming.style.top = xiaoming.offsetTop + speed + "px";
                            break;
                        default:
                            break;
                    }
                }
            }
        </script>
    </head>
    <body>
        <div id = "xiaoming">
            <img src="http://2t.5068.com/uploads/allimg/170616/1-1F616101S6-50.gif" alt="">
        </div>

18、目标对象

window.onload = function(){
                var oDiv = document.getElementById("div1");

事件绑定
目标对象.on+事件类型 = 函数;

oDiv.onclick = function(event){
                    var e = event || window.event;

/
e.target 获取触发该事件的对象
IE8 以下不兼容
window.event.srcElement
/

                    alert(e.target.nodeName);
                    var target = e.target || e.srcElement;
                    alert(target.nodeName);
                }
            }

19、事件流_冒泡

        <style>
            div{
                padding: 50px;
            }
            #div1{
                background-color: red
            }
            #div2{
                background-color: blue;
            }
            #div3{
                background-color: yellow
            }
        </style>
        <script>

事件流:
事件的冒泡:html页面天生的特点,如果多个标签重叠,并且拥有同一个事件,那么如果你点了里面的一个标签,这个事件会向外传递,逐一触发。由里层向外层执行。
事件捕获:和事件冒泡正好相反,由外层向里层执行。

            window.onload = function(){
                var nodes = document.getElementsByTagName("div");
                for(var i = 0; i < nodes.length; i++){
                    nodes[i].onclick = function(){
                        alert(this.id);
                    }
                }
            }
        </script>
    </head>
    <body>
        <div id = "div1">
            <div id = "div2">
                <div id = "div3"></div>
            </div>
        </div>
    </body>

阻止事件冒泡的方法:
1、事件对象.cancelBubble = true; //IE
2、事件对象.stopPropagation(); //IE不兼容

            window.onload = function(){
                var nodes = document.getElementsByTagName("div");
                for(var i = 0; i < nodes.length; i++){
                    nodes[i].onclick = function(event){
                        var e = event || window.event;
                        alert(this.id);
                        // e.cancelBubble = true;
                        // e.stopPropagation();

                        stopBubble(e);
                    }
                }
            }

阻止事件冒泡

            function stopBubble(event){
                if(event.cancelBubble){
                    event.cancelBubble = true;
                }else{
                    event.stopPropagation();
                }
            }

猜你喜欢

转载自www.cnblogs.com/zhongchao666/p/9275514.html