jQuery基础——DOM篇
在javascript中如何创建节点?
- 创建节点(常见的:元素、属性和文本)
- 添加节点的一些属性
- 加入到文档中
流程中涉及的一点方法:
- 创建元素:
document.createElement
- 设置属性:
setAttribute
- 添加文本:
innerHTML
- 加入文档:
appendChild
例子:
document.addEventListener(‘click‘,function(){
//创建2个div元素
var rightdiv = document.createElement(‘div‘)
var rightaaron = document.createElement("div");
//给2个div设置不同的属性
rightdiv.setAttribute(‘class‘, ‘right‘)
rightaaron.className = ‘aaron‘
rightaaron.innerHTML = "动态创建DIV元素节点";
//2个div合并成包含关系
rightdiv.appendChild(rightaaron)
//绘制到页面body
body.appendChild(rightdiv)
},false)
而通过jQuery却很方便:
$body.on(‘click‘, function() {
//通过jQuery生成div元素节点
var div = $("<div class=‘right‘><div class=‘aaron‘>动态创建DIV元素节点</div></div>")
$body.append(div)
})
DOM节点的插入
内部插入append()与appendTo()
$(".content").append(‘<div class="append">通过append方法添加的元素</div>‘)
$(‘<div class="appendTo">通过appendTo方法添加的元素</div>‘).appendTo($(".content"))
外部插入after()与before()
选择器 | 描述 |
---|---|
.after( content ) |
在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点 |
.before( content ) |
据参数设定,在匹配元素的前面插入内容 |
before与after都是用来对相对选中元素外部增加相邻的兄弟节点
注意点:
- after向元素的后边添加html代码,如果元素后面有元素了,那将后面的元素后移,然后将html代码插入
- before向元素的前边添加html代码,如果元素前面有元素了,那将前面的元素前移,然后将html代码插
内部插入prepend()与prependTo()
选择器 | 描述 |
---|---|
prepend | 向每个匹配的元素内部前置内容 |
prependTo | 把所有匹配的元素前置到另一个指定的元素集合中 |
外部插入insertAfter()与insertBefore()
选择器 | 描述 |
---|---|
insertBefore | 在目标元素前面插入集合中每个匹配的元素 |
insertAfter | 在目标元素后面插入集合中每个匹配的元素 |
before()
选择表达式在函数前面,内容作为参数,而.insertBefore()
刚好相反,内容在方法前面,它将被放在参数里元素的前面
//在test1元素前后插入集合中每个匹配的元素
//不支持多参数
$(‘<p style="color:red">测试insertBefore方法增加</p>‘, ‘<p style="color:red">多参数</p>‘).insertBefore($(".test1"))
DOM节点的删除
empty()的基本用法
empty()
移除指定元素中的所有子节点。
remove()的有参用法和无参用法
remove()会将元素自身移除,同时也会移除元素内部的一切,包括绑定的事件及与该元素相关的jQuery数据。
remove表达式参数:
remove比empty好用的地方就是可以传递一个选择器表达式用来过滤将被移除的匹配元素集合,可以选择性的删除指定的节点
$("button:last").on(‘click‘, function() {
//找到所有p元素中,包含了3的元素
//这个也是一个过滤器的处理
$("p").remove(":contains(‘3‘)")
})
保留数据的删除操作detach()
detach()
这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素。与remove()
不同的是,所有绑定的事件、附加的数据等都会保留下来。
$("div").detach()
这一句会移除对象,仅仅是显示效果没有了。但是内存中还是存在的。当你append
之后,又重新回到了文档流中。就又显示出来了。
var p;
$("#bt1").click(function() {
if (!$("p").length) return; //去重
//通过detach方法删除元素
//只是页面不可见,但是这个节点还是保存在内存中
//数据与事件都不会丢失
p = $("p").detach()
});
$("#bt2").click(function() {
//把p元素在添加到页面中
//事件还是存在
$("body").append(p);
});
DOM节点的复制与替换
DOM拷贝clone()
.clone()
方法深度 复制所有匹配的元素集合,包括所有匹配元素、匹配元素的下级元素、文字节点。
clone方法比较简单就是克隆节点,但是需要注意,如果节点有事件或者数据之类的其他处理,我们需要通过clone(ture)传递一个布尔值ture用来指定,这样不仅仅只是克隆单纯的节点结构,还要把附带的事件与数据给一并克隆了
HTML部分
<div></div>
JavaScript部分
$("div").on(‘click‘, function() {//执行操作})
//clone处理一
$("div").clone() //只克隆了结构,事件丢失
//clone处理二
$("div").clone(true) //结构、事件与数据都克隆
克隆节点和克隆事件
<script type="text/javascript">
//克隆节点
//克隆事件
$(".aaron2").on(‘click‘, function() {
console.log(1)
$(".left").append( $(this).clone(true).css(‘color‘,‘blue‘) )
})
</script>
DOM替换replaceWith()和replaceAll()
.replaceWith( newContent )
:用提供的内容替换集合中所有匹配的元素并且返回被删除元素的集合
$(".bt1").on(‘click‘, function() {
//找到内容为第二段的p元素
//通过replaceWith删除并替换这个节点
$(".right > div:first p:eq(1)").replaceWith(‘<a style="color:red">replaceWith替换第二段的内容</a>‘)
})
.replaceAll( target )
:用集合的匹配元素替换每个目标元素
$(".bt2").on(‘click‘, function() {
$(‘<a style="color:red">replaceAll替换第六段的内容</a>‘).replaceAll(‘.right > div:last p:last‘);
})
.replaceAll()
和.replaceWith()
功能类似,主要是目标和源的位置区别
DOM包裹wrap()方法
.wrap( wrappingElement )
:在集合中匹配的每个元素周围包裹一个HTML结构
$(‘p‘).wrap(‘<div></div>‘)
.wrap( function )
:一个回调函数,返回用于包裹匹配元素的 HTML 内容或 jQuery 对象
使用后的效果与直接传递参数是一样,只不过可以把代码写带函数体内部,写法不同而已
$(‘p‘).wrap(function() {
return ‘<div><div/>‘; //与第一种类似,只是写法不一样
})
DOM包裹unwrap()方法
将匹配元素集合的父级元素删除,保留自身(和兄弟元素,如果存在)在原来的位置。
$(‘p‘).unwarp();
DOM包裹wrapAll()方法
wrap是针对单个dom元素处理,如果要将集合中的元素用其他元素包裹起来,也就是给他们增加一个父元素,针对这样的处理,JQuery提供了一个wrapAll方法
.wrapAll( wrappingElement )
:给集合中匹配的元素增加一个外面包裹HTML结构
简单的看一段代码:
<p>p元素</p>
<p>p元素</p>
给所有p元素增加一个div包裹
$(‘p‘).wrapAll(‘<div></div>‘)
最后的结构,2个P元素都增加了一个父div的结构
<div>
<p>p元素</p>
<p>p元素</p>
</div>
.wrapAll( function )
:一个回调函数,返回用于包裹匹配元素的 HTML 内容或 jQuery 对象
通过回调的方式可以单独处理每一个元素
以上面案例为例,
$(‘p‘).wrapAll(function() {
return ‘<div><div/>‘;
})
以上的写法的结果如下,等同于warp的处理了
<div>
<p>p元素</p>
</div>
<div>
<p>p元素</p>
</div>
DOM包裹wrapInner()方法
如果要将合集中的元素内部所有的子元素用其他元素包裹起来,并当作指定元素的子元素,针对这样的处理,JQuery提供了一个wrapInner方法
.wrapInner( wrappingElement ):给集合中匹配的元素的内部,增加包裹的HTML结构
听起来有点绕,可以用个简单的例子描述下,简单的看一段代码:
<p>p元素</p>
<p>p元素</p>
给所有p元素增加一个div包裹
$(‘p‘).wrapInner(‘<div></div>‘)
最后的结构,匹配的p元素的内部元素被div给包裹了
<p>
<div>p元素</div>
</p>
<p>
<div>p元素</div>
</p>
.wrapInner( function ) :允许我们用一个callback函数做参数,每次遇到匹配元素时,该函数被执行,返回一个DOM元素,jQuery对象,或者HTML片段,用来包住匹配元素的内容
以上面案例为例,
$(‘p‘).wrapInner(function() {
return ‘<div><div/>‘;
})
以上的写法的结果如下,等同于第一种处理了
<div>
<p>p元素</p>
</div>
<div>
<p>p元素</p>
</div>
jQuery遍历
children()方法
如果想快速查找合集里面的第一级子元素,此时可以用children()
方法。这里需要注意:.children(selector)
方法是返回匹配元素集合中每个元素的所有子元素(仅儿子辈,这里可以理解为就是父亲-儿子的关系)
$("#bt1").click(function() {
$(‘.div‘).children().css(‘border‘, ‘1px solid red‘);
})
find()方法
如果想快速查找DOM树中的这些元素的后代元素,此时可以用find()
方法,这也是开发使用频率很高的方法。这里要注意 children与find方法的区别,children是父子关系查找,find是后代关系(包含父子关系)
.find()
方法要注意的知识点:
- find是遍历当前元素集合中每个元素的后代。只要符合,不管是儿子辈,孙子辈都可以。
- 与其他的树遍历方法不同,选择器表达式对于
.find()
是必需的参数。如果我们需要实现对所有后代元素的取回,可以传递通配选择器 ‘*’。 - find只在后代中遍历,不包括自己。
- 选择器 context 是由
.find()
方法实现的;因此,$(‘li.item-ii‘).find(‘li‘)
等价于$(‘li‘, ‘li.item-ii‘)
。<script type="text/javascript"> $("button:last").click(function() { //找到所有p元素,然后筛选出子元素是span标签的节点 //改变其字体颜色 var $spans = $(‘span‘); $("p").find($spans).css(‘color‘, ‘red‘); }) </script>
parent()方法
如果想快速查找合集里面的每一个元素的父元素(这里可以理解为就是父亲-儿子的关系),此时可以用parent()方法
因为是父元素,这个方法只会向上查找一级
<script type="text/javascript">
$("button:last").click(function() {
//找到所有class=item-a的父元素
//然后给每个ul,然后筛选出最后一个,加上蓝色的边
$(‘.item-a‘).parent(‘:last‘).css(‘border‘, ‘1px solid blue‘)
})
</script>
parents()方法
parent只会查找一级,parents则会往上一直查到查找到祖先节点
1 .parents()
和.parent()
方法是相似的,但后者只是进行了一个单级的DOM树查找
2 $( "html" ).parent()
方法返回一个包含document
的集合,而$( "html" ).parents()
返回一个空集合。
closest()方法
closest()
方法接受一个匹配元素的选择器字符串
从元素本身开始,在DOM 树上逐级向上级元素匹配,并返回最先匹配的祖先元素
例如:在div元素中,往上查找所有的li元素,可以这样表达
$("div").closet("li‘)
next()方法
快速查找指定元素集合中每一个元素紧邻的后面同辈元素的元素集合,此时可以用next()
方法
理解节点查找关系:
如下class=”item-1”元素就是红色部分,那蓝色的class=”tem-2”就是它的兄弟元素
<ul class="level-3">
<li class="item-1">1</li>
<li class="item-2">2</li>
<li class="item-3">3</li>
</ul>
prev()方法
快速查找指定元素集合中每一个元素紧邻的前面同辈元素的元素集合,此时可以用prev()
方法
siblings()
快速查找指定元集合中每一个元素紧邻的前面后面同辈元素,此时可以用siblings()
方法
理解节点查找关系:
如下蓝色的class=”tem-2”的li元素,红色的节点就是它的siblings兄弟节点
<ul class="level-3">
<li class="item-1">1</li>
<li class="item-2">2</li>
<li class="item-3">3</li>
</ul>
add()方法
jQuery是一个合集对象,通过$()方法找到指定的元素合集后可以进行一系列的操作。$()
之后就意味着这个合集对象已经是确定的,如果后期需要再往这个合集中添加一新的元素要如何处理?jQuery为此提供add方法,用来创建一个新的jQuery对象 ,元素添加到匹配的元素集合中
.add()
的参数可以几乎接受任何的$()
,包括一个jQuery选择器表达式,DOM元素,或HTML片段引用。
简单的看一个案例:
操作:选择所有的li元素,之后需要把p元素也加入到li的合集中
<ul>
<li>list item 1</li>
<li>list item 3</li>
</ul>
<p>新的p元素</p>
处理一:传递选择器
$(‘li‘).add(‘p‘)
处理二:传递dom元素
$(‘li‘).add(document.getElementsByTagName(‘p‘)[0])
还有一种方式,就是动态创建P标签加入到合集,然后插入到指定的位置,但是这样就改变元素的本身的排列了
$(‘li‘).add(‘<p>新的p元素</p>‘).appendTo(目标位置)
each()
jQuery是一个合集对象,通过$()
方法找到指定的元素合集后可以进行一系列的操作。比如我们操作$("li").css(‘‘)
给所有的li设置style值,因为jQuery是一个合集对象,所以css方法内部就必须封装一个遍历的方法,被称为隐式迭代的过程。要一个一个给合集中每一个li设置颜色,这里方法就是each
.each()
方法就是一个for循环的迭代器,它会迭代jQuery对象合集中的每一个DOM元素。每次回调函数执行时,会传递当前循环次数作为参数(从0开始计数
所以大体上了解3个重点:
each是一个for循环的包装迭代器
each通过回调的方式处理,并且会有2个固定的实参,索引与元素
each回调方法中的this指向当前迭代的dom元素
看一个简单的案例
<ul>
<li>慕课网</li>
<li>Aaron</li>
</ul>
开始迭代li,循环2次
$("li").each(function(index, element) {
index 索引 0,1
element是对应的li节点 li,li
this 指向的是li
})
这样可以在循环体会做一些逻辑操作了,如果需要提前退出,可以以通过返回 false
以便在回调函数内中止循