DOM

1. DOM操作
  • children 子节点 儿子节点

  • parentNode 父节点

  • 谷歌和火狐的方式

    • firstElementChild 一胎
    • lastElementChild 最后一胎
    • previousElementSibling 上一个兄弟节点
    • nextElementSibling 下一个兄弟节点
  • 这是ie的方式

    • firstChild
    • lastChild
    • previousSibling
    • nextSibling
  • 通过document可以动态的创建和删除节点

    • tagName 获取对象标签的名字 大写
    • createElement 创建节点
    • removeChild 父节点.removeChild(子节点)
    • appendChild 添加节点
  • 添加存在的节点,本质是移动节点

    • nsertBefore 添加节点 insertBefore(new, old)

    • setAttribute : 既可以设置官方属性,又可以设置自定义属性

    • getAttribute : 既可以获取官方属性,也可以获取自定义属性

    • 留言板

<!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>dom</title>
</head>
<body>
    <div class="hero">
        <ul id="girl">
            <li>王昭君</li>
            <li>杨玉环</li>
            <li>妲己</li>
            <li id="can">貂蝉</li>
            <li id="qiao">大乔</li>
        </ul>
        <ol>
            <li>李白</li>
            <li>赵云</li>
            <li>狄仁杰</li>
            <li>诸葛亮</li>
        </ol>
    </div>
    <div class="san">
        <ul>
            <li>关羽</li>
            <li>张飞</li>
            <li>赵云</li>
            <li>马超</li>
            <li>黄忠</li>
        </ul>
        <ol>
            <li>典韦</li>
            <li>许褚</li>
            <li>徐晃</li>
            <li>张辽</li>
            <li>夏侯惇</li>
        </ol>
    </div>
</body>
</html>
<script>
    // var odiv = document.getElementsByClassName('hero')[0]
    // console.log(odiv.children)

    // var oqiao = document.getElementById('qiao')
    // console.log(oqiao.parentNode)

    var ocan = document.getElementById('can')

    console.log(ocan.parentNode.parentNode.nextElementSibling.firstElementChild.lastElementChild.tagName)
</script>
<!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>操作</title>
</head>
<body>
    <ul id="girlstar">
        <li>柳岩</li>
        <li>高圆圆</li>
        <li id="rong">马蓉蓉</li>
    </ul>
    <ul id="women">
        <li>韩红</li>
        <li id="feng">凤姐</li>
        <li>芙蓉姐</li>
    </ul>
    <button id="btn" like="篮球">点我</button>
</body>
</html>
<script>
var obtn = document.getElementById('btn')
var oul = document.getElementById('girlstar')
var owu = document.getElementById('women')

obtn.onclick = function () {
    // obtn.look = 'goudan'
    obtn.setAttribute('look', 'goudan')
    // console.log(obtn.like)
    // console.log(obtn.getAttribute('like'))
    // var oli = document.createElement('li')
    // oli.innerHTML = '柳岩'
    // oli.className = 'yan'
    // 动态添加节点
    // oul.appendChild(oli)
    // var ofeng = document.getElementById('feng')
    // var orong = document.getElementById('rong')
    // oul.appendChild(ofeng)
    // owu.removeChild(ofeng)

    // oul.insertBefore(ofeng, orong)
}

</script>
<!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>留言板</title>
</head>
<body>
    <input id="ip" type="text">
    <input id="btn" type="button" value="留言">
    <ul id="content"></ul>
</body>
</html>
<script>
var oinput = document.getElementById('ip')
var obtn = document.getElementById('btn')
var oul = document.getElementById('content')

// console.log(oul.children)

obtn.onclick = function () {
    // 获取input框的值
    content = oinput.value
    // 创建一个li标签
    var oli = document.createElement('li')
    // 不仅添加内容,还添加删除功能
    oli.innerHTML = content + '&nbsp;&nbsp;<a href="javascript:;">删除</a>'
    // 实现点击删除,删除li的功能
    var oa = oli.getElementsByTagName('a')[0]
    oa.onclick = function () {
        oul.removeChild(oli)
    }

    // 添加的时候,放到最前面
    // 获取ul的第一个子标签,通过判断ul的子标签是否为空
    if (oul.children) {
        // 非空
        oul.insertBefore(oli, oul.children[0])
    } else {
        // 空
        oul.appendChild(oli)
    }
    // 将input框清空
    oinput.value = ''
    // 让input框获得焦点
    oinput.focus()
}

// 普通留言板
/*
obtn.onclick = function () {
    // 获取input框的值
    content = oinput.value
    // 创建一个li标签
    var oli = document.createElement('li')
    oli.innerHTML = content
    // 将li标签添加到ul里面
    // oul.appendChild(oli)
} */
</script>
2. 事件绑定和事件冒泡
  • addEventListener 谷歌和火狐方式

  • removeEventListener

  • attachEvent ie方式

  • detachEvent

  • 获取事件对象

    • 事件ev 火狐、谷歌
    • window.event ie、谷歌
    • 兼容性写法: var oevent = ev || event
  • 获取事件的x和y坐标

    • oevent.clientX oevent.clientY
    • 相对窗口左上角的坐标
  • 取消事件冒泡

    • 事件的属性和方法
      • cancelBubble ie方式、谷歌、火狐都支持
      • stopPropagation() 谷歌、火狐方式
  • 事件源对象

    • srcElement ie、谷歌
    • target 火狐、谷歌
<!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>事件绑定</title>
</head>
<body>
    <div id="lala" style="width:300px; height:300px; background-color:#c90"></div>
</body>
</html>
<script>
var odiv = document.getElementById('lala')

// odiv.addEventListener('click', function () {
//     alert('羌笛何须怨杨柳,春风不度玉门关')
// })
// odiv.addEventListener('click', function () {
//     alert('劝君更尽一杯酒,西出阳关无故人')
// })

// odiv.attachEvent('onclick', function () {
//     alert('君不见黄河之水天上来')
// })
// odiv.attachEvent('onclick', function () {
//     alert('奔流到海不复回')
// })

// odiv.onclick = function () {
//     alert('羌笛何须怨杨柳,春风不度玉门关')
// }
// odiv.onclick = function () {
//     alert('劝君更尽一杯酒,西出阳关无故人')
// }
</script>
<!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>获取事件对象</title>
</head>
<body>
    <div id="dudu" style="width:400px; height:400px; background-color:firebrick"></div>
</body>
</html>
<script>
    var odiv = document.getElementById('dudu')

    odiv.onclick = function (ev) {
        // console.log(ev)
        // alert(ev)
        var oevent = ev || event
        // alert(oevent)
        console.log(oevent.clientX, oevent.clientY)
    }

    // function test(ev) {
    //     alert(ev)
    // }
    // odiv.onclick = test

    // a = 10
    // b = 200

    // var c = a && b
    // console.log(c)
</script>
<!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>事件冒泡</title>
</head>
<body>
    <div id="wai" style="width:400px; height:400px; background-color:pink;">
        <div id="nei" style="width:200px; height:200px; background-color:black;"></div>
    </div>
</body>
</html>
<script>
var owai = document.getElementById('wai')
var onei = document.getElementById('nei')

owai.onclick = function () {
    alert('寻寻觅觅,冷冷清清,凄凄惨惨戚戚')
}
onei.onclick = function (ev) {
    alert('乍暖还寒时候,最难将息,三杯两盏淡酒')
    var oevent = ev || event
    // oevent.cancelBubble = true
    oevent.stopPropagation()

    console.log(oevent.target)
}
</script>
3. 小知识
  • 禁止鼠标右键
    document.oncontextmenu = function () {
    return false
    }
  • 超链接和事件同时触发
    • 事件的属性和方法
      • returnValue ie、谷歌
      • preventDefault() 火狐、谷歌
      • return false ie、谷歌、火狐
  • 键盘事件
    • document.onkeydown : 捕获用户点击的按钮
    • 获取按钮的编号:oevent.keyCode
<!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>小知识</title>
</head>
<body>
    <a id="du" href="http://www.baidu.com/">百度一下</a>
</body>
</html>
<script>
    // document.onkeydown = function (ev) {
    //     var oevent = ev || event
    //     console.log(oevent.keyCode)
    // }
    document.onkeypress = function (ev) {
        var oevent = ev || event
        console.log(oevent.keyCode)
    }
    // var oa = document.getElementById('du')
    // oa.onclick = function (ev) {
    //     alert('这次第,怎一个愁字了得')
    //     var oevent = ev || event
    //     // oevent.returnValue = false
    //     // oevent.preventDefault()
    //     return false
    // }
// document.oncontextmenu = function () {
//     return false
// }
</script>
4. 正则对象
  • 规则是一样的。
    • 单字符:. \w \d \W \s \S \D [aoe]
    • 数量: {m} {m,} {m,n} {0,}==* {1,}==+ {0,1}==?
  • match : 正则匹配
  • replace : 正则替换
5. 表单对象
  • 三种查找方法
    (1). 根据id获取
    (2). document.forms 得到文档中所有的form
    (3). 根据name获取
    - document.formname
    - 获取该表单里面input框的值,假如该input框name=user
    - document.formname.user.value
  • submit()方法
    • document.formname.submit() 谁都能提交
  • js验证表单内容
<!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>表单</title>
</head>
<body>
    <form action="xxx" method="get" name="goudan">
        <input type="text" name="user" value="王狗蛋">
        <!-- <input type="submit" value="提交"> -->
        <a href="javascript:;" id="aa">登录</a>
    </form>
    <form action="" method="post"></form>
</body>
</html>
<script>
var oa = document.getElementById('aa')
oa.onclick = function () {
    document.goudan.submit()
}
// 第二种方式
// console.log(document.forms[1].method)
// console.log(document.goudan)
// console.log(document.goudan.user.value)
</script>
<!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>js验证</title>
</head>
<body>
    <form action="" name="form">
        <input type="text" name="user" placeholder="请输入用户名">
        <span class="user"></span>
        <br><br>
        <input type="text" name="password" placeholder="请输入密码">
        <span class="pwd"></span>
        <br><br>
        <input type="text" name="email" placeholder="请输入邮箱">
        <span class="email"></span>
        <br><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>
<script>
// 找到3个input
oname = document.form.user
opwd = document.form.password
oemail = document.form.email

oname.onblur = function () {
    var spanname = document.getElementsByClassName('user')[0]
    // 得到自己的值
    content = this.value
    // 用户名长度必须大于等于3位
    if (content.length < 3) {
        spanname.innerHTML = '用户名不合法'
        spanname.style.color = 'red'
    } else {
        spanname.innerHTML = '√'
        spanname.style.color = 'green'
    }
}

opwd.onblur = function () {
    var spanpwd = document.getElementsByClassName('pwd')[0]
    // 得到自己的值
    content = this.value
    // 用户名长度必须大于等于3位
    if (content.length < 6) {
        spanpwd.innerHTML = '密码长度不够'
        spanpwd.style.color = 'red'
    } else {
        spanpwd.innerHTML = '√'
        spanpwd.style.color = 'green'
    }
}

oemail.onblur = function () {
    var spanemail = document.getElementsByClassName('email')[0]
    content = this.value
    // test@163.com   lala@sina.cn  1090@qq.com
    re = /^\w+@\w+\.(com|cn)$/
    if (!content.match(re)) {
        spanemail.innerHTML = '邮箱格式不正确'
        spanemail.style.color = 'red' 
    } else {
        spanemail.innerHTML = '√'
        spanemail.style.color = 'green'
    }
}
</script>
practice
  1. 下拉框实现左边移动选项到右边,右边移动选项到左边
<!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>
        .left{
            height: 100px;
            float: left;
        }
        .right{
            height: 100px;
            float: right;
        }

        select{
            font-size: 60px;
            height: 100%;
            position: relative;
            float:left;
        }
        button{
            font-size: 60px;
            height: 100%;
            position: relative;
            float: right;
            background-color: red;
        }
        
    </style>
</head>
<body>
    <div class="left">
        <select name="" id="left">
            <option value="">一弦</option>
            <option value="">二弦</option>
            <option value="">三弦</option>
            <option value="">四弦</option>
            <option value="">五弦</option>
            <option value="">六弦</option>
        </select>
        <button class="btn">去右边</button>
    </div>
    <div class="right">
        <select name="" id="right">
            <option value="">旋钮一</option>
            <option value="">旋钮二</option>
            <option value="">旋钮三</option>
            <option value="">旋钮四</option>
            <option value="">旋钮五</option>
            <option value="">旋钮六</option>
        </select>
        <button class="btn">去左边</button>
    </div>
</body>
</html>
<script>
    var left_div = document.getElementsByClassName("left")
    var right_div = document.getElementsByClassName("right")
    var btn = document.getElementsByClassName("btn")
    var leftsel = document.getElementById("left")
    var rightsel = document.getElementById("right")
    btn[0].onclick = function (){
        rightsel.appendChild(leftsel.options[leftsel.selectedIndex])
    }
    btn[1].onclick = function (){
        leftsel.appendChild(rightsel.options[rightsel.selectedIndex])
    }
</script>
  1. 飘动广告
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>飘动广告</title>
    <style>
    div {
        position: fixed;
        top: 0px;
        left: 0px;
    }
    </style>
</head>
<body>
    <div id="girl">
        <img src="meinv.jpg" alt="" height="300" width="200">
    </div>
</body>
</html>
<script>
var odiv = document.getElementById('girl')
// 定义偏移量
var offset_top = 10
var offset_left = 10
// 兼容性写法获取非行内样式
function getStyle(obj, name) {
    return obj.currentStyle ? obj.currentStyle[name] : getComputedStyle(obj, null)[name]
}

// 获取可视区的宽度和高度
// 获取宽高的时候,要看有没有DTD的说明,如果有,使用documentElement,如果没有,使用body
var clientWidth = document.documentElement.clientWidth
var clientHeight = document.documentElement.clientHeight
// console.log(clientWidth, clientHeight)

setInterval(function () {
    // 动态的修改top和left值
    // 得到你的top和left值
    var top = parseInt(getStyle(odiv, 'top'))
    var left = parseInt(getStyle(odiv, 'left'))
    top += offset_top
    left += offset_left
    // 判断top或则left有没有到达边界
    if (top + 300 > clientHeight || top < 0) {
        offset_top = -offset_top
    }
    if (left + 200 > clientWidth || left < 0) {
        offset_left = -offset_left
    }

    // 再将修改后的值赋值过去
    odiv.style.top = top + 'px'
    odiv.style.left = left + 'px'
}, 5)
</script>
  1. 倒计时,距离国庆节还有多少天、小时、分钟、秒
<!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>倒计时</title>
</head>
<body>
    <h1 id="dao"></h1>
</body>
</html>
<script>
var odao = document.getElementById('dao')
// 获取国庆节的时间
var oqing = new Date('2018-8-23 10:16:00')
// 得到国庆节的时间戳
var oqingcuo = oqing.getTime()
var timer = null
function demo() {
    // 每次都要获取当前的时间对象
    var onow = new Date()
    // 得到当前的时间戳
    var onowcuo = onow.getTime()
    if (oqingcuo <= onowcuo) {
        clearInterval(timer)
    }
    // 得到两个时间戳的差值
    var dist = (oqingcuo - onowcuo) / 1000
    // 将这个差值你要给我计算出来有多少天、多少小时、多少分钟、多少秒
    // 首先计算天数   3600*24=86400  90000
    var day = parseInt(dist / 86400)
    // 计算除了天之后剩下的时间
    dist = dist % 86400
    // 计算小时
    var hour = parseInt(dist / 3600)
    dist = dist % 3600
    // 计算分钟
    var minute = parseInt(dist / 60)
    dist = dist % 60
    var second = parseInt(dist)
    odao.innerHTML = '距离下课还有===' + day + '天' + hour + '小时' + minute + '分钟' + second + '秒'
}
timer = setInterval(demo, 1000)
</script>
  1. 实现全选、全不选、反选
    obj.checked = true 选中
    obj.checked = false 取消
<!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>全选</title>
</head>
<body>
    <li><input type="checkbox">梅西</li>
    <li><input type="checkbox">c罗</li>
    <li><input type="checkbox">内马尔</li>
    <li><input type="checkbox">李哥</li>
    <li><input type="checkbox">詹姆斯</li>
    <li><input type="checkbox">罗纳尔多</li>
    <li><input type="checkbox">库里</li>
    <li><input type="checkbox">乔治</li>
    <li><input type="checkbox">维斯布鲁克</li>
    <li><input type="checkbox">爱新觉罗姚明</li>
    <button>全选</button>
    <button>全不选</button>
    <button>反选</button>
</body>
</html>
<script>
var ainputs = document.getElementsByTagName('input')
var abtns = document.getElementsByTagName('button')
abtns[0].onclick = function () {
    // 遍历所有的input,将每一个input的checked属性设置为true
    for (var i = 0; i < ainputs.length; i++) {
        ainputs[i].checked = true
    }
}

abtns[1].onclick = function () {
    // 遍历所有的input,将每一个input的checked属性设置为true
    for (var i = 0; i < ainputs.length; i++) {
        ainputs[i].checked = false
    }
}

abtns[2].onclick = function () {
    // 遍历所有的input,将每一个input的checked属性设置为true或者false
    for (var i = 0; i < ainputs.length; i++) {
        ainputs[i].checked = !ainputs[i].checked
        // if (ainputs[i].checked) {
        //     ainputs[i].checked = false
        // } else {
        //     ainputs[i].checked = true
        // }
    }
}
</script>
  1. 按住div可以实现div跟随鼠标移动
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跟随鼠标移动</title>

</head>
<body>
    <!-- <div id="girl" style="position: absolute; top: 0px; left: 0px; background-color: red; width: 300px; height: 300px;"> -->
    <div id="girl" style="position: absolute; top: 0px; left: 0px;">
        <img src="meinv.jpg" alt="" height="300" width="200">
    </div>
</body>
</html>
<script>
var odiv = document.getElementById('girl')
odiv.onmousedown = function (ev) {
    var oevent = ev || event
    // 首先得到图片的左边距和上边距
    var divleft = parseInt(odiv.style.left)
    var divtop = parseInt(odiv.style.top)

    // console.log(divleft, divtop)
    // 在这获取鼠标点击的时候,左边的间距和上边的间距
    var offsettop = oevent.clientY - divtop
    var offsetleft = oevent.clientX - divleft
    // console.log(offsettop, offsetleft)

    document.onmousemove = function (ev) {
        var oe = ev || event
        console.log(ev.clientX, ev.clientY)
        // 修改div的top和left值
        odiv.style.top = (oe.clientY - offsettop) + 'px'
        odiv.style.left = (oe.clientX - offsetleft) + 'px'
    }
    return false
}

odiv.onmouseup = function () {
    document.onmousemove = null
}


</script>

获取可视区的宽度和高度

// 获取宽高的时候,要看有没有DTD的说明,如果有,使用documentElement,如果没有,使用body

  • var clientWidth = document.documentElement.clientWidth
  • var clientHeight = document.documentElement.clientHeight
1. 吸顶条

可以直接获取到div的宽度和高度,而且是不带px, 并且样式无论在哪都可以获取到,这两个属性是只读属性

  • offsetWidth
  • offsetHeight
    可以直接获取到div的距离浏览器上边的距离和距离浏览器左边的距离,而且是不带px, 并且样式无论在哪都可以获取到,这两个属性是只读属性
  • offsetTop
  • offsetLeft
<!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>offset属性</title>
    <style>
    div {
        width: 400px;
        height: 500px;
        background-color: cyan;
        position: absolute;
        top: 100px;
        left: 200px;
    }
    </style>
</head>
<body>
    <div id="dudu"></div>
</body>
</html>
<script>
var odiv = document.getElementById('dudu')
// 可以直接获取到div的宽度和高度,而且是不带px, 并且样式无论在哪都可以获取到,这两个属性是只读属性
// console.log(odiv.offsetWidth, odiv.offsetHeight)
// 可以直接获取到div的距离浏览器上边的距离和距离浏览器左边的距离,而且是不带px, 并且样式无论在哪都可以获取到,这两个属性是只读属性
console.log(odiv.offsetTop, odiv.offsetLeft)
</script>
2. 自动播放选项卡

见代码

<!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>自动播放选项卡</title>
    <style>
        .box {
            width: 1000px;
            border: 1px solid gray;
            margin: 0 auto;
        }
        button {
            width: 170px;
            height: 100px;
            font-size: 20px;
            background-color: pink;
            margin-left: 55px;
            display: inline-block;
        }
        .box > div {
            width: 970px;
            height: 600px;
            font-size: 50px;
            background-color: yellow;
            margin-left: 15px;
            margin-top: 50px;
            display: none;
        }
        .box > .active {
            font-size: 30px;
            background-color: blue;
        }
        .box > .show {
            display: block;
        }
        </style>
</head>
<body>
    <div class="box">
        <button class="active">国产电影</button>
        <button>韩日电影</button>
        <button>欧美电影</button>
        <button>其他电影</button>
        <div class="show">霸王别姬、卧虎藏龙、大话西游、东邪西毒、无间道、功夫</div>
        <div>釜山行、汉江怪物、奥特曼、灌篮高手、热血高校、午夜凶铃</div>
        <div>肖申克的救赎、阿甘正传、敢死队、泰坦尼克号、这个杀手不太冷、盗梦空间</div>
        <div>三傻大闹宝莱坞、摔跤吧、小萝莉的猴神大叔、厕所英雄</div>
    </div>
</body>
</html>
<script>
// 首先找到最外层的box
var obox = document.getElementsByClassName('box')[0]
// 找到所有的button
var abtns = obox.getElementsByTagName('button')
// 找到所有的div
var adivs = obox.getElementsByTagName('div')

// 记录要切换的div获取按钮的下标
var number = 0

// 循环给每一个button添加点击事件
for (var i = 0; i < abtns.length; i++) {
    abtns[i].index = i
    abtns[i].onclick = function () {
        // 首先清空所有的class
        for (var j = 0; j < abtns.length; j++) {
            abtns[j].className = ''
            adivs[j].className = ''
        }
        // 然后给指定的添加class
        this.className = 'active'
        adivs[this.index].className = 'show'
        // 将number更新一下
        number = this.index
    }
}



// 自动播放代码
function next() {
    // 显示下一个需要显示的button和div
    number++
    number %= 4
    // 先清掉所有的样式
    for (var j = 0; j < abtns.length; j++) {
        abtns[j].className = ''
        adivs[j].className = ''
    }
    abtns[number].className = 'active'
    adivs[number].className = 'show'
}
var timer = setInterval(next, 1000)

// 如果鼠标放到box上面,将定时器销毁,鼠标离开box的时候,重新创建定时器自动播放
obox.onmouseover = function () {
    clearInterval(timer)
}
obox.onmouseout = function () {
    timer = setInterval(next, 1000)
}
</script>
3. jquery
  • jquery是什么?
    jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers. With a combination of versatility and extensibility, jQuery has changed the way that millions of people write JavaScript.
    jQuery是一个快速、小型、功能丰富的JavaScript库。它使HTML文档遍历和操作、事件处理、动画和Ajax等工作变得更加简单,并且具有在多个浏览器之间工作的易于使用的API。结合了通用性和可扩展性,jQuery改变了数百万人编写JavaScript的方式。
  • 版本要求:看版本.txt
  • 压缩和非压缩
    • .min.js : 压缩版本,一行代码,没有了空格、缩进等
      .js : 非压缩版本,正常的代码查看
    • 使用方式
      • 可以本地使用
        <script src="jquery/jquery-1.11.3.min.js"></script>
      • 可以引入网络文件使用
        <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
  • 选择器
    • jquery通过选择器就可以找到指定的节点
      id、class、标签、层级
      • 基本
        :first 第一个
        :last 最后一个
        :even 偶数下标
        :odd 奇数下标
        :eq() 等于哪个下标
        :gt() 大于哪个下标
        :lt() 小于哪个下标
<!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>jquery</title>
    <script src="jquery/jquery-1.11.3.min.js"></script>
</head>
<body>
    <div id="lala">周杰伦</div>
    <div class="star">王力宏</div>
    <div class="star">林俊杰</div>
    <div class="song">
        <div class="wang">
            <ul>
                <li>王宝强</li>
                <li>王者荣耀</li>
                <li>王八蛋</li>
            </ul>
        </div>
        <div class="ma">
            <ul>
                <li>马云</li>
                <li>马蓉</li>
                <li>马化腾</li>
            </ul>
        </div>
    </div>
</body>
</html>
<script>
$(function () {
    // jquery代码都写到这里
    // $('#lala').css('backgroundColor', 'red')
    // $('.star').css('backgroundColor', 'yellow')
    // $('li').css('backgroundColor', 'blue')
    // $('.song > li').css('backgroundColor', 'cyan')

    // 第一个
    // $('li:first').css('backgroundColor', 'cyan')
    // 最后一个
    // $('li:last').css('backgroundColor', 'cyan')
    // 偶数下标的
    // $('li:even').css('backgroundColor', 'cyan')
    // 奇数下标的
    // $('li:odd').css('backgroundColor', 'cyan')
    // 等于1的
    // $('li:eq(1)').css('backgroundColor', 'cyan')
    // 大于2的
    // $('li:gt(2)').css('backgroundColor', 'cyan')
    // 小于2的
    // $('li:lt(2)').css('backgroundColor', 'cyan')
})
</script>
practice
  1. 图片切换
<!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>图片切换</title>
    <script src="../jquery/jquery-1.11.3.min.js"></script>
    <style>
        td, img {
            width: 200px;
            height: 150px;
        }
    </style>
</head>
<body>
    <table border="1" id="table">
        <tr>
            <td><img onclick="fun(this)" src="images/11.jpg"/></td>
            <td><img onclick="fun(this)" src="images/22.jpg"/></td>
            <td><img onclick="fun(this)" src="images/33.jpg"/></td>
            </tr>
    </table>
    <img src="images/11.jpg" id="showImg"/>
</body>
</html>
<script>
    console.log($("#table img"))
    function fun(omg){
        $("#showImg").attr("src",omg.src)
    }
</script>
  1. 快速划过没有反应

  1. 简易年历

  1. 回到顶部

1. 选择器
  • 基本
    :first :last :even :odd :not :eq()
  • 内容
        contains  内容包含某某某的节点
        has 写一个选择器,
        $('li:has(a)')  li里面有a的li
  • 属性
        input[name]       有属性name的input
        input[name=user]  name属性等于user的input
        input[name!=user] name属性不等于user的input
        // 有属性name的input
        // $('input[name]').css('backgroundColor', 'cyan')
        // 属性name值为user的input
        // $('input[name=user]').css('backgroundColor', 'cyan')
        // 属性name值不为user的input
        // $('input[name!=user]').css('backgroundColor', 'cyan')
        // 属性name值以user开头的input
        // $('input[name^=user]').css('backgroundColor', 'cyan')
        // 属性name值以user结束的input
        // $('input[name$=user]').css('backgroundColor', 'cyan')
  • 子元素
    :first-child
    :last-child
    :nth-child
        // 找到li标签,li是第一个儿子节点的li标签
        // $('li:first-child').css('backgroundColor', 'cyan')
        // 找到li标签,li是最后一个儿子节点的li标签
        // $('li:last-child').css('backgroundColor', 'cyan')
        // 找li标签,找指定下标的li标签,这个下标是儿子节点里面的第几个
        // $('li:nth-child(1)').css('backgroundColor', 'cyan')
2. 样式添加、属性获取
  • css({})
        // 可以连写-链式操作
        // $('#lala').css('backgroundColor', 'red').css('fontSize', '30px')
        // 可以传递一个js对象,直接全部修改
        // $('#lala').css({backgroundColor: 'blue', fontSize: '40px'})
  • attr()
        // 获取指定节点的class属性
        // console.log($('#lala').attr('class'))
        // 只能获取第一个符合要求的id属性
        // console.log($('.libai').attr('id'))
        // 通过eq选择第二个符合要求的id属性
        // console.log($('.libai:eq(1)').attr('id'))
        // 给指定节点添加属性
        // $('#lala').attr('class', 'bai').attr('name', '狗蛋')
  • removeAttr()
        // 将指定节点的属性删除
        // $('#lala').removeAttr('class')
  • prop()
    经常用来设置checked、selected等属性,设置的值就是true、false
        // 所有下标大于1的多选框选中
        // $('input:gt(1)').prop('checked', true)
        // 将第二个下拉框设置为默认选中
        // $('#se > option:eq(2)').prop('selected', true)
  • addClass
        // $('#lala').addClass('hei')
  • removeClass
        // 给指定的节点添加类名
        // $('#lala').addClass('hei')
        // 给指定的节点移除指定的节点class名  bai
        // $('#lala').removeClass('bai')
  • toggleClass
        // 有bai这个class,那就是删除这个class,没有bai这个class,那就是添加class
        // $('#lala').toggleClass('bai')
  • html()
        // 读取或者设置节点内容,和innerHTML功能相同
        // console.log($('#lala').html('醉卧沙场君莫笑,古来征战几人回'))
  • text()
    读取或者设置节点内容,和innerText功能相同
  • val()
        // 读取input框里面的内容
        // console.log($('#ip').val())
        // 设置input框里面的内容
        // console.log($('#ip').val('今天中午吃什么呢?'))
  • width() , height()
        // 读取指定对象宽度  不带px
        // console.log($('#dudu').width())
        // 设置宽度  不带px
        // console.log($('#dudu').width(300))
        // 读取高度
        // console.log($('#dudu').height())
        // 设置高度
        // console.log($('#dudu').height(400))
  • offset()
        // 获取div的top值和left值
        // console.log($('#dudu').offset().top, $('#dudu').offset().left)
3. js对象和jquery对象转化
  • js对象和jquery对象的函数不能通用
  • js对象和jquery对象相互转化
    // var odiv = document.getElementById('dudu')
    // js对象转化jquery对象
    // console.log($(odiv).width())

    // jquery对象转化为js对象
    // console.log($('#dudu')[0].style.width)

    // console.log($('.lala')[1].style.width)
4. 文档处理
  • append
  • appendTo
  • prepend
  • prependTo
        // 向父节点添加子节点
        // $('#car').append('<li>本田飞度</li>')
        // 通过子节点调用,添加到父节点
        // $('<li>本田飞度</li>').appendTo($('#car'))
        // 通过父节点调用,添加到父节点的最前面
        // $('#car').prepend('<li>本田飞度</li>')
        // 通过子节点调用,添加到父节点的最前面
        // $('<li>通用别克</li>').prependTo($('#car'))
  • after
  • before
        // 是兄弟节点关系,在mao节点后面添加一个指定节点
        // $('#mao').after('<li>铃木雨燕</li>')
        // 是兄弟节点关系,在mao节点前面添加一个指定节点
        // $('#mao').before('<li>铃木雨燕</li>')
  • empty
  • remove
        // 清空指定节点里面的内容,节点还在
        // $('#mao').empty()
        // 原生js中:父节点.removeChild(子节点)
        // 通过子节点直接调用,删除当前节点
        // $('#mao').remove()
5. 筛选和查找
  • eq
        // $('li').eq(n).css('backgroundColor', 'red')
        // $('li:eq(0)').css('backgroundColor', 'red')
        // $('li:eq(' + 0 + ')').css('backgroundColor', 'red')
  • first
  • last
        // 第一个li   和:first 一模一样
        // $('li').first().css('backgroundColor', 'red')
        // 最后一个li   和:last 一模一样
        // $('li').last().css('backgroundColor', 'red')
  • hasClass
        // 判断有没有这个class,有就返回true,没有返回false
        // console.log($('li').eq(0).hasClass('wang'))
  • filter
        // 找到所有li,过滤出来 .jing 的这些li
        // $('li').filter('.jing').css('backgroundColor', 'cyan')
  • slice
        // 取出符合要求li里面的第0个和第1个   [start, end)
        // $('li').slice(0, 2).css('backgroundColor', 'cyan')
  • children
        // 所有的儿子节点
        // $('#nan').children().css('backgroundColor', 'red')
        // 儿子节点中 有 .feng 的节点
        // $('#nan').children('.feng').css('backgroundColor', 'red')
  • find
        // 去子孙节点中查找所有的 .feng 的节点
        // $('#nan').find('.feng').css('backgroundColor', 'cyan')
  • next
  • nextAll
        // 指定对象的下一个兄弟节点
        // $('#wu').next().css('backgroundColor', 'cyan')
        // 指定对象的后面所有的节点
        // $('#wu').nextAll().css('backgroundColor', 'cyan')
  • prev 指定对象的上一个兄弟节点
  • prevAll 指定对象的上面所有的兄弟节点
  • parent
  • parents
        // 找到当前节点的父节点
        // $('.lin').parent().css('backgroundColor', 'cyan')
        // 查找得到所有的上层节点
        // $('#qing').parents().css('backgroundColor', 'cyan')
        // 查找得到指定的上层节点
        // $('#qing').parents('div').css('backgroundColor', 'cyan')
  • siblings
        // 查找qing节点所有的兄弟节点
        // $('#qing').siblings().css('backgroundColor', 'orange')
        // 查找qing节点所有的兄弟节点,而且是.lin的兄弟节点
        // $('#qing').siblings('.lin').css('backgroundColor', 'orange')
6. 事件
  • 添加事件
        $('div).click(function () {})
  • 事件绑定
    on off one
    绑定事件
        $('div').on('click', test1)
        $('div').on('click', test2)
        取消事件绑定
        $('div').off('click', test2)
        // 事件只能触发一次
        $('div').one('click', test2)
  • 取消冒泡
    ev.stopPropagation()
  • 阻止默认行为
    ev.preventDefault()
  • 获取鼠标坐标
    ev.pageX, ev.pageY
  • index
    // 得到指定jquery对象在前面数组中的下标
    // console.log(('div').index(('#heng')))
7. 动画
  • show()
        // 参数1:动画的事件
        // 参数2:动画完毕之后执行的函数
        $('#dudu').show(5000, function () {
            alert('菊花残,满地伤')
        })
  • hide()
    和show一样
    $('#dudu').hide(5000, fn)
  • slidedown()
    原来不显示,动画下拉显示
    $('#dudu').slideDown(5000)
  • slideup()
    原来显示,动画的上拉消失
  • slideToggler()
    如果隐藏就下拉显示,如果显示就上拉消失
  • fadeIn()
    // 慢慢的显示出来
    // $('#dudu').fadeIn(5000)
  • fadeOut()
    // 慢慢的消失
    // $('#dudu').fadeOut(5000)
  • fadeTo()
    // 5秒之内,透明度变为0.01
    // $('#dudu').fadeTo(5000, 0.01)
  • fadeToggle()
    如果隐藏就淡入显示,如果显示就淡出消失
    自定义的动画效果
  • animate()
    // 自定义动画
    // $('#dudu').animate({width: 1000, height: 500, opacity: 0.1}, 5000)
  • stop()
    停止动画
    $('#dudu').stop()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 1、DOM操作 children 子节点 儿子节点parentNode 父节点 谷歌和火狐的方式firs...
    七一欧阅读 187评论 0 1
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,457评论 1 45
  • 一、DOM 什么是DOM?Document Object Model(文档对象模型)。DOM是针对HTML和XML...
    空谷悠阅读 963评论 0 2
  • 引子:Web编程深似海 原计划用8天时间进行Web前端的学习,结果拖延了,原因自然是对这部分内容学习的难度估计不足...
    魏小筠阅读 757评论 0 3
  • 以前总觉得虽然喜欢是需要感觉的、所以一个人海外上学、无论真的寂寞、孤独、或是只是孤立无援。也不会轻易把自己交给所谓...
    懵萌阅读 99评论 0 1