DOM

JQuery是把DOM和JavaScript的功能封装了的模块,可以获取到网页元素并操作元素。

没有JQuery仅用DOM也能实现功能,但是需要考虑的就多了,如下例:

DOM的document.getElementById('i1'); 等价于 JQuery的$('#i1'),可见JQuery简化了。

#几乎所有的运维开发都能用JQuery,哪种情况不用JQuery呢,开发app的时候,app好多使用移动流量的,向服务器请求JQuery是会产生流量的,为了节省用户流量,app不会使用JQuery。

DOM存在浏览器兼容性问题,在chrome和firefox上没事,在IE上可能有问题,JQuery的出现也变相了解决了DOM兼容问题,你只需要用JQuery即可,不会产生浏览器不兼容的情况。

无特殊要求的话,用JQuery1.12及以上的版本,但不要用2.X的版本,因为从2.X开始就不支持IE9及以下的浏览器了,所以1.X的兼容性更好。

1.DOM介绍及应用

虽然做运维开发的话,几乎是用JQuery而不是DOM,但也要了解一下。

1.1 查找元素

直接查找:

document.getElementById             根据ID获取一个标签
document.getElementsByName          根据name属性获取标签集合
document.getElementsByClassName     根据class属性获取标签集合
document.getElementsByTagName       根据标签名获取标签集合

间接查找:

parentNode          // 父节点
childNodes          // 所有子节点
firstChild          // 第一个子节点
lastChild           // 最后一个子节点
nextSibling         // 下一个兄弟节点
previousSibling     // 上一个兄弟节点
 
parentElement           // 父节点标签元素
children                // 所有子标签
firstElementChild       // 第一个子标签元素
lastElementChild        // 最后一个子标签元素
nextElementtSibling     // 下一个兄弟标签元素
previousElementSibling  // 上一个兄弟标签元素

1.2 操作

1.2.1 内容

innerText   文本
outerText
innerHTML   HTML内容
innerHTML  
value       值

1.2.2 属性

attributes                // 获取所有标签属性
setAttribute(key,value)   // 设置标签属性
getAttribute(key)         // 获取指定标签属性
removeAttribute(key)   //删除指定标签属性

 

 

1.2.3 class操作

className                // 获取所有类名
classList.remove(cls)    // 删除指定类
classList.add(cls)       // 添加类

1.2.4 标签操作

a. 创建标签

// 方式一
var tag = document.createElement('a')
tag.innerText = "wupeiqi"
tag.className = "c1"
tag.href = "http://www.cnblogs.com/wupeiqi"
 
// 方式二
var tag = "<a class='c1' href='http://www.cnblogs.com/wupeiqi'>wupeiqi</a>"

b.操作标签

// 方式一
var obj = "<input type='text' />";
xxx.insertAdjacentHTML("beforeEnd",obj);
xxx.insertAdjacentElement('afterBegin',document.createElement('p'))
 
//注意:第一个参数只能是'beforeBegin''afterBegin''beforeEnd''afterEnd'
 
// 方式二
var tag = document.createElement('a')
xxx.appendChild(tag)
xxx.insertBefore(tag,xxx[1])

1.2.5 样式操作

var obj = document.getElementById('i1')
 
obj.style.fontSize = "32px";
obj.style.backgroundColor = "red";

1.2.6 实现输入框的鼠标点击事件

鼠标点击文本框,“请输入关键字”消失。

<body>
    <input id="i1" type="text" value="请输入关键字" onfocus="Focus();" onblur="Blur();" />
    <input id="i2" type="text" value="text2" />
    
    <script type="text/javascript">
        function Focus(){
            var tag = document.getElementById('i1');
            if(tag.value.trim() == "请输入关键字"){
                tag.value = "";
            }
        }
        function Blur(){
            var tag = document.getElementById('i1');
            if(tag.value.trim().length == 0){
                tag.value = "请输入关键字";
            }
        }
    </script>
    
</body>

1.2.7 点击按钮后弹出对话框

<!DOCTYPE html>
<html lang="en">
<head>
    <title>fazhan</title>
    <meta charset="UTF-8" />
    <style>
        body{
            margin:0;
        }
        .beijing{
            height:2000px;
            background-color:green;
        }
        .hide{
            display:none !important
        }
        .shade{
# 为保证这个阴影层能覆盖页面所有,所以定义了position:fixed,上下左右都是0。
            position:fixed;
            top:0;
            bottom:0;
            left:0;
            right:0;
            background-color:rgba(0,0,0,.6);
            z-index:9;
        }
        .kong{
            width:400px;
            height:200px;
            background-color:white;
            position:fixed;
            top:50%;
            left:50%;
            margin-left:-200px;
            margin-top:-100px;
            z-index:10;
        }
    </style>
    
        
</head>
    
<body>
    <div class="beijing">
        <input id="anniu" type="button" value="点我" onclick="Click();">
    </div>
    <div id="shade" class="shade hide">
        
    </div>
    
    <div id="kong" class="kong hide">
        //javascript:void(0);点击a标签时什么也不做。
        <a href="javascript:void(0);" onclick="canClick();">取消</a>
    </div>
    
    
    <script type="text/javascript">
        function Click(){
            var t1 = document.getElementById('shade');
            var t2 = document.getElementById('kong');
            
            // 移除获取到的标签的class的hide值。
            t1.classList.remove('hide');
            t2.classList.remove('hide');
        }
        
        function canClick(){
            var t1 = document.getElementById('shade');
            var t2 = document.getElementById('kong');
            
            // 获取到的标签的class的值,添加hide。
            t1.classList.add('hide');
            t2.classList.add('hide');
        }
    </script>
    
</body>
</html>

 1.2.8 多选框的全选反选

<body>
    <input type="button" value="全选" onclick="CheckAll()" />
    <input type="button" value="取消" onclick="CheckCancel()" />
    <input type="button" value="反选" onclick="CheckReverse()" />
    <table>
        <thead>
            <tr>
                <td>选择</td>
                <td>用户列表</td>
                <td>密码列表</td>
            </tr>
        </thead>
        
        <tbody id="tb">
            <tr>
                <td><input type="checkbox" id="c1" /></td>
                <td>用户1</td>
                <td>密码1</td>
            </tr>
            <tr>
                <td><input type="checkbox" id="c2" /></td>
                <td>用户2</td>
                <td>密码2</td>
            </tr>
            <tr>
                <td><input type="checkbox" id="c3" /></td>
                <td>用户3</td>
                <td>密码3</td>
            </tr>
        </tbody>
    </table>
    
    <script>
        function CheckAll(){
            var tag = document.getElementById('tb');
            var trs = tag.children;
            for(i=0;i<trs.length;i++){
                trs[i].firstElementChild.firstElementChild.setAttribute('checked','checked');
            }
        }
        function CheckCancel(){
            var tag = document.getElementById('tb');
            var trs = tag.children;
            for(i=0;i<trs.length;i++){
                trs[i].firstElementChild.firstElementChild.removeAttribute('checked');
            }
        }
        function CheckReverse(){
            var tag = document.getElementById('tb');
            var trs = tag.children;
            for(i=0;i<trs.length;i++){
                var ck = trs[i].firstElementChild.firstElementChild;
                if(ck.getAttribute('checked') == 'checked'){
                    ck.removeAttribute('checked');
                }else{
                    ck.setAttribute('checked','checked');
                }
            }
        }

    </script>
</body>

上面的代码,是通过检测getAttribute('checked')是否有值来进行反选的,全选和取消也是通过获取属性来判断的,但是有个问题,通过这种方式全选,达到了在视觉上的选择,但是代码里并没有增加'checked'='checked'内容,所以对于已勾选的项目,它的ck.getAttribute('checked')也是null,因为代码里没有'checked'='checked'。所以下面的方法是通过obj.checked来判断的,更准确。

注:以后实现该功能尽量用obj.checked的方式,千万不要getAttribute和obj.checked混着用,肯定会出问题。

<body>
    <input type="button" value="全选" onclick="CheckAll()" />
    <input type="button" value="取消" onclick="CheckCancel()" />
    <input type="button" value="反选" onclick="CheckReverse()" />
    <table>
        <thead>
            <tr>
                <td>选择</td>
                <td>用户列表</td>
                <td>密码列表</td>
            </tr>
        </thead>
        
        <tbody id="tb">
            <tr>
                <td><input type="checkbox" id="c1" /></td>
                <td>用户1</td>
                <td>密码1</td>
            </tr>
            <tr>
                <td><input type="checkbox" id="c2" /></td>
                <td>用户2</td>
                <td>密码2</td>
            </tr>
            <tr>
                <td><input type="checkbox" id="c3" /></td>
                <td>用户3</td>
                <td>密码3</td>
            </tr>
        </tbody>
    </table>
    
    <script>
        function CheckAll(){
            var tag = document.getElementById('tb');
            var trs = tag.children;
            for(i=0;i<trs.length;i++){
                trs[i].firstElementChild.firstElementChild.checked = true;
            }
        }
        function CheckCancel(){
            var tag = document.getElementById('tb');
            var trs = tag.children;
            for(i=0;i<trs.length;i++){
                trs[i].firstElementChild.firstElementChild.checked = false;
            }
        }
        function CheckReverse(){
            var tag = document.getElementById('tb');
            var trs = tag.children;
            for(i=0;i<trs.length;i++){
                var ck = trs[i].firstElementChild.firstElementChild;
                if(ck.checked){
                    ck.checked = false;
                }else{
                    ck.checked = true;
                }
            }
        }

    </script>
</body>

 1.2.9 点赞的特殊效果

<!DOCTYPE html>
<html lang="en">
<head>
    <title>fazhan</title>
    <meta charset="UTF-8" />
    <style>
        .item{
            padding:50px;
            position:relative;
        }
        .item span{
            position:absolute;
            top: 45px;
            left: 70px;
            opacity:1;
            font-size:15px;
        }
    </style>
</head>

<body>
    <div class="item">
        #this指的是当前触发事件的标签
        <a id="zan" onclick="zanClick(this)">1赞</a>
    </div>
    <div class="item">
        <a id="zan" onclick="zanClick(this)">2赞</a>
    </div>
    <div class="item">
        <a id="zan" onclick="zanClick(this)">3赞</a>
    </div>
    <div class="item">
        <a id="zan" onclick="zanClick(this)">4赞</a>
    </div>
    
    <script>
        function zanClick(ths){
            var top = 49;
            var left = 70;
            var op = 0.6;
            var fontSize = 18;
            var tag = document.createElement('span'); 
            tag.innerText = '+1';
            tag.style.position = 'absolute';
            tag.style.top = top + 'px';
            tag.style.left = left + 'px';
            tag.style.op = op;
            tag.style.fontSize = fontSize + 'px';
            ths.parentElement.appendChild(tag);
            
            //setInterval会返回一个值,这个值就是当前的定时器。
            var interval = setInterval(function(){
                top -= 10;
                left += 10;
                fontSize += 5;
                op -= 0.1;
                
                tag.style.top = top + 'px';
                tag.style.left = left + 'px';
                tag.style.op = op;
                tag.style.fontSize = fontSize + 'px';
                if(op <= 0.2){
                    clearInterval(interval);
                    ths.parentElement.removeChild(tag);
                }
            },1000);
        }
    </script>
</body>
</html>

总结:

this,当前触发事件的标签
createElement,创建标签
parentElement,获取父标签
appendChild,给标签添加子元素
removeChild,移除子元素
setInterval,设置定时器
clearInterval,删除定时器

1.2.10 页面输出、定时器、重定向

console.log                 输出框
alert                       弹出框
confirm                     确认框
  
// URL和刷新
location.href               获取URL
location.href = "url"       重定向
location.reload()           重新加载
  
// 定时器
setInterval                 多次定时器
clearInterval               清除多次定时器
setTimeout                  单次定时器
clearTimeout                清除单次定时器

confirm:

用户选择了确定就返回true,选择了取消就返回false。

 

setInterval:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>fazhan</title>
    <meta charset="UTF-8" />
    <style>

    </style>
</head>

<body>
    <div id="status" style="color:red;">
        
    </div>
    <input type="button" value="delete" onclick="DeleteFunc()">
    <script>
        function DeleteFunc(){
            var s = document.getElementById('status');
//给标签添加内容,过3秒后自动删除。
            s.innerText = '删除成功';
            setTimeout(function(){
                s.innerText = '';
            },3000)
        }
    </script>
</body>
</html>

 1.2.11 返回顶部

<!DOCTYPE html>
<html lang="en">
<head>
    <title>fazhan</title>
    <meta charset="UTF-8" />
    <style>
        .sspan{
            position:fixed;
            right:10px;
            bottom:10px;
            color:red;
        }
        .hide{
            display:none !important;
        }
    </style>
</head>

# 没滚动一下滑轮,就触发一次方法,检测是否达到了一定高度,到了一定高度才显示“返回顶部”
<body onscroll="CheckScroll()">
    <div style="height:2000px;background-color:#dddddd;">
        
    </div>
    <span class="sspan hide" id="fanhui" onclick="FanhuiFunc()">返回顶部<span>
    <script>
        function CheckScroll(){
            var top = document.body.scrollTop;
            var t = document.getElementById('fanhui');
            if(top >= 100){
                t.classList.remove('hide');
            }else{
                t.classList.add('hide');
            }
        }
        
        function FanhuiFunc(){
#document.body.scrollTop是获取当前窗口的滚动高度,设置为0表示回到顶部。
            document.body.scrollTop = 0;
        }
    </script>
</body>
</html>

 1.2.12 利用JS和DOM提交表单

document.geElementById('form').submit()

#例子:
<body>
    <form id="f1">
        <input type="text" />
        <a onclick="Submit()">提交</a>
    </form>
    
    <script>
        function Submit(){
            var form = document.getElementById('f1');
            form.submit();
        }
    </script>
</body>

 1.3 事件

对于事件需要注意的要点:

  • this
  • event
  • 事件链以及跳出

this标签当前正在操作的标签,event封装了当前事件的内容。

onkeydown:

<body>
    <script>
        window.onkeydown = function(event){
            console.log(event);
        }
    </script>
</body>

在页面中嵌入了上面的代码,则随便按下一个键盘,在chrome的console里就会出来关于event的信息,包含按下的键对应的ASCII码,如ESC是“keyCode:27;key:Escape”,可以可以根据keyCode来判断用户输入了哪个键。

<head>
    <title>fazhan</title>
    <meta charset="UTF-8" />
    <style>
        .hide{
            display:none !important;
        }
    </style>
</head>

<body>
    <div>
        <span id="span1" class="hide">123</span>
    </div>
    <script>
        function f1(){
            var tag = document.getElementById('span1');
            tag.classList.remove('hide');
        }
#当用户按下ESC后,页面显示123。
        window.onkeydown = function(event){
            if(event.keyCode == 27){
                f1();
            }
        }
    </script>
</body>

 1.4 默认事件和自定义事件的优先级

1.4.1 a标签的默认事件是跳转、submit标签的默认事件是提交

<body>
    <div>
        <a href="https://www.baidu.com" onclick="f1()">点击</a>
        
        <input type="submit" onclick="f1()" value="提交"/>
    </div>
    <script>
        function f1(){
            alert('123');
        }
    </script>
</body>

 

点了“点击”后,先弹出123框,点了确定后才跳转到www.baidu.com或者才提交表单,意思是自定义事件的优先级高于a标签和submit标签的默认事件。

1.4.2 checkbox标签的默认事件

<body>
    <div>
        <input type="checkbox" onclick="f1()" />
    </div>
    <script>
        function f1(){
            alert('123');
        }
    </script>
</body>

点了checkbox框后,先勾选的框,再弹出的123,所以checkbox的默认事件优先级高于自定义事件。

 

讲这个的作用:注册网站时,如果什么都没写,直接点提交,应该是先在本地检查输入内容合法性(自定义js),如果合法了才会提交表单,所以如果自定义了检验代码合法性的事件,就可以做到输入内容不合法就终止,合法了才提交。

posted @ 2016-11-28 15:14  freedom_dog  阅读(236)  评论(0编辑  收藏  举报