JS-35-jQuery04-操作DOM

jQuery的选择器很强大,用起来又简单又灵活,但是搞了这么久,我拿到了jQuery对象,到底要干什么?

答案当然是操作对应的DOM节点啦!

回顾一下修改DOM的CSS、文本、设置HTML有多么麻烦,而且有的浏览器只有innerHTML,有的浏览器支持innerText,有了jQuery对象,不需要考虑浏览器差异了,全部统一操作!

一、修改Text和HTML

1、text()html()方法:获取

jQuery对象的text()html()方法分别获取节点的文本原始HTML文本

例如,如下的HTML结构:

<!-- HTML结构 -->
<ul id="test-ul"><li class="js">JavaScript</li><li name="book">Java &amp; JavaScript</li>
</ul>

分别获取文本和HTML:

$('#test-ul li[name=book]').text(); // 'Java & JavaScript'
$('#test-ul li[name=book]').html(); // 'Java &amp; JavaScript'

2、text(参数)html(参数)方法 :设置

如何设置文本或HTML?

jQuery的API设计非常巧妙:无参数调用text()是获取文本,传入参数就变成设置文本,HTML也是类似操作:

var j1 = $('#test-ul li.js');
var j2 = $('#test-ul li[name=book]');
j1.html('<span style="color: red">JavaScript</span>');
j2.text('JavaScript & ECMAScript');

一个jQuery对象可以包含0个或任意个DOM对象,它的方法实际上会作用在对应的每个DOM节点上。

在上面的例子中试试:

$('#test-ul li').text('JS'); // 两个节点都变成了JS

所以jQuery对象的另一个好处是我们可以执行一个操作,作用在对应的一组DOM节点上。

即使选择器没有返回任何DOM节点,调用jQuery对象的方法仍然不会报错:

// 如果不存在id为not-exist的节点:
$('#not-exist').text('Hello'); // 代码不报错,没有节点被设置为'Hello'

这意味着jQuery帮你免去了许多if语句!!!

二、修改CSS

1、css()方法

jQuery对象有“批量操作”的特点,这用于修改CSS实在是太方便了。考虑下面的HTML结构:

<!-- HTML结构 -->
<ul id="test-css"><li class="lang dy"><span>JavaScript</span></li><li class="lang"><span>Java</span></li><li class="lang dy"><span>Python</span></li><li class="lang"><span>Swift</span></li><li class="lang dy"><span>Scheme</span></li>
</ul>

要高亮显示动态语言,调用jQuery对象的css('name', 'value')方法,我们用一行语句实现:

$('#test-css li.dy>span').css('background-color', '#ffd351').css('color', 'red');

注意jQuery对象的所有方法都返回一个jQuery对象(可能是新的也可能是自身),这样我们可以进行链式调用,非常方便。

jQuery对象的css()方法可以这么用:

var div = $('#test-div');div.css('color'); // '#000033', 获取CSS属性
div.css('color', '#336699'); // 设置CSS属性
div.css('color', ''); // 清除CSS属性

为了和JavaScript保持一致,CSS属性可以用'background-color''backgroundColor'两种格式。

css()方法将作用于DOM节点的style属性,具有最高优先级。

2、xxxClass()方法

如果要修改class属性,可以用jQuery提供的下列方法:

var div = $('#test-div');div.hasClass('highlight'); // false, class是否包含highlight
div.addClass('highlight'); // 添加highlight这个class
div.removeClass('highlight'); // 删除highlight这个class

三、显示和隐藏DOM

要隐藏一个DOM,我们可以设置CSS的display属性为none,利用css()方法就可以实现。

不过,要显示这个DOM就需要恢复原有的display属性,这就得先记下来原有的display属性到底是block还是inline还是别的值。

1、show()hide()方法

考虑到显示和隐藏DOM元素使用非常普遍,jQuery直接提供show()hide()方法,我们不用关心它是如何修改display属性的,总之它能正常工作:

var a = $('a[target=_blank]');
a.hide(); // 隐藏
a.show(); // 显示

注意,隐藏DOM节点并未改变DOM树的结构,它只影响DOM节点的显示。这和删除DOM节点是不同的。

四、获取DOM信息

利用jQuery对象的若干方法,我们直接可以获取DOM的高宽等信息,而无需针对不同浏览器编写特定代码:

// 浏览器可视窗口大小:
$(window).width(); // 800
$(window).height(); // 600// HTML文档大小:
$(document).width(); // 800
$(document).height(); // 3500// 某个div的大小:
var div = $('#test-div');
div.width(); // 600
div.height(); // 300
div.width(400); // 设置CSS属性 width: 400px,是否生效要看CSS是否有效
div.height('200px'); // 设置CSS属性 height: 200px,是否生效要看CSS是否有效

在 jQuery 中,$(document) 获取到的是对当前文档(即整个 HTML 文档)的引用。

通过 $(document),你可以绑定事件处理程序(如页面加载完成时的 ready 事件)、查询文档的状态或内容、修改文档的 CSS 样式、进行 DOM 遍历等等。

1、attr()removeAttr()方法 

attr()removeAttr()方法用于操作DOM节点的属性:

// <div id="test-div" name="Test" start="1">...</div>
var div = $('#test-div');
div.attr('data'); // undefined, 属性不存在
div.attr('name'); // 'Test'
div.attr('name', 'Hello'); // div的name属性变为'Hello'div.removeAttr('name'); // 删除name属性
div.attr('name'); // undefined

 

2、prop()方法 

HTML5规定有一种属性在DOM节点中可以没有值,只有出现与不出现两种,例如:

<input id="test-radio" type="radio" name="test" checked value="1">

等价于:

<input id="test-radio" type="radio" name="test" checked="checked" value="1">

attr()prop()对于属性checked处理有所不同:

var radio = $('#test-radio');radio.attr('checked'); // 'checked'
radio.prop('checked'); // true

其余属性的attr()和prop()方法的返回值,是一样的! 

prop()返回值更合理一些。不过,用is()方法判断更好:

var radio = $('#test-radio');
radio.is(':checked'); // true

类似的属性还有selected,处理时最好用is(':selected')

五、操作表单

1、val()方法

对于表单元素,jQuery对象统一提供val()方法获取和设置对应的value属性

/*<input id="test-input" name="email" value="test"><select id="test-select" name="city"><option value="BJ" selected>Beijing</option><option value="SH">Shanghai</option><option value="SZ">Shenzhen</option></select><textarea id="test-textarea">Hello</textarea>
*/
varinput = $('#test-input'),select = $('#test-select'),textarea = $('#test-textarea');input.val(); // 'test'
input.val('abc@example.com'); // 文本框的内容已变为abc@example.comselect.val(); // 'BJ'
select.val('SH'); // 选择框已变为Shanghaitextarea.val(); // 'Hello'
textarea.val('Hi'); // 文本区域已更新为'Hi'

可见,一个val()就统一了各种输入框的取值和赋值的问题

六、修改DOM结构

6-1、添加DOM

1、上下级:append()和prepend()

要添加新的DOM节点,除了通过jQuery的html()这种暴力方法外,还可以用append()方法,

例如:如何向列表新增一个语言?

<div id="test-div"><ul><li><span>JavaScript</span></li><li><span>Python</span></li><li><span>Swift</span></li></ul>
</div>

1、首先要拿到<ul>节点:

var ul = $('#test-div>ul');

2、然后,调用append()传入HTML片段:

ul.append('<li><span>Haskell</span></li>');

 

注意:若是这样写

ul.html('<li><span>java</span></li>');

则效果变成:

除了接受字符串,append()还可以传入原始的DOM对象,jQuery对象和函数对象

// 创建DOM对象:
var ps = document.createElement('li');
ps.innerHTML = '<span>Pascal</span>';
// 添加DOM对象:
ul.append(ps);// 添加jQuery对象:
ul.append($('#scheme'));// 添加函数对象:
ul.append(function (index, html) {return '<li><span>Language - ' + index + '</span></li>';
});

传入函数时,要求返回一个字符串、DOM对象或者jQuery对象。

因为jQuery的append()可能作用于一组DOM节点,只有传入函数才能针对每个DOM生成不同的子节点。

append()把DOM添加到最后,prepend()则把DOM添加到最前。

另外注意,如果要添加的DOM节点已经存在于HTML文档中,它会首先从文档移除,然后再添加,也就是说,用append(),你可以移动一个DOM节点。

示例:

<div id="test-div"><ul><li><span>JavaScript</span></li><li><span>Python</span></li><li><span>Swift</span></li></ul></div><hr><div><ul><li><span>JavaScript1</span></li><li><span>Python1</span></li><li id="scheme111"><span>Swift1</span></li></ul></div>

        var ul = $('#test-div>ul');// 添加jQuery对象:var scheme111 = $('#scheme111');ul.append(scheme111);

2、同级节点:after()before()方法

如果要把新节点插入到指定位置,例如,JavaScript和Python之间,那么,可以先定位到JavaScript,然后用after()方法:

var js = $('#test-div>ul>li:first-child');
js.after('<li><span>Lua</span></li>');

也就是说,同级节点可以用after()或者before()方法。

6-2、删除节点

1、remove()方法

要删除DOM节点,拿到jQuery对象后直接调用remove()方法就可以了。如果jQuery对象包含若干DOM节点,实际上可以一次删除多个DOM节点:

var li = $('#test-div>ul>li');
li.remove(); // 所有<li>全被删除

七、练习题

除了列出的3种语言外,请再添加Pascal、Lua和Ruby,然后按字母顺序排序节点:

<!-- HTML结构 -->
<div id="test-div"><ul><li><span>JavaScript</span></li><li><span>Python</span></li><li><span>Swift</span></li></ul>
</div>

解:

        //除了列出的3种语言外,请再添加Pascal、Lua和Ruby,然后按字母顺序排序节点:// 1、添加Pascal、Lua和Rubyvar ul = $('#test-div>ul');ul.append('<li><span>Pascal</span></li>');ul.append('<li><span>Lua</span></li>');ul.append('<li><span>Ruby</span></li>');// 2、排序var spans = $('#test-div>ul li span');var arr = spans.map(function (){return this.innerHTML;}).get(); // ['JavaScript', 'Python', 'Swift', 'Pascal', 'Lua', 'Ruby']// 排序arr.sort();// 3、清除livar lis = $('#test-div>ul li');lis.remove();// 4、重新appendarr.forEach(function (value, index){ul.append('<li><span>' + value + '</span></li>');});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/623310.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot学习(三)数据访问、基础特性、核心原理

文章目录 数据访问示例自动配置原理jdbc场景自动配置数据源等基本信息MyBatisAutoConfiguration配置MyBatis整合流程 基础特性SpringApplication自定义banner自定义SpringApplicationFluentBuilder API Profiles使用指定环境环境激活环境包含 Profiles配置文件 外部化配置配置优…

选择最佳 PoE 布线系统的 3 个步骤

选择合适的 POE 布线系统的重要性 在不断发展的信息和通信技术 &#xff08;ICT&#xff09; 领域&#xff0c;以太网供电 &#xff08;PoE&#xff09; 布线系统已成为一种革命性的解决方案&#xff0c;它简化了网络设备的部署和管理&#xff0c;同时优化了电力传输。从智能建…

基于ARX结构(模加运算循环移位异或运算)的密码杂凑算法Lemon512

基于ARX结构(模加运算&循环移位&异或运算)的密码杂凑算法Lemon512 黄金龙 QQ1435271638 密码杂凑算法 密码杂凑算法也称作“散列算法”或“哈希算法”,现在的密码行业标准统称其为密码杂凑算法,简称“杂凑算法”或“杂凑函数”。密码杂凑算法对任意长度的消息进行…

汽车零部件制造迎来智能化升级,3D视觉定位系统助力无人化生产线建设

随着新能源汽车市场的蓬勃发展&#xff0c;汽车零部件制造行业正面临着前所未有的机遇与挑战。为了提高产能和产品加工精度&#xff0c;某专业铝合金汽车零部件制造商决定引进智能生产线&#xff0c;其中&#xff0c;对成垛摆放的变速箱壳体进行机床上料成为关键一环。 传统的上…

Postgresql源码(125)游标恢复执行的原理分析

问题 为什么每次fetch游标能从上一次的位置继续&#xff1f;后面用一个简单用例分析原理。 【速查】 恢复扫描需要知道当前页面、上一次扫描到的偏移位置、当前页面一共有几条&#xff1a; 当前页面&#xff1a;HeapScanDesc结构中记录了扫到的页面&#xff08;scan->rs_cb…

WPF中DataGrid主从数据(父子数据)展示

在wpf中可以使用DataGrid控件,进行主从数据展示,也称父子数据展示。下面展示纯原生控件编码实现功能(样式自己可以根据需求进行修改)。 效果如下: 点击图标,展开和收缩可以自由的切换,也可以自己重新写一个样式,比如+,-或者类似图标的样式,都是可以的。 1.首先创建一…

视频制作|专业人做专业事,分分钟剪出“薪”高度

随着视频的蓬勃发展&#xff0c;很多企业都有了通过视频传递企业信息和宣传企业形象的需求&#xff0c;如短视频、长视频、品宣视频、产品视频等。在了解短视频制作的好处与用途之后&#xff0c;视频在各行各业中都有了广泛的应用。 越来越多的企业选择在YesPMP平台将视频制作业…

GT资源-CPLL QPLL

一、前言 QPLL与CPLL是两种为GT Channel提供时钟的锁相环&#xff0c;其中CPLL与GT Channel绑定&#xff0c;每一个通道都有一个CPLL&#xff0c;而QPLL是与Quad绑定&#xff0c;每一个Quad有一个QPLL&#xff0c;4个通道共享一个QPLL 二、CPLL 每个GTX/GTH收发器通道包含一…

Java基础(变量)

什么是变量&#xff1f; 变量&#xff1a;在程序的执行过程中&#xff0c;其值有可能发生改变的量&#xff08;数据&#xff09; 变量的使用场景 当某个数据经常发生改变时&#xff0c;我们也可以用变量储存。当数据变化时&#xff0c;只要修改变量里面记录的值即可。 变量…

iframe嵌入海康威视摄像头监控视频画面

前言&#xff1a;海康威视有非常好的开放平台支持(海康开放平台)&#xff0c;如遇到技术问题&#xff0c;可以先花点时间在开放平台视频教程板块学习一下。直接问客服可能会比较懵&#xff0c;而且sdk客服和api客服互相分离&#xff0c;一开始可能都不知道问谁。 在开放平台上…

linux三剑客精妙招式都汇总在本文了(建议收藏)

熟悉linux的都知道&#xff0c;linux中有著名的三个命令&#xff0c;即grep、sed、awk。这三个命令被称为linux三剑客。三剑客包含各种招式众多&#xff0c;熟练掌握这三个命令的用法&#xff0c;将大大提高我们对文件的处理速度&#xff0c;大大提升运维效率。 本文通过具体实…

Python零基础从小白打怪升级中~~~~~~~TCP网络编程

TCP网络编程 一、什么是TCP协议 TCP( Transmission control protocol )即传输控制协议&#xff0c;是一种面向连接、可靠的数据传输协议&#xff0c;它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 面向连接 &#xff1a;数据传输之前客户端和…