原生開發(fā)WebApi知識點(diǎn)總結(jié)

WebApi

Web API: 瀏覽器提供的一套API(方法),通過這套API我們可以非常輕易的操作頁面的元素和瀏覽器的一些功能。API是一些預(yù)先定義的方法,這些方法能夠?qū)崿F(xiàn)某些特定的功能,我們無須知道這些API的實(shí)現(xiàn)方式,但是我們需要知道這些API如何使用。通俗的講,API就是編程語言給我提供的一些工具,通過這些工具,我們可以非常輕易的完成一些功能。

案例地址: https://github.com/pengjunshan/WebPJS/WebApi

其它Web文章
HtmlCss基礎(chǔ)學(xué)習(xí)第一章
CSS基礎(chǔ)學(xué)習(xí)第二章
CSS浮動(dòng)的使用和解決浮動(dòng)的五種方法
CSS定位relative、absolute、fixed使用總結(jié)
開發(fā)中常用jQuery知識點(diǎn)總結(jié)
C3動(dòng)畫+H5+Flex布局使用總結(jié)
ES6常用知識總結(jié)
Vue學(xué)習(xí)知識總結(jié)
開發(fā)環(huán)境到生產(chǎn)環(huán)境配置webpack
待續(xù)......

主要是操作DOM和BOM

DOM概念

DOM(Document Object Model)可以把HTML看做是文檔樹,通過DOM提供的API可以對樹上的節(jié)點(diǎn)進(jìn)行操作。
經(jīng)常進(jìn)行的操作有:獲取元素、對元素進(jìn)行操作(設(shè)置其屬性或調(diào)用其方法)、動(dòng)態(tài)創(chuàng)建元素、事件(什么時(shí)機(jī)做相應(yīng)的操作)、等等;

DOM文檔樹模型

BOM概念

BOM(Browser Object Model) 是指瀏覽器對象模型,BOM由多個(gè)對象組成,其中代表瀏覽器窗口的Window對象是BOM的頂層對象,其他對象都是該對象的子對象。
經(jīng)常進(jìn)行的操作有:對話框、定時(shí)器、location對象、history對象、等等;

本編文章會(huì)講到的知識點(diǎn)
  • 獲取頁面元素
  • 屬性操作
  • 創(chuàng)建元素
  • 節(jié)點(diǎn)操作
  • 事件對象
  • BOM對象
獲取頁面元素

需要操作頁面上的某部分元素(顯示/隱藏,動(dòng)畫),需要先獲取到該部分對應(yīng)的元素,才進(jìn)行后續(xù)操作。

1.根據(jù)id獲取元素

參數(shù):字符串類型 id,返回值:元素, 如果找不到,返回的是null。

var div = document.getElementById('main');
console.log(div);

2.根據(jù)標(biāo)簽名獲取元素

get:獲取 elements:元素 by:通過 tagName:標(biāo)簽名
返回值:偽數(shù)組,偽數(shù)組不是數(shù)組,但是可以跟數(shù)組一樣遍歷,也可以通過下標(biāo)操作。不能用數(shù)組的方法。

var divs = document.getElementsByTagName('div');
for (var i = 0; i < divs.length; i++) {
  var div = divs[i];
  console.log(div);
}

3.根據(jù)name獲取元素

和getElementById()差不多,根據(jù)元素中name屬性值來查找,返回值也是個(gè)偽數(shù)組。

var inputs = document.getElementsByName('hobby');
for (var i = 0; i < inputs.length; i++) {
  var input = inputs[i];
  console.log(input);
}

4.根據(jù)類名獲取元素

ClassName:一目了然是根據(jù)class類名來查找,返回值是偽數(shù)組。

var mains = document.getElementsByClassName('main');
for (var i = 0; i < mains.length; i++) {
  var main = mains[i];
  console.log(main);
}

5.根據(jù)選擇器獲取元素

參數(shù): 字符串類型的 css選擇器;
querySelector(".cool"),返回值:元素, 如果是多個(gè),只會(huì)返回第一個(gè)。
querySelectorAll(".cool"),返回值: 偽數(shù)組。

var text = document.querySelector('#text');
console.log(text);

var boxes = document.querySelectorAll('.box');
for (var i = 0; i < boxes.length; i++) {
  var box = boxes[i];
  console.log(box);
}

案例

用到了這六種方式來獲取頁面中的元素。案例請到https://github.com/pengjunshan/WebPJS中查看

<body>
    <h1 name="pjs"></h1>

    <ul id="imgs">
        <li>
            <a href="../img/1.jpg" title="美女A">
                <img src="../img/1-small.jpg" alt="">
            </a>
        </li>
        <li>
            <a href="../img/2.jpg" title="美女B">
                <img src="../img/2-small.jpg" alt="">
            </a>
        </li>
        <li>
            <a href="../img/3.jpg" title="美女C">
                <img src="../img/3-small.jpg" alt="">
            </a>
        </li>
        <li>
            <a href="../img/4.jpg" title="美女D">
                <img src="../img/4-small.jpg" alt="">
            </a>
        </li>
    </ul>

    <img src="../img/placeholder.png" width="400" height="250" alt="" id="bigImg">


    <!--標(biāo)簽的內(nèi)容-->
    <p class="des">這是描述信息</p>
    <p class="des">這是描述信息</p>
    <p class="des">這是描述信息</p>

    <script>
        //1. 點(diǎn)擊a標(biāo)簽時(shí),能夠呵呵就行。
        //2. 修改大圖片的src  p標(biāo)簽的innerText

        //1. 找對象
        var imgs = document.getElementById("imgs");//ul
        var links = imgs.getElementsByTagName("a");//所有的a標(biāo)簽
        var bigImg = document.querySelector("#bigImg");//大圖片
        var des = document.querySelectorAll(".des");
        var pjs = document.getElementsByName("pjs");

        pjs[0].innerText = "美女相冊";

        //2. 給所有的a標(biāo)簽注冊點(diǎn)擊事件
        for (var i = 0; i < links.length; i++) {
            links[i].onclick = function () {

                //3. 修改大圖片的src屬性, this.href
                bigImg.src = this.href;

                //4. 修改p標(biāo)簽的內(nèi)容, innerText:內(nèi)部的文本
                des[0].innerText = this.title;

                //5. 阻止a跳轉(zhuǎn)
                return false;
            }
        }

    </script>
</body>
屬性操作

通過DOM對象也就是我們獲取的元素,可以進(jìn)行屬性操作、類名操作、樣式操作、等等。

1.非表單元素的屬性

href、title、id、src、className、innerHTML、innerText等等屬性。
innerHTML可以從字符中識別標(biāo)簽,innerText只認(rèn)為都是字符串。

var link = document.getElementById('link');
console.log(link.href);
console.log(link.title);
var box = document.getElementById('box');
box.innerHTML = '我是文本<p>我會(huì)生成為標(biāo)簽</p>';
console.log(box.innerHTML);
box.innerText = '我是文本<p>我不會(huì)生成為標(biāo)簽</p>';
console.log(box.innerText);

2.表單元素屬性

value 用于大部分表單元素的內(nèi)容獲取(option除外)、type 可以獲取input標(biāo)簽的類型(輸入框或復(fù)選框等)、disabled 禁用屬性、checked 復(fù)選框選中屬性、selected 下拉菜單選中屬性;

                  this.value = "鋼琴";
                  if (inputs[i].type === "text") {
                    inputs[i].disabled = true;
                } else if (inputs[i].type === "checkbox") {
                    inputs[i].checked = true;
                }

        var options = document.getElementsByTagName("option");
        btn.onclick = function () {
            //寫一個(gè)隨機(jī)數(shù)
            //[0,1)
            //隨機(jī)數(shù)需要寫在事件里頭,每次點(diǎn)擊都要重新生成隨機(jī)數(shù)
            var random = parseInt(Math.random() * options.length);
            options[random].selected = true;
        }

3.自定義屬性操作

getAttribute() 獲取標(biāo)簽行內(nèi)屬性、setAttribute() 設(shè)置標(biāo)簽行內(nèi)屬性、removeAttribute() 移除標(biāo)簽行內(nèi)屬性。setAttribute()可以修改屬性值也可以添加屬性

        <div id="pp" index="1" aa="a"></div>
        var pp = document.getElementById("pp");
        console.log(pp.getAttribute("index"))
        pp.setAttribute("index", "2");
        console.log(pp.getAttribute("index"))
        pp.setAttribute("name", "pjs")
        pp.removeAttribute("aa")
        console.log(pp)

4.樣式操作

使用style方式設(shè)置的樣式顯示在標(biāo)簽行內(nèi),obj.style.=,始終對應(yīng)的都是行內(nèi)樣式, 獲取的也是行內(nèi)樣式, 設(shè)置的也是行內(nèi)樣式。通過樣式屬性設(shè)置寬高、位置的屬性類型是字符串,需要加上px。

        <div id="box"></div>
        var box = document.getElementById("box");
        box.style.borderRadius = "50%";
        box.style.backgroundColor = "pink";
        box.style.width = "200px";
        box.style.height = "100px"
        console.log(box.style.backgroundColor)

5.類名操作

修改標(biāo)簽的className屬性相當(dāng)于直接修改標(biāo)簽的類名。

    #sd{
        width: 200px;
        height: 200px;
        background-color: red;
    }
    .show{
        display: block;
    }
    .none{
        display: none;
    }
    <input type="button" value="切換類名">
    <div id="sd" class="show"></div>
       /**
        * 類名操作 切換類名
        */
        var sdDiv = document.getElementById("sd");
        var inputs = document.getElementsByTagName("input");
        for(var i = 0; i<inputs.length; i++){
            if(inputs[i].type == "button"){
                inputs[i].onclick = function(){
                    if(sdDiv.className === "show"){
                        sdDiv.className = "none";
                    }else{
                        sdDiv.className = "show";
                    }
                }
            }
        }

6.案例

table欄切換效果,案例請到https://github.com/pengjunshan/WebPJS中查看

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }

        ul {
            list-style: none;
        }

        .wrapper {
            width: 1000px;
            height: 475px;
            margin: 0 auto;
            margin-top: 100px;
        }

        .tab {
            border: 1px solid #ddd;
            border-bottom: 0;
            height: 36px;
            width: 320px;
        }

        .tab .tab-item {
            position: relative;
            float: left;
            width: 80px;
            height: 34px;
            line-height: 34px;
            text-align: center;
            cursor: pointer;
            border-top: 4px solid #fff;
        }

        .tab span {
            position: absolute;
            right: 0;
            top: 10px;
            background: #ddd;
            width: 1px;
            height: 14px;
            overflow: hidden;
        }

        .products {
            width: 1002px;
            border: 1px solid #ddd;
            height: 476px;
        }

        .products .main {
            float: left;
            display: none;
        }

        .products .main.selected {
            display: block;
        }

        .tab li.active {
            border-color: red;
            border-bottom: 0;
        }
    </style>
</head>
<body>
    <div class="wrapper">
        <ul class="tab">
            <li class="tab-item active">國際大牌<span>◆</span></li>
            <li class="tab-item">國妝名牌<span>◆</span></li>
            <li class="tab-item">清潔用品<span>◆</span></li>
            <li class="tab-item">男士精品</li>
        </ul>
        <div class="products">
            <div class="main selected">
                <a href="###"><img src="../img/guojidapai.jpg" alt="" /></a>
            </div>
            <div class="main">
                <a href="###"><img src="../img/guozhuangmingpin.jpg" alt="" /></a>
            </div>
            <div class="main">
                <a href="###"><img src="../img/qingjieyongpin.jpg" alt="" /></a>
            </div>
            <div class="main">
                <a href="###"><img src="../img/nanshijingpin.jpg" alt="" /></a>
            </div>
        </div>
    </div>

    <script>
        //思路:
        //1. 找對象
        //2. 給所有的li注冊onmouseover事件
        //3. 排他
        var lis = document.querySelectorAll(".tab-item");
        var divs = document.querySelectorAll(".main");
        //注冊事件
        for (var i = 0; i < lis.length; i++) {
            //存儲一個(gè)下標(biāo)
            lis[i].index = i;
            lis[i].onmouseover = function () {
                //干掉所有人  僅僅是active這個(gè)類清除
                for (var i = 0; i < lis.length; i++) {
                    lis[i].className = "tab-item";
                    divs[i].className = "main";
                }
                //復(fù)活我自己
                this.className = "tab-item active";
                divs[this.index].className = "main selected";
            }
        }
    </script>
</body>
</html>
創(chuàng)建元素

動(dòng)態(tài)創(chuàng)建元素有三種方式:document.write()、innerHTML()、document.createElement();

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div>我是印第安人</div>
    <div id="dd"></div>
    <script>
        /**
          *document.write()
          */
        document.write('我是document.write()創(chuàng)建的標(biāo)簽:<span>標(biāo)簽也可以生成</span>');

        /**
        *   innerHTML
        */
        var dd = document.getElementById("dd");
        dd.innerHTML = "我是innerHTML()創(chuàng)建的標(biāo)簽:<span>標(biāo)簽也可以生成</span>";

        /**
        * document.createElement()
        */
        var dd2 = document.createElement("div");
        dd2.innerText = "我是document.createElement()創(chuàng)建的元素"
        document.body.appendChild(dd2)

    </script>
</body>

</html>
節(jié)點(diǎn)操作

整個(gè)文檔是一個(gè)文檔節(jié)點(diǎn),每個(gè) HTML 元素是元素節(jié)點(diǎn),HTML 元素內(nèi)的文本是文本節(jié)點(diǎn),每個(gè) HTML 屬性是屬性節(jié)點(diǎn),注釋是注釋節(jié)點(diǎn);

通過 HTML DOM,樹中的所有節(jié)點(diǎn)均可通過 JavaScript 進(jìn)行訪問。所有 HTML 元素(節(jié)點(diǎn))均可被修改,也可以創(chuàng)建或刪除節(jié)點(diǎn)。

1.節(jié)點(diǎn)層次,屬性

通過DOM對象查找子節(jié)點(diǎn)(childNodes children)、父節(jié)點(diǎn)(parentNode parentElement)、兄弟節(jié)點(diǎn)(previousSibling previousElementSibling nextSibling nextElementSibling)、第一個(gè)節(jié)點(diǎn)(firstChild firstElementChild)、最后一個(gè)節(jié)點(diǎn)(lastChild lastElementChild)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="pp">
        <div>敏文兄</div>
        <div>平平</div>
        <div id="dyy">短圓圓</div>
        <p>邱航</p>
        <p>胖子</p>
    </div>

    <script>
        var pp = document.querySelector("#pp");
        var dyy = document.getElementById("dyy");

        //childNodes:可以獲取到某個(gè)元素所有的子節(jié)點(diǎn)
        var childs = pp.childNodes;
        console.log(childs)

        //我們需要的是標(biāo)簽節(jié)點(diǎn),元素 判斷一個(gè)節(jié)點(diǎn)是不是標(biāo)簽: nodeType === 1
        for (var i = 0; i < childs.length; i++) {
            if (childs[i].nodeType === 1) {
                console.log(childs[i]);
            }
        }

        //children : 獲取某個(gè)元素中所有的子元素(children)
        var childrens = pp.children;
        console.log(childrens)

        //第一個(gè)孩子節(jié)點(diǎn)
        console.log(pp.firstChild)
        //  console.log(childs[0])
        //第一個(gè)孩子元素
        console.log(pp.firstElementChild)
        //  console.log(childrens[0])

        //最后一個(gè)孩子節(jié)點(diǎn)
        console.log(pp.lastChild)
        // console.log(childs[childs.length-1])
        //最后一個(gè)孩子元素
        console.log(pp.lastElementChild)
        // console.log(childrens[childrens.length-1])

        //兄弟姐妹:sibling
        //上一個(gè)兄弟節(jié)點(diǎn)
        console.log(dyy.previousSibling)
        //上一個(gè)兄弟元素
        console.log(dyy.previousElementSibling);

        //下一個(gè)兄弟節(jié)點(diǎn)
        console.log(dyy.nextSibling);
        //下一個(gè)兄弟元素
        console.log(dyy.nextElementSibling);

        //父節(jié)點(diǎn)
        console.log(dyy.parentNode)
        //父元素
        console.log(dyy.parentElement)

    </script>
</body>

</html>

2.節(jié)點(diǎn)操作,方法

通過節(jié)點(diǎn)對象可以進(jìn)行 添加節(jié)點(diǎn)(appendChild())、插入節(jié)點(diǎn)(insertBefore())、刪除節(jié)點(diǎn)(removeChild())、替換節(jié)點(diǎn)(replaceChild())、克隆節(jié)點(diǎn)(cloneNode());代碼中注釋請仔細(xì)查看。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="pp">
        <div>敏文兄</div>
        <div>平平</div>
        <div id="dyy">短圓圓</div>
        <p>邱航</p>
        <p>胖子</p>
    </div>

    <script>
        var pp = document.querySelector("#pp");
        var dyy = document.getElementById("dyy");

        //克隆節(jié)點(diǎn)cloneNode(*) *: 為布爾值,如果為true,那么將克隆原節(jié)點(diǎn),以及所有子節(jié)點(diǎn);為false時(shí),僅復(fù)制節(jié)點(diǎn)本身
        var cldyy = dyy.cloneNode(true);

        //添加節(jié)點(diǎn)appendChild()添加到尾端  
        // pp.appendChild(cldyy);

        //插入節(jié)點(diǎn)insertBefore(newChild,*)第一個(gè)參數(shù):newChild 需要添加的元素,
        //第二個(gè)參數(shù):refChild 添加到哪個(gè)子元素前面 傳null默認(rèn)最后末端.
        pp.insertBefore(cldyy, pp.children[0])
        console.log(pp)

        //移除節(jié)點(diǎn)removeChild(*) *:要移除的節(jié)點(diǎn) 
        pp.removeChild(pp.children[1]);
        console.log(pp)

    </script>
</body>

</html>

3.案例

動(dòng)態(tài)創(chuàng)建table表格、刪除表格、增加表格功能。案例請到https://github.com/pengjunshan/WebPJS中查看。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        table {
            border: 1px solid #000;
            /*邊框合并*/
            border-collapse: collapse;
        }

        th {
            border: 1px solid #000;
            height: 40px;
            background-color: #ccc;
        }

        td {
            border: 1px solid #000;
            height: 30px;
            text-align: center;
            padding: 0 30px;
        }
    </style>
</head>

<body>
    <button class="addBtn">增加</button>
    <script>

        //js對象  json  ajax
        var data = {
            "header": ["姓名", "性別", "年齡", "描述"],
            "content": [
                { "name": "王琨", "gender": "女", "age": 30, "desc": "曾經(jīng)是個(gè)王者" },
                { "name": "王夢茹", "gender": "女", "age": 18, "desc": "小仙女" },
                { "name": "羅杰", "gender": "男", "age": 23, "desc": "海賊王船長" },
                { "name": "袁小雨", "gender": "男", "age": 38, "desc": "打醬油的" },
                { "name": "黃張龍", "gender": "女", "age": 28, "desc": "社會(huì)我龍哥,人狠話不多" },
                { "name": "王浩", "gender": "男", "age": 23, "desc": "死基佬,死基佬" },
                { "name": "孫廣明", "gender": "男", "age": 3, "desc": "學(xué)霸,大神" },
            ]
        }

        //1. 創(chuàng)建一個(gè)table,添加到body
        var mTable = document.createElement("table");
        document.body.appendChild(mTable);
        //2. 創(chuàng)建一個(gè)thead,添加到table
        var mThead = document.createElement("thead");
        mTable.appendChild(mThead);
        //2.1 創(chuàng)建一個(gè)tr,添加到thead
        var theadTr = document.createElement("tr");
        mThead.appendChild(theadTr);
        //2.2 創(chuàng)建多個(gè)th, 添加到tr中, 設(shè)置內(nèi)容
        var headerList = data.header;
        for (let i = 0; i < headerList.length; i++) {
            var mTh = document.createElement("th");
            mTh.innerText = headerList[i];
            theadTr.appendChild(mTh);
        }
        //3. 創(chuàng)建tbody,添加到table
        var mTbody = document.createElement("tbody");
        mTable.appendChild(mTbody);
        //3.1 創(chuàng)建多個(gè)tr,添加tbody
        //3.2 創(chuàng)建多個(gè)td,添加到tr中, 設(shè)置內(nèi)容
        //4.添加刪除功能
        var contentList = data.content;
        for (let i = 0; i < contentList.length; i++) {
            var tr = document.createElement("tr");
            mTbody.appendChild(tr);
            var obj = contentList[i];
            for (const key in obj) {
                var td = document.createElement("td")
                tr.appendChild(td)
                td.innerText = obj[key]
            }
            var delTd = document.createElement("td");
            tr.appendChild(delTd);
            var btn = document.createElement("button");
            btn.innerText = "刪除";
            delTd.appendChild(btn);
            btn.onclick = function () {
                mTbody.removeChild(this.parentNode.parentNode);
            }
        }
        var delTh = document.createElement("th");
        delTh.innerText = "刪除"
        theadTr.appendChild(delTh)

        //5.新增表格
        var addBtn = document.getElementsByClassName("addBtn")
        console.log(addBtn)
        addBtn[0].onclick = function () {
            console.log("11111111")
            var addTr = document.createElement("tr");
            mTbody.appendChild(addTr);
            var nameTd = document.createElement("td");
            nameTd.innerText = "張三";
            addTr.appendChild(nameTd)
            var sexTd = document.createElement("td");
            sexTd.innerText = "男";
            addTr.appendChild(sexTd);
            var ageTd = document.createElement("td");
            ageTd.innerText = "18";
            addTr.appendChild(ageTd)
            var msTd = document.createElement("td");
            msTd.innerText = "我是描述";
            addTr.appendChild(msTd)
            var delTd = document.createElement("td");
            addTr.appendChild(delTd);
            var btn = document.createElement("button");
            btn.innerText = "刪除";
            delTd.appendChild(btn);
            btn.onclick = function () {
                mTbody.removeChild(this.parentNode.parentNode);
            }
        }

    </script>
</body>

</html>

事件對象

捕獲階段、當(dāng)前目標(biāo)階段、冒泡階段、事件對象.eventPhase屬性可以查看事件觸發(fā)時(shí)所處的階段。

1.對象的屬性

在觸發(fā)某個(gè)事件的時(shí)候,都會(huì)產(chǎn)生一個(gè)事件對象Event,這個(gè)對象中包含所有與事件相關(guān)的一些信息,包括觸發(fā)事件的元素,事件的類型以及其他與事件相關(guān)的信息。

記錄了鼠標(biāo)位置信息的相關(guān)屬性

screenX與screenY:光標(biāo)相對于屏幕左上角的水平位置與垂直位置。
clientX與clientY:光標(biāo)相對于可視區(qū)左上角的水平位置和垂直位置。
pageX與pageY:光標(biāo)相對于網(wǎng)頁(文檔document)左上角的水平位置與垂直位置(推薦使用)

記錄了鍵盤碼的屬性

event.keyCode:鍵盤按下的那個(gè)鍵的鍵盤碼

常見的鼠標(biāo)事件

onmousedown:鼠標(biāo)按下事件
onmouseup:鼠標(biāo)彈起事件
onclick:單擊事件
ondblclick:雙擊事件
onmouseover:鼠標(biāo)經(jīng)過事件
onmouseout:鼠標(biāo)離開事件
onmousemove:鼠標(biāo)移動(dòng)事件
onfocus:鼠標(biāo)獲得焦點(diǎn)事件
onblur:鼠標(biāo)失去焦點(diǎn)事件

常見的鍵盤事件

onkeydown:鍵盤按下時(shí)觸發(fā)
onkeyup:鍵盤彈起時(shí)觸發(fā)

案例

自定義彈窗,隨著鼠標(biāo)按下移動(dòng)而移動(dòng)。案例請到https://github.com/pengjunshan/WebPJS中查看。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .nav {
      height: 30px;
      background: #036663;
      border-bottom: 1px solid #369;
      line-height: 30px;
      padding-left: 30px;
    }

    .nav a {
      color: #fff;
      text-align: center;
      font-size: 14px;
      text-decoration: none;

    }

    .d-box {
      width: 400px;
      height: 300px;
      border: 5px solid #eee;
      box-shadow: 2px 2px 2px 2px #666;
      position: absolute;
      top: 40%;
      left: 40%;
    }

    .hd {
      width: 100%;
      height: 25px;
      background-color: #7c9299;
      border-bottom: 1px solid #369;
      line-height: 25px;
      color: white;
      cursor: move;
    }

    #box_close {
      float: right;
      cursor: pointer;
    }
  </style>
</head>

<body>
  <div class="d-box" id="d_box">
    <div class="hd" id="drop">注冊信息 (可以拖拽)
      <span id="box_close">【關(guān)閉】</span>
    </div>
    <div class="bd"></div>
  </div>

  <script>
    var d_box = document.getElementById("d_box");
    var drop = document.getElementById("drop");

    /**
    * 給頭部注冊點(diǎn)擊事件 獲取鼠標(biāo)點(diǎn)距離
    */
    drop.onmousedown = function (e) {
      var leftX = e.pageX - d_box.offsetLeft;
      var topY = e.pageY - d_box.offsetTop;

      /**
      * 給document注冊移動(dòng)事件 動(dòng)態(tài)改變彈窗的位置
      */
      document.onmousemove = function (e) {
        d_box.style.left = e.pageX - leftX + "px";
        d_box.style.top = e.pageY - topY + "px";
      }
    }

    /**
    * 鼠標(biāo)離開是取消掉document注冊移動(dòng)事件
    */
    drop.onmouseup = function () {
      document.onmousemove = null;
    }

  </script>
</body>

</html>
BOM對象

平時(shí)常用的對象有window對象、定時(shí)器、location對象、history對象。

1.window對象

  • window對象是一個(gè)全局對象,也可以說是JavaScript中的頂級對象
  • 像document、alert()、console.log()這些都是window的屬性,其實(shí)BOM中基本所有的屬性和方法都是屬性window的。
  • 所有定義在全局作用域中的變量、函數(shù)都會(huì)變成window對象的屬性和方法
  • window對象下的屬性和方法調(diào)用的時(shí)候可以省略window

2.定時(shí)器
2.1延時(shí)定時(shí)器

延時(shí)定時(shí)器可以讓代碼延遲一段時(shí)間之后才執(zhí)行(定時(shí)炸彈)

/**
* 設(shè)置延時(shí)定時(shí)器
*/
//語法:setTimeOut(callback, time);
//參數(shù)1:回調(diào)函數(shù),時(shí)間到了就會(huì)執(zhí)行。
//參數(shù)2:延時(shí)的時(shí)間
//返回:定時(shí)器的id,用于清除
//示例:
var timer = setTimeOut(function(){
    //1秒后將執(zhí)行的代碼。
}, 1000);

/**
* 清除延時(shí)定時(shí)器
*/
//語法:clearTimeOut(timerId)
//參數(shù):定時(shí)器id
//示例:
clearTimeOut(timer);//清除上面定義的定時(shí)器

2.2間歇定時(shí)器

間歇定時(shí)器讓定時(shí)器每隔一段時(shí)間就會(huì)執(zhí)行一次,并且會(huì)一直執(zhí)行,直到清除定時(shí)器為止.

/**
* 設(shè)置間歇定時(shí)器
*/
//語法:var intervalID = setInterval(func, delay);
//參數(shù)1:重復(fù)執(zhí)行的函數(shù)
//參數(shù)2:每次延遲的毫秒數(shù)
//返回:定時(shí)器的id,用于清除
//示例:
var timer = setInterval(function(){
    //重復(fù)執(zhí)行的代碼。
}, 1000);

/**
* 清除間歇定時(shí)器
*/
//語法:clearInterval(intervalID)
//參數(shù):定時(shí)器id
//示例:
clearInterval(timer);//清除上面定義的定時(shí)器

3.location對象

location對象也是window的一個(gè)屬性,location其實(shí)對應(yīng)的就是瀏覽器中的地址欄。

location.href = “http://www.baidu.com”;//讓頁面跳轉(zhuǎn)到百度首頁
location.reload();//讓頁面重新加載
location.reload(true);//強(qiáng)制刷新,相當(dāng)于ctrl+F5
location.reload(false);//刷新,相當(dāng)于F5

console.log(window.location.hash);//哈希值 其實(shí)就是錨點(diǎn)
console.log(window.location.host);//服務(wù)器 服務(wù)器名+端口號
console.log(window.location.hostname);//服務(wù)器名
console.log(window.location.pathname);//路徑名
console.log(window.location.port);//端口
console.log(window.location.protocol);//協(xié)議
console.log(window.location.search);//參數(shù)

5.其他對象

//后退:
history.back();
history.go(-1);
//前進(jìn):
history.forward();
history.go(1);

console.log(screen.width);//屏幕的寬度 
console.log(screen.height);//屏幕的高度
console.log(screen.availWidth);//瀏覽器可占用的寬度
console.log(screen.availHeight);//瀏覽器可占用的高度

6.案例

班級隨機(jī)點(diǎn)名deml,案例請到https://github.com/pengjunshan/WebPJS中查看。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        table {
            margin: 50px auto;
        }

        td {
            padding: 15px;
            text-align: center;

            /*border: 1px solid #000;*/
        }

        input {
            width: 100px;
            height: 40px;
            margin: 0 auto;
        }
    </style>
</head>

<body>
    <input type="button" value="開始" id="btn1">
    <input type="button" value="結(jié)束" id="btn2">
    <script>
        var list = [
            ["@", "@", "@", "老師", "@", "@", "杜嘉暉", "廖國藩", "王浩", "孫廣明", "@"],
            ["@", "張萍", "葉繼平", "沈陽", "許誠", "@", "羅杰", "武富云", "汪昊", "曹菁", "羅莉"],
            ["@", "黃澤民", "吳永霞", "劉娟", "李琛", "@", "賈海華", "葛玥", "袁小雨", "袁敏", "李佩蕓", "竇松婷"],
            ["劉玉軍", "尹欽", "馮梓碩", "闕文琦", "唐海華", "@", "許海燕", "張曼玉", "王正來", "顧軍", "陳輝", "楊陽"],
            ["王夢茹", "胡佳麗", "何育娟", "郞文靜", "劉瑩", "@", "王繼杰", "王壽南", "何家亮", "楊博文", "路雨", "梅瑤瑤"],
            ["張杰", "李明珠", "王淑華", "譚喜兵", "周云卓", "@", "張陸凱", "宋余樂", "王琨", "胡崇文", "謝凌輝", "王康"],
            ["@", "黃張龍", "王世波", "孫蘇霞", "陳振", "@", "劉欽罡", "黃維", "吳偉強(qiáng)", "張童", "李斌"],
        ];

        //1. 創(chuàng)建table,添加到body


        var mTable = document.createElement("table");
        document.body.appendChild(mTable);

        //創(chuàng)建一個(gè)tds變量來存所有的td對象 來做隨機(jī)點(diǎn)名的集合
        let tds = [];

        //2. 根據(jù)list的長度,創(chuàng)建tr,添加到table
        for (let i = 0; i < list.length; i++) {

            //根據(jù)list的長度來創(chuàng)建響應(yīng)的tr 并添加到table中
            var mTr = document.createElement("tr");
            mTable.appendChild(mTr);

            //3. 根據(jù)list[i]的長度,創(chuàng)建td,添加到tr中
            let sonList = list[i];
            for (let i = 0; i < sonList.length; i++) {
                //根據(jù)sonList子集合來創(chuàng)建td 并添加到mTr中
                let mTd = document.createElement("td");
                mTr.appendChild(mTd);

                //如果有人名就設(shè)置背景色填充名字
                if (sonList[i] !== "@") {
                    mTd.innerText = sonList[i];
                    mTd.style.backgroundColor = "yellowgreen";

                    //如果是老師 就不添加到tds集合中
                    if (sonList[i] === "老師") {
                        continue;
                    }
                     //添加到tds集合中
                tds.push(mTd)
                }
            }
        }

        let tiemInterval;
        //開始點(diǎn)名
        document.getElementById("btn1").onclick = function () {

            //先清理定時(shí)器
            clearInterval(tiemInterval);
            tiemInterval = setInterval(function(){

                //先把所有的td背景色都還原
                for(let i=0; i<tds.length; i++){
                    tds[i].style.backgroundColor = "yellowgreen"
                }

                //隨機(jī)一個(gè)td設(shè)置高亮
                let position = parseInt(Math.random() * tds.length);
                tds[position].style.backgroundColor = "hotpink";

            },100);

        }

        //結(jié)束點(diǎn)名 清楚定時(shí)器
        document.getElementById("btn2").onclick = function () {
            clearInterval(tiemInterval);
        }

    </script>
</body>

</html>
隨機(jī)點(diǎn)名案例
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,291評論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,253評論 2 375