原文链接:http://blog.garstasio.com/you-dont-need-jquery/dom-manipulation/

我的Blog:http://cabbit.me/you-dont-need-jquery/manipulation/

上一篇文章里我们讨论了如何在没有jQuery的支持下选择元素,这次我们来聊一聊如何使用DOM API创建新元素、修改已有元素的属性或者移动元素的位置。原生的浏览器API已经给我们提供了DOM操作的所有功能,我们能够不借助jQuery或者其他函数库的帮助就完成这些。

当然有些操作会显得比较冗长,所以我必须再强调一遍,这系列文章的用意不是让开发人员不分情况的彻底丢弃jQuery,而是希望我们能够在没有jQuery的帮助时也能完成这些任务。在实际生产中我们依然会使用各种函数库,但是我们可以仔细选择,使用更加适合我们需要的库,而不是部分情况的把整个jQuery都加载到页面里。

创建元素

jQuery

如果我们要创建一个 div 元素:

  1. $('<div></div>');

DOM API,createElement这个很常见了:

  1. // IE 5.5+
  2. document.createElement('div');

或许有人会说,jQuery省去了好些字符。这没错,但确实要依照工程实际而定,如果我们只是用到jQuery的小部分功能,那省去的字数可能还没有jQuery自身的文件大。

在元素前/后插入元素

假设我们已经有了如下HTML结构:

  1. <div id="1"></div>
  2. <div id="2"></div>
  3. <div id="3"></div>

现在我们要在 id=1 的 div 后面插入一个 id=1.1 的新 div 元素,期望的结果是这样的:

  1. <div id="1"></div>
  2. <div id="1.1"></div>
  3. <div id="2"></div>
  4. <div id="3"></div>

jQuery

  1. $('#1').after('<div id="1.1"></div>');

DOM API,有Web开发新人会认为链式调用是jQuery的专利,事实上没有jQuery我们也可以使用链式调用:

  1. // IE 4+
  2. document.getElementById('1')
  3. .insertAdjacentHTML('afterend', '<div id="1.1"></div>');

哈哈,这可能是DOM API里不多的从IE 4开始就没怎么变化过的函数了~

假设我们希望在 id=1 的 div 前面插入一个 id=0.9 的新 div 元素,期望的结果是这样:

  1. <div id="0.9"></div>
  2. <div id="1"></div>
  3. <div id="2"></div>
  4. <div id="3"></div>

jQuery

  1. $('#1').before('<div id="0.9"></div>');

DOM API

  1. // IE 4+
  2. document.getElementById('1')
  3. .insertAdjacentHTML('beforebegin', '<div id="0.9"></div>');

同在后面插入相比,只有一个参数不同。不得不说,看到一个函数被IE 4以上所有的浏览器都支持的时候,作为一个前端开发人员我还是挺惊讶的 _

作为子元素插入

假设我们已经有了如下HTML结构:

  1. <div id="parent">
  2. <div id="oldChild"></div>
  3. </div>

现在我们希望在 parent 容器的第一个子元素之前插入一个新的 div 元素,就象这样:

  1. <div id="parent">
  2. <div id="newChild"></div>
  3. <div id="oldChild"></div>
  4. </div>

jQuery

  1. $('#parent').prepend('<div id="newChild"></div>');

DOM API

  1. // IE 4+
  2. document.getElementById('parent')
  3. .insertAdjacentHTML('afterbegin', '<div id="newChild"></div>');

如果我们希望在第一个子元素的后面插入那个 div 元素,期望得到这样的结构:

  1. <div id="parent">
  2. <div id="oldChild"></div>
  3. <div id="newChild"></div>
  4. </div>

jQuery

  1. $('#parent').append('<div id="newChild"></div>');

DOM API

  1. // IE 4+
  2. document.getElementById('parent')
  3. .insertAdjacentHTML('beforeend', '<div id="newChild"></div>');

这一节看上去和上一节差不多,总之我们发现使用DOM API操作元素也不是很复杂,而且到目前为止对浏览器的兼容性都很不错,包括古老的IE浏览器也能很好的适应。

移动元素

假设有以下HTML结构:

  1. <div id="parent">
  2. <div id="c1"></div>
  3. <div id="c2"></div>
  4. <div id="c3"></div>
  5. </div>
  6. <div id="orphan"></div>

在这里希望把 #orphan 移动到 parent 容器中作为最后一个元素,期望的HTML是:

  1. <div id="parent">
  2. <div id="c1"></div>
  3. <div id="c2"></div>
  4. <div id="c3"></div>
  5. <div id="orphan"></div>
  6. </div>

jQuery

  1. $('#parent').append($('#orphan'));

DOM API

  1. // IE 5.5+
  2. document.getElementById('parent')
  3. .appendChild(document.getElementById('orphan'));

也还是蛮好记的对不对?如果我们希望把 #orphan 移动到 parent 容器的第一个元素,类似于:

  1. <div id="parent">
  2. <div id="orphan"></div>
  3. <div id="c1"></div>
  4. <div id="c2"></div>
  5. <div id="c3"></div>
  6. </div>

jQuery

  1. $('#parent').prepend($('#orphan'));

DOM API

  1. // IE 5.5+
  2. document.getElementById('parent')
  3. .insertBefore(document.getElementById('orphan'), document.getElementById('c1'));

直接使用DOM API看上去确实很长,这都是拜 document.getElementById 所赐。

删除元素

假设我们的HTML元素中有一个 id="foobar" 的元素,我们希望把他从DOM树中删除:

jQuery

  1. $('#foobar').remove();

DOM API

  1. // IE 5.5+
  2. document.getElementById('foobar')
  3. .parentNode.removeChild(document.getElementById('foobar'));

添加/删除 CSS Classes

假设在HTML中有这样一个 div :

  1. <div id="foo"></div>

我们希望给他加入名为 bold 的CSS Class,期望DOM变成这样:

  1. <div id="foo" class="bold"></div>

jQuery

  1. $('#foo').addClass('bold');

DOM API

  1. document.getElementById('foo').className += 'bold';

当然我们还可以把刚刚加上的Class删除掉:

jQuery

  1. $('#foo').removeClass('bold');

DOM API

  1. // IE 5.5+
  2. document.getElementById('foo').className =
  3. document.getElementById('foo').className.replace(/^bold$/, '');

添加/删除/修改元素属性

仍然从简单的 foo 元素开始:

  1. <div id="foo"></div>

我们希望在 div 元素上设定 role="button" 来让它能够充当一个 button,这样能够在可访问性设备(屏幕阅读器等)上获得较好的可访问性:

jQuery

  1. $('#foo').attr('role', 'button');

DOM API

  1. // IE 5.5+
  2. document.getElementById('foo').setAttribute('role', 'button');

这两种方法都可以识别元素是否已经具备了这个属性,然后自动创建/更新这个属性。现在让我们再把这个 role 删除掉(我都觉得自己好烦…)

jQuery

  1. $('#foo').removeAttr('role');

DOM API

  1. // IE 5.5+
  2. document.getElementById('foo').removeAttribute('role');

添加/修改内容

这次的 foo 元素比原来复杂多了(_):

  1. <div id="foo">Hi there!</div>

如果要把 foo 的内容改成 Goodbye!:

jQuery

  1. $('#foo').text('Goodbye!');

DOM API

  1. // IE 5.5+
  2. document.getElementById('foo').innerHTML = 'Goodbye!';
  3. // IE 5.5+ but NOT Firefox
  4. document.getElementById('foo').innerText = 'GoodBye!';
  5. // IE 9+
  6. document.getElementById('foo').textContent = 'Goodbye!';

最常见的 innerHTML 属性在各种条件下都工作的很好。但是 innerText 和 textContent 的好处在于他们只是处理目标元素内的文字,而不是像 innerHTML 一样直接插入标签。当插入的内容是用户输入的内容时,这样能够一定程度上避免注入的问题。

添加/修改 Style

一般来说,直接用JavaScript脚本操作DOM元素的 style 是代码中的“坏味道”,当然就像 goto 一样我们总会有些时候需要这样做。

假设HTML的结构是这样的:

  1. <span id="note">Attention!</span>

可以通过JavaScript代码让这段文字变得醒目一些,比如变成粗体(或者闪烁三下/转体三圈):

jQuery

  1. $('#note').css('fontWeight', 'bold');

DOM API

  1. // IE 5.5+
  2. document.getElementById('note').style.fontWeight = 'bold';

这里很难得我比较喜欢DOM API写法,style.fontWeight 看上去比较像是正常的对象-属性的逻辑。

专用的DOM操作库

看到这里比上一篇[选择元素]({% post_url /you-dont-need-jquery/2014-12-21-selector %}/)要容易一些,在IE 6及以上的版本中跨浏览器使用DOM API操作元素相对比较容易。jQuery确实使得冗长的DOM API变得简单易懂,但是如果只是把jQuery用作DOM操作,似乎还是有些大材小用。我们可以试试jBonedom.js这两个库,他们都可以在跨浏览器的情况下很好的兼容DOM元素操作,著名的Backbone中使用的正是前者。很多使用jQuery的开发人员觉得原生的DOM API不堪入目,但是我想他们并不真的掌握DOM API,其实DOM API并没有比jQuery复杂太多。

如果我有漏掉什么重要的DOM元素操作,请在评论中告诉我。

抛弃jQuery:DOM API之操作元素的更多相关文章

  1. 抛弃jQuery:DOM API之选择元素

    原文链接:http://blog.garstasio.com/you-dont-need-jquery/selectors/ 我的Blog:http://cabbit.me/you-dont-need ...

  2. jQuery DOM/属性/CSS操作

    jQuery DOM 操作 创建元素 只需要把DOM字符串传入$方法即可返回一个 jQuery 对象 var obj = $('<div class="test">&l ...

  3. 从零开始学 Web 之 jQuery(五)操作元素其他属性,为元素绑定事件

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  4. jQuery -- DOM节点的操作

    DOM 操作的分类: dom core: getElementById() getElementsByTagName() getAttribute() setAttribute() html-dom ...

  5. 【JS】Intermediate7:jQuery:DOM API

    1.jQuery also makes performing actions on many elements at the same time simple 2.eg:$('.note').css( ...

  6. Jquery Dom节点常用操作

    select 标签 form提交的时候 提交select标签选中的value值 1. 添加项 $("#select_id").append("<option val ...

  7. 抛弃jQuery:Why?

    原文链接:http://blog.garstasio.com/you-dont-need-jquery/ 我的Blog:http://cabbit.me/you-dont-need-jquery/wh ...

  8. jQuery DOM

    请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1  jQuer ...

  9. jQuery DOM基础

    jQuery DOM基础 1.对元素内容的获取和修改: 表单用value(),普通元素用html()和text(). html()  html(value)设置和获取html内容,有html标签会自动 ...

随机推荐

  1. H5单页面手势滑屏切换原理

    H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 ...

  2. SuperMap iClient for JavaScript 新手入门

    地理信息系统(英语:Geographic Information System,缩写:GIS)是一门综合性学科,结合地理学与地图学,已经广泛的应用在不同的领域,是用于输入.存储.查询.分析和显示地理数 ...

  3. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  4. C#——传值参数(1)

    //我的C#是跟着猛哥(刘铁猛)(算是我的正式老师)<C#语言入门详解>学习的,微信上猛哥也给我讲解了一些不懂得地方,对于我来说简直是一笔巨额财富,难得良师! 这次与大家一起学习C#中的值 ...

  5. bzoj1079--记忆化搜索

    题目大意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得 ...

  6. 【干货分享】流程DEMO-请休假

    流程名: 请假申请  流程相关文件: 流程包.xml WebService业务服务.xml WebService.asmx WebService.cs  流程说明: 流程中集成了webservice服 ...

  7. SNMP简单网络管理协议

    声明:以下内容是学习谌玺老师视频整理出来(http://edu.51cto.com/course/course_id-861.html) SNMP(Simple Network Management ...

  8. Linux基础介绍【第二篇】

    远程连接Linux的原理 SHH远程连接介绍 当前,在几乎所有的互联网企业环境中,最常用的Linux提供远程连接服务的工具就是SSH软件,SSH分为SSH客户端和SSH服务端两部分.其中,SSH服务端 ...

  9. Openfire阶段实践总结

    从3月开始研究Openfire,其实就是要做一套IM系统,也正是这个原因才了解到Openfire.之前还真没想过有这么多的开源产品可以做IM,而且也没想到XMPP这个协议竟然如何强大.看来还是标准为先 ...

  10. 学习笔记:Maven构造版本号的方法解决浏览器缓存问题

    需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...