zoukankan      html  css  js  c++  java
  • Jquery的dom操作与原生dom的转换

    本片文章包含了

    • jquery常见dom操作、
    • q与原生dom对象的区别与转换
    • 伪数组对象的知识

    如有错误,烦请指正。

    以下方法共性:可以一次添加多个内容,内容可以是DOM对象、HTML string、 jQuery对象

    创建元素

    var obj = $('<div class="test"><p><span>Done</span></p></div>');
    

    两种方法可以创建元素

    1. 直接写入html
    2. 传入一个原生dom

    添加元素

    append()

    可以传入dom对象,html string,jq对象等等;传到尾部;

    appendTo()

    与前者相比,主次不同;这里是将孩子添加到某个父元素中;

    prepend()

    append()相似,但是是传入到头部;

    prependTo

    主次关系同appendTo();

    before()after()

    在对象前面/后面,与对象并列同级的位置插入内容,参数类型和append()相同;

    insertBefore()insertAfter()

    before()主次不同,把xx插入到xx前面;

    .remove()

    可以传入一个选择器进行过滤,删除被选元素和所有自元素;

    .empty()

    删除调用该方法的元素下所有子元素,调用元素本身不删除;

    包裹

    .wrap()

    为调用这个api的对象包裹一层html结构;可以传入selector,element,jq对象,html string等等;

    wrapAll()wrapInner()

    这两个api是wrap()的延伸,前者将整个选取的对象包裹起来;后者在选取的对象内部套一层;

    unwrap()

    这个方法将移出元素的父元素。这能快速取消 .wrap()方法的效果。将匹配的元素(以及他们的同辈元素)DOM结构的上一层父元素剥离出去;

    HTML相关

    html()

    可读写的api,即没有参数时,可读取元素的innerHTML,当传递了string参数,则修改元素的innerHTML

    $("p").html("Hello <b>world</b>!");
    

    这种可读写的api是jquery的重要设计思想,后续会有很多类似的方法;

    text()

    可读写,操作dom的innerText

    val()

    返回或设置元素值,处理input的value属性值等;

    jq与原生dom对象的区别与转换

    dom对象是我们用原生js获得的对象,jQuery对象就是用jQuery的类库选择器获得的对象。jQuery对象是它本身独有的,和原生对象不可混用,同样,dom对象也不可以混用jq对象的方法!

    比如,以下两行代码的作用是相同的

    $("#color").html();
    document.getElementById("color").innerHTML;
    
    $("#id").innerHTML; // 错误写法
    

    jq对象 > dom

    jquery提供了两个方法可以实现jq对象转换为dom对象,即[index]get(index),因为jquery对象实际上是伪数组对象!

    var $cr = $("#cr"); //jquery对象
    var cr = $cr[0]; //dom对象,也可写成 var cr= $cr.get(0);
    alert(cr.checked); //检测这个checkbox是否给选中
    

    dom对象 > jq对象

    对于一个dom对象,只需要用$()把dom对象包装起来,就可以获得一个jquery对象了,方法为$(dom对象);
    复制代码 代码如下:

    var cr = document.getElementById("cr"); //dom对象
    var $cr = $(cr); //转换成jquery对象
    

    伪数组对象

    我们再进一步探讨下jquery对象与dom对象的转换的细节。

    在jQuery的中有一个包装集概念,包装集就是用伪数组实现的。先看下正常的数组的定义及遍历:

    var arr = ['iceman' , 'mengzhe' , 'shoushou' , 'zhuzhu'];
    for (var i = 0; i < arr.length; i++) {
        console.log(arr[i]);
    }
    

    执行结果依次输出四个属性,这是最为正常的数组遍历:用字面量的形式定义了一个数组,并且添加几个简单的字符串,以及遍历输出每一项,这个在JavaScript中是再正常不过了。那么,什么是伪数组呢?.... 就是用对象来模拟的!

    var objArr = {
        0 : 'iceman',
        1 : 'mengzhe',
        2 : 'shoushou',
        3 : 'zhuzhu',
        length : 4
    }
    for (var i = 0; i < objArr.length; i++) {
        console.log($objArr[i]);
    }
    

    执行结果还是依次输出了四个属性。

    以上代码中以对象字面量的形式定义了一个对象objArr,这个对象就用来模拟数组,即伪数组对象,在$arr中要伪装的数组项以数字0、1、2...为键,值便是原数组的值。

    js中获取一个对象的属性值可以使用obj.prop或者obj['prop'],当对象字面量中键是以数字开头的时候,用obj['prop']获取值的时候可以不加引号,即obj[prop],在上面的实例中就是objArr[1]、objArr[2]、objArr[3]....

    看到这里有没有一种很似曾相识的感觉呢? 前面说到,jQuery对象转原生DOM对象的其中一种方式是:jQuery对象[0],和以上的对象字面量中键是数字的形式是不很像呢? 另外多说一句,jQuery对象.get(0)的内部使用的就是jQuery对象[0]来实现的。

    伪数组验证

    jQuery使用选择器获取的对象会被包装为一个包装集,该包装集的内部实现就是使用伪数组对象:
    屏幕快照 2018-05-18 下午6.16.44.png
    通过打断点的方式,用选择器获取的所有的确都封装了一个伪数组对象。所以使用$divs[0]获取的就是$divs对象中的键为0的div元素,即第一个div元素。
    屏幕快照 2018-05-18 下午6.20.58.png
    $divs[0]get()获取的是第一个,并且获取的是原生的DOM对象,那么如果用选择器只获取到了一个元素,那么用$divs[0]获取的就是该元素的原生DOM对象,这就是jQuery对象转为原生DOM对象。

    有了上文的理解,原生DOM对象转jQuery对象理解起来就简单多了,$(原生DOM对象)的方式可以将原生DOM对象转为jQuery对象,其实$是一个方法,原生的DOM对象传入$方法中,该方法内部对原生DOM对象做进一步的加工, 使其成为一个包装集,即伪数组对象。

  • 相关阅读:
    SpringCloud 第一篇:服务的注册和发现(Eureka)
    微服务架构
    SpringMvc的工作原理
    《即时消息技术剖析与实战》学习笔记7——IM系统的消息未读
    《MySQL实战45讲》学习笔记3——InnoDB为什么采用B+树结构实现索引
    《即时消息技术剖析与实战》学习笔记6——IM系统如何保证消息的安全性
    《即时消息技术剖析与实战》学习笔记5——IM系统如何保证消息的一致性
    《即时消息技术剖析与实战》学习笔记4——IM系统如何保证消息的可靠性
    《即时消息技术剖析与实战》学习笔记3——IM系统如何保证消息的实时性
    《即时消息技术剖析与实战》学习笔记2——支持用户点对点聊天的消息收发架构
  • 原文地址:https://www.cnblogs.com/CharmanderS5/p/9057443.html
Copyright © 2011-2022 走看看