JQuery学习二: DOM操作

一.节点的操作

1.查找节点:

var $var_1=$("htmltype"); //这句话就是获取所有htmltype节点

如:var $ul_1=$("ul");

2.创建并追加节点:
创建节点:常见的就是直接把这个节点的结构给通过HTML标记字符串描述出来,通过$()函数处理,
var $var_1=$("<htmltype>");//这句话是创建一个节点

$("htmltype2").append($var_1) ; //这句话是把节点插入所有htmltype2节点中
创建流程比较简单,大体如下:

创建节点(常见的:元素、属性和文本)
添加节点的一些属性
加入到文档中
流程中涉及的一点方法:

创建元素:document.createElement
设置属性:setAttribute
添加文本:innerHTML
加入文档:appendChild

var $li_1=$("<li  title="title1">香蕉</li>");

         $("ul").append($li_1);

其中插入方法有以下几种:
(1)append() 把B追加到A内部
$(".content").append('<div class="append">B追加到A内部</div>')
(2)appendTo() 把A追加到B内部
$('<div class="appendTo">A追加到B内部 </div>').appendTo($(".content"))
简单来说,append()前面是要选择的对象,后面是要在对象内插入的元素内容,appendTo()前面是要插入的元素内容,而后面是要选择的对象

(3)prepend() 把B追加到A内部的内容前 ,将指定元素插入到匹配元素里面作为它的第一个子元素 (如果要作为最后一个子元素插入用.append()).
$('.aaron1') .prepend('<p>prepend增加的p元素</p>')
(4)prependTo() 把A追加到B的内容前
$('<p>prependTo增加的p元素</p>').prependTo($('.aaron2'))

这里总结下内部操作四个方法的区别:
append()向每个匹配的元素内部追加内容
prepend()向每个匹配的元素内部前置内容
appendTo()把所有匹配的元素追加到另一个指定元素的集合中
prependTo()把所有匹配的元素前置到另一个指定的元素集合中

(5)after() 在A后追加B
$(".test2").after('<p style="color:blue">在A后追加B', '<p style="color:blue">多参数</p>')
(6)insertAfter() 在B后追加A
$('<p style="color:red">在test2后追加p</p>', '<p style="color:red">多参数</p>').insertAfter($(".test2"))
})

(7)before() 在A前追加B
$(".test1").before('<p style="color:red">在test1前追加p','<p style="color:red">多参数</p>')
(8)insertBefore()在B前追加A
$('<p style="color:red">在test1前追加p</p>', '<p style="color:red">多参数</p>').insertBefore($(".test1"))
})

$("ul").append("<li>你好</li>");//在ul内部追加li

         $("<li>你好</li>").appendTo("ul");//在ul内部追加li

3.删除节点

remove() 删除该元素,remove会将元素自身移除,同时也会移除元素内部的一切,包括绑定的事件及与该元素相关的jQuery数据。
empty() 清空节点,它只移除了指定元素中的所有子节点

$("ul  li:eq[1]").remove(); //获取ul中的第二个li并删除
$("ul  li").remove(“li[title="菠萝"]”);//删除ul中li元素属性title="菠萝"的元素

如果不通过remove方法删除这个节点其实也很简单,但是同时需要把事件给销毁掉,这里是为了防止”内存泄漏”,所以前端开发者一定要注意,绑了多少事件,不用的时候一定要记得销毁

remove比empty好用的地方就是可以传递一个选择器表达式用来过滤将被移除的匹配元素集合,可以选择性的删除指定的节点

我们可以通过$()选择一组相同的元素,然后通过remove()传递筛选的规则,从而这样处理$("p").remove(":contains('3')")

4.复制节点

clone()深度复制所有匹配的元素集合,包括所有匹配元素、匹配元素的下级元素、文字节点。
如果节点有事件或者数据之类的其他处理,我们需要通过clone(ture)传递一个布尔值ture用来指定,这样不仅仅只是克隆单纯的节点结构,还要把附带的事件与数据给一并克隆了

$("ul  li:eq[1]").clone().appenTo("ul");//复制并追加到ul中,只复制是不会显示出来的

使用上就是这样简单,使用克隆的我们需要额外知道的细节:

clone()方法时,在将它插入到文档之前,我们可以修改克隆后的元素或者元素内容,如代码 $(this).clone().css('color','red')增加了一个颜色;
通过传递true,将所有绑定在原始元素上的事件处理函数复制到克隆元素上;
clone()方法是jQuery扩展的,只能处理通过jQuery绑定的事件与数据
元素数据(data)内对象和数组不会被复制,将继续被克隆元素和原始元素共享。要复制所有数据,需要手动复制每一个

5.替换节点

replaceWith()将B替换所有A
$("p:eq(1)").replaceWith('<a style="color:red">替换第二段的内容</a>')
.replaceAll( target ) :用A替换所有的B
$('<a style="color:red">替换第二段的内容</a>').replaceAll('p:eq(1)')
功能类似,但是目标和源相反

.replaceWith()与.replaceAll() 方法会删除与节点相关联的所有数据和事件处理程序
.replaceWith()方法,和大部分其他jQuery方法一样,返回jQuery对象,所以可以和其他方法链接使用
返回的jQuery对象引用的是被删除的节点,而不是通过replaceWith/replaceAll方法替换的节点

6.包裹节点
(1)wrap( wrappingElement ):在集合中匹配的每个元素周围包裹一个HTML结构
$('a').wrap(function() {return '<div class="' + $(this).text() + '" />'; })
(2)warpAll();//用B包裹A ,wrap是针对单个dom元素处理,如果要将集合中的元素用其他元素包裹起来,也就是给他们增加一个父元素
$('a').wrapAll(function() {return '<div></div>' })
$('p').wrapAll('<div></div>');
(3)warpInner();//用B包裹A的内容,增加包裹的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>

(4)unwrap()将匹配元素集合的父级元素删除,保留自身(和兄弟元素,如果存在)在原来的位置。
看一段简单案例:

<div>
    <p>p元素</p>
</div>

我要删除这段代码中的div,一般常规的方法会直接通过remove或者empty方法$(‘div’).remove();
但是如果我还要保留内部元素p,这样就意味着需要多做很多处理,步骤相对要麻烦很多,为了更便捷,jQuery提供了unwarp方法很方便的处理了这个问题$('p').unwarp();找到p元素,然后调用unwarp方法,这样只会删除父辈div元素了。这个方法比较简单,也不接受任何参数

 $('p').unwrap('<div></div>');
 $('a').unwrap(function() {
            return '<div></div>';
        })

二 .JQuery遍历操作
1 .children() 获取html元素的所有子节点,如果想快速查找合集里面的第一级子元素,此时可以用children()方法。无参数。
$('.div').children().css('border', '3px solid red')
注意:jQuery是一个合集对象,所以通过children是匹配合集中每一给元素的第一级子元素
无参数。但是.children()方法选择性地接受同一类型选择器表达式$(“div”).children(“.selected”)如:$('.div').children(':last').css('border', '3px solid blue')

2 . find()方法:快速查找DOM树中的这些元素的后代元素,这也是开发使用频率很高的方法。这里要注意 children与find方法的区别,children是父子关系查找,find是后代关系(包含父子关系,孙子辈都可以)
与其他的树遍历方法不同,选择器表达式对于 .find() 是必需的参数。如果我们需要实现对所有后代元素的取回,可以传递通配选择器 ‘*’。
find只在后代中遍历,不包括自己。

$(".left").find("li:last").css("border","1px solid blue");
$("p").find($spans).css('color', 'red');})

3.parent()方法:如果想快速查找合集里面的每一个元素的父元素(这里可以理解为就是父亲-儿子的关系)
$('.level-3').parent('li').css('border', '1px solid red');
注:只会向上查找一级;
jQuery是一个合集对象,所以通过parent是匹配合集中每一给元素的父元素;
parent()无参数,parent()方法选择性地接受同一型选择器表达式,同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式:

$('.item-a').parent(':last').css('border', '1px solid blue');

4.parents()方法快速查找合集里面的每一个元素的所有祖辈元素,返回的元素秩序是从离他们最近的父级元素开始的
$(".item-b").parents().css("border",'1px solid red');
注意:$( "html" ).parent()方法返回一个包含document的集合,而$( "html" ).parents()返回一个空集合。
parents()无参数,parents()方法选择性地接受同一型选择器表达式$('.item-b').parents('.first-div').css('border', '2px solid blue')

5 .closest()方法:从元素本身开始,在DOM 树上逐级向上级元素匹配,并返回最先匹配的祖先元素,使用频率很高的方法
注意:jQuery是一个合集对象,所以通过closest是匹配合集中每一个元素的祖先元素

$('.item-1').closest($('.level-2 li')).css("border","1px solid #f00");

.parents()和.closest()是有点相似的,都是往上遍历祖辈元素,但是两者还是有区别的,否则就没有存在的意义了:

起始位置不同:.closest开始于当前元素 .parents开始于父元素
遍历的目标不同:.closest要找到指定的目标,.parents遍历到文档根元素,closest向上查找,知道找到一个匹配就停止查找,parents一直查找到根元素,并将匹配的元素加入集合
结果不同:.closest返回的是包含零个或一个元素的jquery对象,parents返回的是包含零个或一个或多个元素的jquery对象

6.next()方法:指定元素集合中每一个元素紧邻的后面同辈元素的元素集合

 $('.item-2').next(':first').css('border', '1px solid blue')//每一个元素紧邻的后面同辈元素的元素集合中筛选出第一个

7.prev()方法:紧邻的前面同辈元素的元素集合
8.siblings():紧邻的前面后面同辈元素
9.add()方法:用来创建一个新的jQuery对象 ,元素添加到匹配的元素集合中$('li').add('<p>新的p元素</p>').appendTo($('.right')) })
.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(目标位置)

10.each()方法就是一个for循环的迭代器,它会迭代jQuery对象合集中的每一个DOM元素。每次回调函数执行时,会传递当前循环次数作为参数(从0开始计数)

$("li").each(function(index) {
            if (index % 2) {
                $(this).css('color','blue')
            }
        })

each通过回调的方式处理,并且会有2个固定的实参,索引与元素
each回调方法中的this指向当前迭代的dom元素
可以在循环体会做一些逻辑操作,如果需要提前退出,可以以通过返回 false以便在回调函数内中止循环

三.属性操作

1.attr()获取和设置属性,通过参数个数来实现不同功能

var $var_1=$("p");`//这句话是获取节点P
var $p_1=$var_1.attr("title");`//获取节点P的title属性
var $p_2=$var_1.attr("title","你好");`//设置节点P的title属性为"你好"

2.removeAttr()删除属性

$("p").removeAttr("title");//删除节点PTitle属性

四.样式操作

1.attr(“class”)获取和设置样式

var $var_class=$("p").attr("class");//获取节点Pclass属性

$("p").attr("class","class1");设置节点Pclass属性为样式表类class1

2.addClass() 追加样式到A

$("p").addClass("another");添加样式表类another类到P

3.移除样式
removeClass() 移除类

4.切换样式
toggleClass() 切换clss属性类为新的类

5.判断某个样式是否存在
hasClass()

其他常用方法:

1.html() 该方法获取html元素的内容,如:var var1=$("p").html();//获取P元素内的内容 
2.text() 获取或设置某个html元素的内容 
3.val() 获取元素的Value值 
4.$("p").css("color","red");//设置P的css属性{color:red;} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章