Jquery的dom操做与原生dom的转换

本片文章包含了javascript

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

若有错误,烦请指正。html

如下方法共性:能够一次添加多个内容,内容能够是DOM对象、HTML string、 jQuery对象java

建立元素

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

两种方法能够建立元素jquery

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

添加元素

append()api

能够传入dom对象,html string,jq对象等等;传到尾部;数组

appendTo()app

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

prepend()spa

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、一、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对象作进一步的加工, 使其成为一个包装集,即伪数组对象。

相关文章
相关标签/搜索