锋利的 jQuery | 第3章_jQuery 中的 DOM 操作

DOM(Document Object Model)意思是文档对象模型。根据W3C DOM规范,DOM是一种与浏览器、平台、语言无关的接口,使用该接口可以轻松地访问页面中所有的标准组件。

DOM 操作的分类

  1. DOM Core:并不专属于JavaScript,任何支持 DOM 的程序设计语言都可以使用它
  2. HTML-DOM:简明的记号来描述各种HTML元素的属性
  3. CSS-DOM:主要是获取和设置style对象的各种属性

jQuery 中的 DOM 操作

查找节点

查找元素节点

// 获取 ui 里的第二个 li
var $li=$("ul li:eq(1)")

查找属性节点

// 获取 p 标签的节点属性 title
var p_text=$('p').attr('title')

创建节点

创建元素节点

// 使用jQuery的工厂函数$()
$( html )
$("<p/>")
$( "<p></p>" )
// 错误示例
$("<p>")
$("<P/>")

注意

  1. 动态创建的新元素节点不会被自动添加到文档中,而是需要使用其他方法将其插入文档中
  2. 当创建单个元素时,要注意闭合标签和使用标准的XHTML格式

创建文本节点

// 创建元素节点时直接把文本内容写出来
$( "<p>新创建的文本</p>" )
// 复杂的组合
$("<li><em>这是</em><b>一个</b><a href='#'>复杂的组合</a></li>");

创建元素节点

// 创建属性节点与创建文本节点类似
$( "<p class='foo'>新创建的文本</p>" )

插入节点

方法 描述 示例
append() 向每个匹配的元素内部添加内容 html:<p>hello</p> jQuery:$("p").append('<b>jQuery</p>')
结果:<p>hello<b>jQuery</b></p>
appendTo() 将匹配的元素追加到指定的元素中 html:<p>hello</p>
jQuery:$("<b>jQuery</p>").appendTo('p')
结果:<p>hello<b>jQuery</b></p>
prepend() 向每一个匹配元素内部前置内容 html:<p>hello</p>
jQuery:$("p").prepend('<b>jQuery</p>')
结果:<p><b>jQuery</b>hello</p>
prependTo() 将所有匹配元素前置到指定的元素中 html:<p>hello</p>
jQuery:$("<b>jQuery</p>").prependTo('p')
结果:<p><b>jQuery</b>hello</p>
after() 在每一个匹配元素之后插入内容 html:<p>hello</p>
jQuery:$("p").after('<b>jQuery</p>')
结果:<p>hello</p><b>jQuery</b>
insertAfter() 将所有匹配元素插入到指定的元素后面 html:<p>hello</p>
jQuery:$("<b>jQuery</p>").inserAfter('p')
结果:<p>hello</p><b>jQuery</b>
before() 在每个匹配的元素之前插入内容 html:<p>hello</p>
jQuery:$("p").before('<b>jQuery</p>')
结果:<b>jQuery</b><p>hello</p>
insertBefore() 将所有匹配的元素插入到指定的元素的前面 html:<p>hello</p>
jQuery:$("<b>jQuery</p>").insertBefore('p')
结果:<b>jQuery</b><p>hello</p>

插入节点的方法不仅能将新创建的DOM元素插入到文档中,也能对原有的DOM元素进行移动。

删除节点

remove()

从DOM中删除所有匹配的元素,传入的参数用于根据jQuery表达式来筛选元素

// 获取第 2 个 li 元素节点后,将它从网页中删除
$('ul li:eq(1)').remove();
// 把刚才删除的节点重新添加到 ul 元素中
$('ul li:eq(1)').remove().appendTo('ul');
// appendTo()方法的特性来简化以上代码
// appendTo方法也可以用来移动元素 
$('ul li:eq(1)').appendTo('ul')
// 通过传递参数来选择性地删除元素
// 将 li 元素中属性 title 不等于‘菠萝’的 li 删除
$('ul li:eq(1)').remove('li[title!=菠萝]');

detach()

与remove()不同的是,所有绑定的事件、附加的数据等都会保留下来。

$('ul li').click(function(){
    alert($(this).html());
})
var $li=$('ul li:eq(1)').detach();
// 重新追加此元素,发现他之前绑定的事件还在;remove 方法删除元素后之前绑定的事件失效
$li.appendTo('ul');

empty()

empty()方法并不是删除节点,而是清空节点,它能清空元素中的所有后代节点

// 获取第 2 个 li 标签,清空元素里内容
// 第2个<li>元素的内容被清空了,只剩下<li>标签默认的符号“.”
var $li=$('ul li:eq(1)').empty();

复制节点

clone()方法中传递了一个参数true,它的含义是复制元素的同时复制元素中所绑定的事件;不传参数,被复制的新元素并不具有任何行为

$('ul li').click(function() {
        $(this).clone().appendTo('ul');
})
// 注意参数true
$(this).clone(true).appendTo('ul');

替换节点

replaceWith()

将所有匹配的元素都替换成指定的HTML或者DOM元素

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

replaceAll()

与 replaceWith() 作用相同。差异在于语法:内容和选择器的位置,以及 replaceAll() 无法使用函数进行替换。
替换后原先绑定的事件将会与被替换的元素一起消失,需要在新元素上重新绑定事件

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

包裹节点

如果要将某个节点用其他标记包裹起来,即 wrap()

<span>Hello jQuery</span>
<span>Hello jQuery</span>

$('span').wrap('<p/>');
// 结果
<p><span>Hello jQuery</span></p>
<p><span>Hello jQuery</span></p>
wrap()方法
  • wrapAll()方法

该方法会将所有匹配的元素用一个元素来包裹

<span>Hello jQuery</span>
<span>Hello jQuery</span>

$('span').wrapAll('<p/>');
// 结果
<p>
    <span>Hello jQuery</span>
    <span>Hello jQuery</span>
</p>
wrapAll()方法
  • wrapInner()方法

将每一个匹配的元素的子内容(包括文本节点)用其他结构化的标记包裹起来

<span>Hello jQuery</span>
<span>Hello jQuery</span>

$('span').wrapInner('<p/>');
// 结果
<span><p>Hello jQuery</p></span>
<span><p>Hello jQuery</p></span>
wrapInner()方法

属性操作

获取属性和设置属性

attr()方法,既能设置元素属性的值,也能获取元素属性的值。类似的还有html()、text()、height()、width()、val()和css()等方法

// 一个参数获取;两个参数设置
$('span').attr('class');
$('span').attr('class','rightBox')
// 同一个元素设置多个属性
$('span').attr({
    'class': 'rightBox',
    'title': 'span标签'
})

删除属性

// 删除 p 标签的 title 属性
$("p").removeAttr('title')

prop()removeProp(),分别用来获取在匹配的元素集中的第一个元素的属性值和为匹配的元素删除设置的属性

样式操作

获取样式和设置样式

获取 class 和设置 class 都可以使用 attr() 方法来完成(同上)

追加样式

jQuery 提供了专门的 addClass() 方法来追加样式

方法 addClass attr()
用途 追加样式 设置样式
对同一个元素操作 <p>hello</p>
第1次使用 $(p).addClass('high'); $(p).attr('high');
结果 <p class='high'>hello</p>
第二次使用 $(p).addClass('another'); $(p).attr('another');
结果 <p class='high another'>hello</p> <p class='another'>hello</p>

移除样式

  • 删除单个
$('p')removeClass('high');
  • 删除多个
// 两种方式
$('p')removeClass('high').removeClass('another');
$('p')removeClass('high another')
  • 全部删除
$('p')removeClass()

切换样式

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

$('p').toggleClass('another')

<p class='high'>hello</p>
<p class='high another'>hello</p>`

判断是否含有某个样式

hasClass()可以用来判断元素中是否含有某个class,如果有,则返回true,否则返回false

// 判断是否含有 another 类
$('p').hasClass('another')
// 等价
$('p').is('another')

设置和获取 HTML、文本和值

  • html():可用于XHTML文档,不能用于XML文档
// 获取:不传值
<p>Hello<span> jQuery</span></p>
console.log($('p').html());// Hello<span> jQuery</span>
// 设置:传递一个参数
$('p').html('<i>javaScript</i>')
<p><i>javaScript</i></p>
  • text():HTML文档和XML文档都有效
// 获取:不传值
<p>Hello<span> jQuery</span></p>
console.log($('p').text());// Hello jQuery
// 设置:传递一个参数
$('p').text('<i>javaScript</i>')
<p><i>javaScript</i></p> // i 标签会直接显示页面

JavaScript中的innerText属性不能在Firefox浏览器下运行,text()方法支持所有的浏览器

  • val()
    • 设置和获取元素的值
    • 设置 select、checkbox 和 radio 选项被选中
    // this.defaultValue 当前文本框默认值
    $("address").focus(functon(){
        var text_value=$(this).val();
        if(text_value==this.defaultValue){
            $(this).val("")
        }
    })
$("#single").val("选择2号");
$("#multiple").val(["选择2号","选择3号"]);
$(":checkbox").val(["check2","check3"]);
$(":radio").val([radio2]);
// 使用attr()方法来实现同样的功能
$("#single option:eq(1)").attr("selected", true );
$("[value=radio2]:radio").attr("checked", true );

遍历节点

DOM 树
  • children()方法:用于取得匹配元素的子元素集合

children()方法只考虑子元素而不考虑其他后代元素

 var $body = $("body").children();
 alert($body.length);  // 2
  • next()方法 :用于取得匹配元素后面紧邻的同辈元素
var $p = $("p").next();// ul元素
  • prev()方法:用于取得匹配元素前面紧邻的同辈元素
var $ul = $("ul").prev();// p元素
  • siblings()方法:用于取得匹配元素前后所有的同辈元素
var $p = $("p").siblings();// ul元素
  • closest()

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

$(documemnt).bind("click",function(e){
   $(e.target).closest.css("color","red"); 
})
  • parent(),parents()与closest()的区别
方法 描述 实例
parent() 获取集合中每个匹配元素的父级元素 从指定类型的直接父节点开始查找,返回一个元素节点
parents() 获取集合中每个匹配元素的祖先元素 当他找到第一个父级节点并没有停止而是继续查找,返回多个父级节点
closest() 从元素本身开始,主机箱上级元素匹配,并返回最先匹配的元素 从自身节点开始查找,返回匹配的第一个元素节点

CSS-DOM操作

CSS-DOM技术简单来说就是读取和设置style对象的各种属性。style属性很有用,但最大不足是无法通过它来提取到通过外部CSS设置的样式信息,然而在jQuery中,这些都是非常的简单

// 获取 p 标签的样式颜色
$("p").css("color");
// 设置 p 标签的样式为红色
$("p").css("color":"red");
// 同时设置多个样式属性
$("p").css("fontSize":"20px","backgroundColor":"#fff");

注意

  1. 如果值是数字,将会被自动转化为像素值。

  2. 在css()方法中,如果属性中带有“-”符号,例如font-size属性,如果在设置这些属性的值的时候不带引号,那么就要用驼峰式写法

    $("p").css({ fontSize : "30px",backgroundColor : "#888888" })

设置透明底属性

$("p").css("opacity","0.5");

获取元素的hight属性

$(element).css("hight");
$("p").hight();
$("p").hight(100); // 设置 p 标签高度值为 100px
$("p").hight("100em"); // 设置 p 标签高度值为 100em

height()方法可以用来获取window和document的高度
css()方法获取的高度值与样式的设置有关,可能会得到"auto",也可能得到"10px"之类的字符串;而height()方法获取的高度值则是元素在页面中的实际高度,与样式的设置无关,并且不带单位

获取元素的width属性

$("p").width();
$("p").width("400px");

常用方法

  • offset()方法:作用是获取元素在当前视窗的相对偏移,返回的对象包含两个属性,即top和left
var offset = $("p").offset();
var left = offset.left;
var top = offset.top;
  • position()方法:作用是获取元素相对于最近的一个position样式属性设置为relative或者absolute的祖父节点的相对偏移,与offset()一样,它返回的对象也包括两个属性,即top和left
var position = $("p").position();
var left = position.left;
var top = position.top;
  • scrollTop()方法和scrollLeft()方法:分别是获取元素的滚动条距顶端的距离和距左侧的距离
var $p = $("p");
var scrollTop = $p.scrollTop();
var scrollLeft = $p.scrollLeft();

// 可以为这两个方法制定一个参数
$("textarea").scrollTop(300);
$("textarea").scrollLeft(300);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,966评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,170评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,909评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,959评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,851评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,583评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,956评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,590评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,878评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,892评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,719评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,501评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,957评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,124评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,440评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,003评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,211评论 2 339

推荐阅读更多精彩内容