美文网首页前端基础JS相关面试
原生的DOM操作、jq的DOM操作及元素操作

原生的DOM操作、jq的DOM操作及元素操作

作者: 小太阳会发光i | 来源:发表于2017-02-22 21:16 被阅读135次

    JS中所有全局都是window的

    window的作用:在封闭空间中声明一个全局的变量 
    全局变量和函数都属于window
    

    javascript

     是由什么东西组成?
     ECMAScript 核心解释器(ES5和ES6)
     DOM BOM
    提供最基本的功能比如:12+5  var a = 12; function show(){}
    兼容性:完全兼容。
    

    DOM 文档对象模型 Document Object Model

    就是document 操作页面的。
    获取元素,修改样式,创建元素
    兼容性:很好,有不兼容的,但是可以解决。
    

    BOM 浏览器对象模型 Browser Object Model

    就是window 操作浏览器
        window.onload
        window.alert();
      兼容性:基本不兼容,解决不了。
    

    BOM

    BOM 跟浏览器有关。
    window
    打开一个新页面。
    window.open(地址)
    window.open(地址,打开方式);
    打开方式:
        _blank   加载到一个新的窗口
        _self    替换当前页面
        .....
    window.location:
        alert(window.location);
        alert(window.location.href);
        window.location = 'http://www.baidu.com';
        alert(window.location.hash);  //#锚点信息
        alert(window.location.host);  //域名 localhost:63342
        alert(window.location.hostname); //主机名 localhost
        alert(window.location.port); //端口
        alert(window.location.protocol); //协议 http https
        alert(window.location.search); //数据信息
        alert(window.location.pathname); //路径名
    window.history:
              历史
        window.history.forward(); //前进
        window.history.back();   //后退
        window.history.go(数字); //去哪个 前进:1 后退:-1 前进2个:2
    confirm:
    alert('提示信息')  弹出提示框
    confirm('提示信息')   ——>  也有返回值:true / false
        如果选了确定  --  true
        如果选了取消 --  false
    var bDel = confirm('真的要删除吗?');
        if(bDel){
            //说明点了确定,直接删除
        }else{
            //不要删
        }
    

    DOM操作(一)

    DOM树:文档的结构              
    document
        标签=元素=节点
    obj.tagName  获取节点的名字
    (所有的字母都是大写的)
    
    DOM结构
       获取父节点(获取他爹)
           obj.parentNode      最大的祖宗是document,在往上就是null 
    
       获取子节点
           childNodes 获取子节点,包括文本节点
           节点类型:
                文本节点
                标签节点
           检测节点的类型:nodeType
                    obj.nodeType
                         3  文本节点
                         1  标签节点    
        
    children 获取子节点(只包括第一层) 获取的子节点不包括文本节点
             只包括它的第一层子节点,不包括它的孙子级
             获取到的是一组元素 可以用下标、leng
    
    true&&alert(1);
         &&如果两个都是真的,才是真的。如果第一个是假的,后面的不执行。
    var a = false||5;
         ||   从左往右开始看,有真的取真的,如果都为假,取最后一个
    
    获取上一个兄弟节点
    obj.previousElementSibling  兼容:高版本浏览器
    obj.previousSibling 兼容:ie6,7,8 
    兼容写法    obj.previousElementSibling||obj.previousSibling;    
    
    获取下一个兄弟节点
    obj.nextElementSibling  兼容:高版本浏览器
    obj.nextSibling 兼容:ie6,7,8    其他浏览器是文本
    兼容写法   obj.nextElementSibling||obj.nextSibling; 
    
    获取首尾子节点
    首子节点
    父级.firstElementChild 兼容高版本浏览器
    父级.firstChild  兼容ie6,7,8
    兼容写法   父级.firstElementChild||父级.firstChild  
    
    尾子节点
    父级.lastElementChild 兼容高版本浏览器
    父级.lastChild  兼容ie6,7,8
    兼容写法    父级.lastElementChild||父级.lastChild   
    首子节点   obj.children[0]; 
    尾子节点  obj.children[obj.children.length-1];
    
    创建元素
       document.createElement('标签名')  什么标签都能创建  
    你创建出来的标签,跟html中手写的标签一模一样,没有任何区别。
    
    添加元素
        父级.appendChild(新创建的对象);
    在父级的最后面添加了一个元素
        父级.insertBefore(要插入的元素,插入到谁之前);
    把一个元素插入到另一个元素之前
     **必须有一条才能用  必须有插入谁之前的元素
    
    删除元素
     父级.removeChild(要删除的对象)
    
    克隆元素
    obj.cloneNode()
    obj.cloneNode(true) 深度克隆元素,包括内容一起克隆
    *注意:id也会被一起克隆。
    *小贴士:以后每次使用克隆的时候都要把id去掉
    
    上移下移:
    appendChild和insertBefore有剪切功能   
        
    盒子模型:width/height+padding*2+border*2
    物体信息:   
    obj.offsetWidth   盒子模型的宽度
    obj.offsetHeight  盒子模型的高度
    obj.offsetTop     距离定位父级的距离
    offsetHeight                            Height
    盒子模型高度                          纯高度
     number                                 string 
    
    获取html标签
    右下角富媒体:
        1.position:absolute; right:0; bottom:0;
        2.position:fixed; right:0; bottom:0; 不兼容ie6
    自己写:
    onscroll  当页面滚动时触发。
        滚动距离(页面滚了多少它就是多少)
             document.documentElement.scrollTop;
        不兼容chrome
             document.body.scrollTop;
        兼容chrome
    兼容写法:
    document.documentElement.scrollTop||document.body.scrollTop;
    
    改变窗口大小事件  onresize      
    页面滚动事件    onscroll
    
    滚动距离
        document.documentElement.scrollTop||document.body.scrollTop; 获取上下滚动距离
        document.documentElement.scrollLeft||document.body.scrollLeft; 获取左右滚动距离
    获取可视区的宽高
        document.documentElement.clientHeight
    获取可视区高度
        document.documentElement.clientWidth
    onfocus:
    事件,获取焦点的事件
    onblur:
    事件,失去焦点的事件
    

    DOM操作(二)

    结构:parentNode    document      结构父级
    定位:offsetParent  body          定位父级
    **offsetLeft 物体到有定位父级的一个左边距离
    obj.getBoundingClientRect(); 获取绝对位置;
        .left 左边距离页面左边的距离
        .top  上边距离页面上边的距离
        .right  右边距离页面左边的距离
        .bottom  下边距离页面上边的距离
    
    操作属性
    正常和自定义的都行
    获取自定义属性
         obj.getAttribute('属性名'); 
    设置自定义属性
         obj.setAttribute('属性名','属性值');
    删除自定义属性
         obj.removeAttribute(名)
         成对出现   不能和自定义属性混用
    
    物体高度:
    obj.offsetHeight    物体盒子模型高度
    obj.scrollHeight    内容高度
    如果内容小于offsetHeight,取得offsetHeight
    如果内容大于offsetHeight,内容高度
    
    innerHTML的问题:
            innerHTML加等于的话:会清空之前身上事件
    图片对象:
       new Fuction()
       new Oject()
       new Image()  创建一个图片对象
       这个东西跟在html中手写的img标签一模一样。
       img.onload   当图片加载成功触发这个事件。
       img.onerror  当图片加载失败触发这个事件。
    
    文字提示:
       事件
           获取焦点事件
               onfocus
           失去焦点事件
               onblur
    获取焦点函数
    让一个文本框上来就获取焦点
        .focus() 让一个元素获取焦点
        .blur()  让一个元素失去焦点
        
    事件对象(event) 包含了事件的详细信息。
        ev参数        事件对象    兼容chrome FF IE8 9 10 但是得传参
        event       事件对象    兼容Chrome和IE系列
        var oEvent = ev||event;(他们俩个不能换位置)  
        平时注意写上window.onload 
        只能获取到鼠标和键盘的操作。
    
    获取鼠标在可视区中的坐标:
        事件对象.clientX;       获取可视区中X轴坐标
        事件对象.clientY;       获取可视区中Y轴坐标
    **以后只要是操作clientX和clientY就加上滚动距离。
    ondblclick          双击事件。
    onmousemove         鼠标移动事件
            注意:移动事件触发的特别频繁。所以里面别放复杂代码。
    
    事件冒泡:
       子级会去找父级相同的事件执行 
       就算当前元素没什么没有这个事件 也会往上冒 
       冒泡跟结构有关  (没事不要取消)
    取消事件冒泡:
       var oEvent=ev||event; 
       oEvent.cancelBubble=true     取消事件冒泡.  IE chrome照顾IE
       oEvent.stopPropagation();   取消事件冒泡.  W3C规定
    

    Jq的元素操作及DOM操作

    Jq的元素操作

    $  -  jQuery库  jQuery()
    jQuery中所有的东西,都在 $ 身上。
    
    domReady:
    $(function(){
        
    });
    另一种写法:
    $(document).ready(function(){
        
    });
    
    获取元素:
    根据id:      $('#id')
    根据class:  $('.class')
    根据标签名: $('标签名')
    
    加事件:
    $('#id').click(fucntion(){});       
    用 $ 获取到的元素,都是 jquery的对象,不是原生的对象。
    
    设置样式:
    $('div').css('background','red')
    获取样式:
    $('div').css('display');
    
    设置显示、隐藏:
    显示: .show();
    隐藏: .hide();
    
    toggle:绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件
        
    鼠标移入:
    mouseenter  mouseover
    鼠标移出:
    mouseleave  mouseout
    移入移出切换 :
    $('#btn').hover(function(){}, function(){});
    两个函数,分别表示移入和移出(第一个函数->移入,第二个函数->移出)
        
    淡入淡出:
    $('#div1').fadeIn();
    $('#div1').fadeOut();
    
    *jquery里,涉及动画的东西,先停止,再继续
    $('#div1').stop().fadeIn();
    
    *调用jquery的方法时,可以采用 链式  写法。
    $('#div1').stop().fadeIn();
    替换了:
        $('#div1').stop();
                $('#div1').fadeIn();
    下拉:slideDown
    收起:slideUp
    
    自定义动画效果,animate  先加上stop()
    animate(params,[speed],[easing],[fn])
    params:一组包含作为动画属性和终值的样式属性和及其值的集合
    speed:三种预定速度之一的字符串("slow","normal", or "fast")或
            表示动画时长的毫秒数值(如:1000)
    easing:要使用的擦除效果的名称(需要插件支持).默认jQuery提供"linear" 和 "swing"
    fn:在动画完成时执行的函数,每个元素执行一次。
    Params的属性值必须是数字 不是数字没办法运动
    改变颜色:https://bitstorm.org/jquery/color-animation/jquery.animate-colors.js
    
    选择器:获取元素    
    常用三种:
    id:     $('#id')
    标签:  $('标签名')
    class: $('.class名字')
    
    属性:
    $('li[属性名="属性值"]')
    
    伪类:
    :first    第一个
    :last     最后一个
    :even     偶数行
    :odd      奇数行
    :eq(索引值)  按索引取第几个 -- 从0开始
    :lt 小于索引值
    :gt 大于索引值
    :contains(text)  找内容中包含
    li:has(标签名)  标签名是li下的 选中的是li
    $('#box input')  嵌套选择
           **** .eq(索引值)    获取指定索引值的元素 
    
    css的操作:
    获取:   .css('样式名');  
    设置:   .css('样式名','值');
    批量设置:.css({多个样式名和值});
    
    属性操作:
    获取属性:     .attr('属性名');
    设置属性:     .attr('属性名','值');
    批量设置属性: .attr({多个属性名和值});
    
    class的操作:
        增:  addClass('class名');
        删:  removeClass('class名');
    
    内容的操作:
    表单元素的内容:
        原生: .value
        jq:  
            获取:.val()
            设置:.val('设置的值');
    标签的内容:
        原生: innerHTML
        jq:
            获取: .html()
            设置: .html('设置的内容');
    对象:
       原生对象,不能用jq的方法的操作
       jq对象,不能用原生的方法操作
    
    把jq对象转成原生对象:  $('div')[0]
    把原生对象转成jq对象:  $(oDiv)
         jquey里,this,通常情况下(在多数情况下),指的是原生对象(不是jq对象)。
         ***链式操作
    
    获取索引值: .index()
    

    Jq的DOM操作:

    位置:
        原生:
            到定位父级:
                oDiv.offsetLeft
                oDiv.offsetTop
            绝对位置:
                getPos(oDiv).left
                getPos(oDiv).top
        jquery:
            到定位父级:
                $(this).position().left 
                $(this).position().top
            绝对位置:
                $(this).offset().left
                $(this).offset().top
    大小:
        原生:
            盒模型:
                offsetWidth
                offsetHeight
        jquery:
            普通宽:$(this).width()  //普通,不包含border和 padding
            普通高:$(this).height()
    
            $(this).innerWidth() //包含 普通+ padding
            $(this).innerHeight() 
    
            $(this).outerWidth() //包含普通+ padding+ border
            $(this).outerHeight()  
    可视区大小:
    宽:$(window).width()
    高:$(window).height()
    滚动条:
        原生 :  
            document.documentElement.scrollTop || document.body.scrollTop;
        jquery:
            $(document).scrollTop()
            $(document).scrollLeft();
    
    兄弟们:
    $(this).siblings() ;
    DOM操作:
    创建元素: $('<p>fffff</p>')
    
    append:
        A.append(B);     // 在A里面追加B (后面)
    appendTo:
        A.appendTo(B);   //把A放到B里面(后面)
    prepend:
        A.prepend(B);  // 在A里面追加B (前面)
    prependTo:
        A.prependTo(B);  //把A放到B里面(前面)
    after:
        A.after(B);        //把B放到A后面 (外面)
    before:
        A.before(B);       //把B放到A前面 (外面)
    insertAfter:
        A.insertAfter(B);   //把A放到B后面 (外面)
    insertBefore:
        A.insertBefore(B);  //把A放到B前面(外面)
    
    删除元素:
    remove:
        $('选中的元素').remove('id/css/tag/嵌套/...');
    

    jq事件:

    在jquery里,所有的事件,都是绑定的。
    绑定,解绑,委托:
        -------------------------------------
        1.7 开始,下面的方式,都弃用
            bind()      unbind()   直接绑定
            live()      die()      通过冒泡
            delegate    undelegate 更精确的小范围使用事件委托
        --------------------------------------
    
    绑定:  on
       简单绑定: $(obj).on('事件名',function(){});
       传递数据: $(obj).on('事件名','选择器',{数据},function(ev){
                         ev.data // 就是传过来的数据
                });
       多个事件:  $(obj).on('事件名1 事件名2...',function(){});
                           ***多个事件用空格分开
    
    解绑定: off
       $(obj).off();  //全部事件都消失了
       $(obj).off('事件名');  //指定的事件消失
    
    委托: on
       $(obj).on('事件名','选择器',function(ev){
                **函数里面的this是选择器(可以是jq任何选择器)
               //var aaa=ev.target||ev.srcElement
               //**$(aaa)转成jq对象 才能操作
       });
    
    
    one:
        $(obj).one('事件名',function(){});  一次性事件
      模拟:
        $(obj).on('事件名',function(){
                alert(123)
                $(obj).off();
            
        })
    
    右键:
    contextmenu
    
    return false:
       阻止默认行为 并且 阻止冒泡
    
    单独阻止默认行为:ev.preventDefault()
    单独阻止冒泡:ev.stopPropagation()
    
    *jquery里的事件详情 ev ,做了兼容处理,不用 ev||event
    
    循环:两种写法
       $('li').each(function(index,element){
           //index --  i
           //element  --  aLi[i]
           element  原生对象
           $(element) jq 对象
      })
       $.each(要循环的东西,function(i,v){
           //要循环的东西 可以是原生对象
       });
    
    小工具:
       $.browser.msie  是否是ie  false/true
       $.trim(str)      去除首尾空格
       $.type       测试类型
    
    jquery:
        js 库
    
    为什么流行:
        1)本身确实有很多封装好的功能
        2)可扩展性非常强
            ---导致很多jquery插件出现了
    
    自定义插件:
        $.fn.toRed = function(){
            //实现插件的代码
            在插件里,this  就 jquery对象。
        }
    
    批量写插件:
        $.fn.extend({
            toRed:function(){
                this.css('','')
            },
            toBlue:function(){
                this.css('','')
            }
        });
    //可以单独放在js文件里面
    ***注意自定义插件放在window.onload($()) 外面

    相关文章

      网友评论

        本文标题:原生的DOM操作、jq的DOM操作及元素操作

        本文链接:https://www.haomeiwen.com/subject/cktvwttx.html