[关闭]
@tsingwong 2016-03-06T02:15:54.000000Z 字数 7346 阅读 765

锋利的jQuery Day3

JavaScript jQuery


jQuery中的DOM操作

1 DOM操作分类

DOM操作分为3个方面,即DOM Core(核心)、HTML-DOM和CSS-DOM。

1.1 DOM Core

DOM Core不专属于JavaScript,任何支持DOM的程序设计语言都可以使用。用途并非仅限于处理网页,也可用来处理任意使用标记语言编写的文档,如XML。

getElementById()、getElementsByTagName()、getAttribute()和setAttribute()方法等都属于DOM Core组成部分。

  1. document.getElementsByTagName("form");//DOM Core 获取表单对象
  2. element.getAttribue("src");//获取某元素的src属性

1.2 HTML-DOM

HTML-DOM提供了一些简明的记号来描述各种HTML元素的属性。

  1. document.forms;//获取表单对象
  2. element.src;//获取某元素的src属性

获取某些对象、属性,即可以使用DOM Core来实现,也可以使用HTML-DOM实现,相交后者比较简短,但它只能用来处理Web文档。

1.3 CSS-DOM

CSS-DOM是针对CSS的操作,主要作用是获取和设置style对象的各种属性,使网页呈现各种不同效果。

  1. element.style.color = "red";//设置某元素style对象字体颜色

2 jQuery中的DOM操作

2.1 查找节点

  1. $(document).ready(function() {
  2. var $li = $("ul li:eq(1)"); //获取<ul>里第2个<li>节点
  3. var li_txt = $li.text(); //获取第2个<li>元素节点的文本内容
  4. alert(li_txt);
  5. })
  1. var $pare = $("p"); //获取<p>节点
  2. var p_txt = $pare.text(); //获取<p>节点的文本内容
  3. var ptitle_txt = $pare.attr("title"); //获取<p>元素节点的属性title
  4. alert(p_txt);
  5. alert(ptitle_txt);

2.2 创建节点

  1. var $li_1 = $("<li></li>");
  2. var $li_2 = $("<li></li>");
  3. $("ul").append($li_1); //添加到<ul>节点中
  4. $("ul").append($li_2); //可以采用链式写法:$("ul").append($li_1).append("li_2")

jQuery的工厂函数$()可以完成创建元素的任务,根据传入的HTML标记字符串,创建一个DOM对象, 并将这个DOM对象包装成一个jQuery对象后返回:

  1. $(html);
  1. var $li_1 = $("<li>香蕉</li>");
  2. var $li_2 = $("<li>香梨</li>");
  3. $("ul").append($li_1);
  4. $("ul").append($li_2);

具体情况类似上面的创建元素节点。
注:无论$(html)的HTML代码多么复杂,都是使用同样方式来创建的。

  1. var $li_1 = $("<li title='香蕉'>香蕉</li>");
  2. var $li_2 = $("<li title='香梨'>香梨</li>");
  3. $("ul").append($li_1);
  4. $("ul").append($li_2);

2.3 插入节点

将新创建的节点插入文档最简单的办法就是,让它成为这个文档的某个节点的子节点。

方法 描述 示例
append() 向每个匹配的元素内部后置内容 <p>我想说:</p>
...
$("p").append("<b>你好</b>");
结果:
<p>我想说:<b>你好</b></p>
appendTo() 将所有匹配的元素后置到指定的元素中,实际上,使用该方法是颠倒了常规的$(A).append(B)操作,即不是将B追加到A中,而是将A追加到B中 <p>我想说:</p>
...
$("p").appendTo("<b>你好</b>");
结果:
<b>你好<p>我想说:</p></b>
prepend() 向每个匹配的元素内部前置内容 <p>我想说:</p>
...
$("p").prepend("<b>你好</b>");
结果:
<p><b>你好</b>我想说:</p>
prependTo() 将所有匹配的元素前置到指定的元素中。与appendTo()类似,$(A).prepend(B)是将A前置到B中 <p>我想说:</p>
...
$("p").prependTo("<b>你好</b>");
结果:
"<b><p>我想说:</p>你好</b>"
after() 在每个匹配元素之后插入内容 <p>我想说:</p>
...
$("p").after("<b>你好</b>");
结果:
<p>我想说:</p><b>你好</b>
insertAfter() 将所有匹配道的元素插入到指定元素的后面。与上面的类似,$(A).insertAfter(B)的操作,是将A插入到B后面 <p>我想说:</p>
...
$("p").insertAfter("<b>你好</b>");
结果:
<b>你好</b><p>我想说:</p>
before() 在每个匹配元素之前插入内容 <p>我想说:</p>
...
$("p").after("<b>你好</b>");
结果:
<p>我想说:</p><b>你好</b>
insertBefore() 将所以匹配的元素插入到指定的元素的前面。与上面类似,$(A).insertBefore(B),是将A插入到B前面 <p>我想说:</p>
...
$("p").insertBefore("<b>你好</b>");
结果:
<p>我想说:</p><b>你好</b>

2.4 删除节点

删除文档中的某个多余节点,jQuery提供了三种删除节点的方法,remove(),detach()和empty()。

  1. $('ul li:eq(1)').remove();//获取第二个<li>元素节点后删除它

当某个节点用remove()方法删除后,该节点所包含的所有后代节点将同时被删除。该方法的返回值是一个指向已被删除的节点的引用。所以元素用remove()方法删除后,还可以继续使用

  1. var $li =$('ul li:eq(1)').remove();
  2. $li.appendTo("ul");

上述代码可以直接简化为:

  1. $('ul li:eq(1)').appendTo('ul');//appendTo()方法也可以用来移动元素
  2. //移动元素时,先从文档中删除此元素,然后在插入指定位置。

remove()方法同样可以传递参数来选择性地删除元素

  1. $("ul li").remove("li[title=菠萝]");

与remove()方法一样,也是从DOM中去掉所有匹配的元素。需要注意的是,这个方法不会把匹配的元素从jQuery对象中删除。与remove()不同的是,detach()方法所有绑定的事件、附加的数据都会保留下来。

  1. $("ul li").click(function(){
  2. alert($(this).html());
  3. })
  4. var $li = $("ul li:eq(1)").detach();//删除元素
  5. $li.appendTo("ul");//重新追加元素,之前绑定的点击事件还在,如果使用remove()方法之前绑定的事件将会消失

empty()方法的作用是清空节点,能清空元素中的所有后代节点。

  1. $("ul li:eq(1)").empty();//获取第二个<li> ,清空此元素里的内容

2.5 复制节点

  1. $("ul li").click(function() {
  2. $(this).clone().appendTo("ul");//复制当前点击的节点,然后追加到<ul>中

但复制出来的新元素不具备让任何行为,如果需要新元素具备行为:

  1. $(this).clone(true).appendTo("body");//clone的参数为true

clone()方法中传递参数true,含义是复制元素的同时复制元素所绑定的时间。

2.6 替换节点

replaceWith()方法作用是将所有匹配的元素都替换成指定的HTML或DOM元素。

  1. $("p").replaceWith("<strong>你最不喜欢的水果是?</strong>");

repalceAll()方法与repalceWith()方法,跟之前讲过的append与appendTo关系类似,都是颠倒原方法的操作。

  1. $("<strong>你最不喜欢的水果是?</strong>").replaceAll("p");

注:如果在替换之前,已为元素绑定事件,替换后原来绑定的事件也会被取消,需要为新元素重新绑定事件。

2.7 包裹节点

  1. $("strong").wrap("<b></b>");//用<b>标签把<strong>元素包裹起来
  1. $("strong").wrap("<b></b>");

使用wrap()方法得到结果如下:

  1. <b><strong title="选择你喜欢的水果。">你喜欢的水果是?</strong></b>
  2. <b><strong title="选择你喜欢的水果。">你喜欢的水果是?</strong></b>
  1. $("strong").wrapAll("<b></b>");

使用wrapAll()方法得到结果如下:

  1. <b><strong title="选择你喜欢的水果。">你喜欢的水果是?</strong>
  2. <strong title="选择你喜欢的水果。">你喜欢的水果是?</strong></b>

注:如果被包裹的多个元素之间有其他元素,其他元素会被放到包裹元素之后。

2.8 属性操作

attr()方法可以用来获取和设置元素属性。获取元素属性,只需要传入一个参数,即属性名称。设置元素属性,需要传入两个参数,即属性名称和对象的值。也可以一次性为同一个元素设置多个属性:

  1. $("p").attr("title","your title");
  2. $("p").attr({"title":"your title","name":"test"});

该方法用来删除文档中某个元素的特定属性。

  1. $("p").removeAttr("title");//删除<p>元素的属性title

2.9 样式操作

获取和设置class也是使用attr()方法来完成的。使用attr()方法来设置class时,是覆盖原属性。
如果想要追加属性的话,使用addClass()方法。
删除class的某个值可以使用removeClass()方法来完成,其作用是从匹配的元素中删除全部或者指定class,带参数的话就是删除该class,不带参数即将class值全部删除。
toggle()方法作用是,交替执行两个代码块的函数,如果元素原来是显示的,则隐藏它;如果元素是隐藏的,则显示它。

  1. $element.toggle(function(){
  2. //显示元素
  3. }.function(){
  4. //隐藏元素
  5. })

toggleClass()方法可控制样式上的重复切换。如果类名存在则删除它,雷鸣不存在则添加它。

hasClass()方法用来判断元素中是否含有某个class,如果有返回true,否则返回flase。在jQuery内部实际上是调用了is()方法来完成这个功能。

  1. $("p").hasClass("another");
  2. $("p").is(".another");

2.10 设置和获取HTML、文本和值

该方法类似JavaScript中的innerHTML属性,可以用来读取或设置某个元素中的HTML内容。

  1. var p_html = $("p").html();//输出的不止里面的文字还有标签

同理设置某元素的HTML代码,需要传递一个参数,参数为要设置的内容。

该方法类似JavaScript中的innerText属性,可以用来读取或设置某个元素中的文本内容。

  1. var p_txt = $("p").text();//获取的是<p>元素里的文本内容

同理,设置某元素的文本内容,传递需要设置的文本内容。

此方法类似JavaScript中的value属性,可以用来读取或设置元素的值。无论元素是文本框,下拉列表还是单选框,都可以返回元素的值。如果元素为多选,则返回一个包含所有选择值的数组。
传递数组时要使用["X","Y"]这种形式

focus()方法相当于JavaScript中的onfocus()方法,作用是处理获得焦点时的事件。
blur()方法相当于JavaScript中的onblur()方法,作用是处理失去焦点时的事件。
defaultValue属性是默认值

2.11 遍历节点

该方法用来获取匹配元素的子元素集合。
注:childern()方法只考虑子元素而不考虑其他后代元素。

该方法用来取得匹配元素后面紧跟的同辈元素。

该方法用于取得匹配元素前面紧邻的同辈元素。

该方法用于去的匹配元素前后所有的同辈元素。

该方法用于取得最近的匹配元素。首先检查当前元素是否匹配,如果匹配直接返回元素本身,不匹配向上查到父元素,逐级向上知道找到匹配的元素,如果什么都没找到返回一个空的jQuery对象。

获取集合中每个匹配元素的父辈元素

获取集合中每个匹配元素的祖先元素(祖先元素包括父元素)

2.12 CSS-DOM操作

CSS-DOM技术就是读取和设置style对象的各种属性。

可以利用css()方法获取元素的样式属性

  1. $("p").css("color");

无论color属性是外部CSS导入,还是直接拼接在HTML元素里(内联),css()方法都能获取到属性style里的其他属性值。
同理,也可以用css()方法设置某个元素单个或多个样式。

  1. $("p").css("color","red");//注意单个样式时用逗号链接
  2. $("p").css({"color":"red","font-size":"30px"});

透明度设置直接使用opacity属性,例如设置为半透明:

  1. $("p").css("opacity","0.5");//不能使用百分数

获取元素的height属性:

  1. $("p").css("height");

还可以使用height()方法来获取和设置高度,其作用是获取匹配元素的当前计算的高度值(px):

  1. alert($("p").css("height")); //18px
  2. alert($("p").height()); //18
  3. $("p").height(100);
  4. alert($("p").css("height")); //100px
  5. alert($("p").height()); //100

注1:height()方法如果传递的值是一个数字,默认单位为px,如果要使用其他单位,则需要以字符串的形式传递。
注2:这两种方法区别在于css()获取的高度值与样式设置有关且带单位,height()方法获取的高度值是元素在页面中的实际高度,与样式无关,且不带单位。

width()方法同理。

CSS-DOM中元素定位的方法:

作用是获取元素在当前视窗的相对偏移,其中返回的对象包含两个属性,即top和left,只对可见元素有效。

  1. var offset = $("ul :eq(0)").offset();
  2. var left = offset.left;//8,结果并不带单位
  3. var top = offset.top;
  4. alert("距离顶部 "+top+"px,距离左侧"+left+"px。");

作用是获取元素相对于最近的一个position样式属性设置为relative或absolute的祖父节点的相对偏移,返回对象同上,有两个属性,即top和left:

  1. var position = $("p").position();
  2. var left = position.left;
  3. var top = position.top;

作用分别是获取元素的滚动条距离顶端的距离和据左侧的距离:

  1. var $p = $("p");
  2. var scrollTop = $p.scrollTop();
  3. var scrollLeft = $p.scrollLeft();

控制元素的滚动条滚动到指定位置,可传递一个参数。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注