一、前言

  相比于JS这条直达终点、满是荆棘的小路,jquery无疑是康庄大道了,足够的简洁、易用给了它辉煌的地位。然而,毕竟是绕着道的插件,当小路走着走着变成大路的时候,曾经的大路也就失去了他自身的优势了。

  原生JS虽然没有jquery那么的好用、便捷,或者说没有jquery那样让我们使用的如此顺手,甚至是无法舍弃的依赖。可是我们依然不得不扔掉手中这根陪伴我们多年的拐杖,我们不是瘸子,我们不曾腐朽,我们还可以独立前行。

二、正文

1. jquery和原生JS获取节点的比较

//这是HTML代码,提供节点用于获取
<div id="divId" class="divClass">
<input type="text" name="nickname" placeholder="请输入用户名">
<input type="password" name="pwd" placeholder="请输入密码">
</div>
//jquery 通过$/jquery获取节点,也就是css选择器
$("#divId")
$(".divClass")
$("input[name='nickname']")
//原生JS,通过id和classname,tagname,name获取节点
document.getElementById("divId")
document.getElementsByClassName("divClass")
document.getElementsByTagName("div")
document.getElementsByName("nickname")//此项必须在节点上本身就有name属性,才可以获取 //IE8以后也有通过CSS选择器来获取的节点的
document.querySelector("#divId input")
document.querySelectorAll("div")

几点说明和注意:

  • 注意getElementById中的“Element”没有复数,这是因为在id唯一的前提下,通过id获取的节点也是唯一的,所以没有复数
  • 相对于通过id获取节点,通过className、tagName、name获取节点的“Element”都有复数,也就是说获取的节点存储在数组之中,无论是否唯一,所以使用节点对象时必须使用数组的下标,例如:document.getElementsByClassName("divClass")[0]
  • document.querySelector("div")也是通过CSS选择器来获取节点,类似于jquery,但是当满足条件的有多个节点时,只获取第一个;
  • document.querySelectorAll("div")可以获取满足条件的节点集合,无论是否唯一都是节点集合(NodeList);
  • 而$("div")能够获取所有满足条件的节点,并且无须使用数组下标即可对所有满足的节点对象进行操作,而document.querySelectorAll("div")必须使用下标。
  • 相对于使用document.querySelector,使用getElementById的性能要好些,所以在选择节点相对简单时,使用后者可以提升性能(找到节点更迅速)。

2. jquery和原生JS节点对象的使用比较

//jquery  添加和删除className
$(selector).addClass("active");
$(selector).removeClass("active"); //原生JS 添加和删除className //为 <div> 元素添加 class:
document.getElementById("myDIV").classList.add("mystyle");
//为 <div> 元素添加多个类:
document.getElementById("myDIV").classList.add("mystyle", "anotherClass", "thirdClass");
//为 <div> 元素移除一个类:
document.getElementById("myDIV").classList.remove("mystyle");
//为 <div> 元素移除多个类:
document.getElementById("myDIV").classList.remove("mystyle", "anotherClass", "thirdClass");
//检查是否含有某个CSS类
myDiv.classList.contains('myCssClass'); //return true or false

链接:如何用原生JS删除标签中的类名和添加类名?

//jquery attr的使用 修改和添加属性
$(selector).attr("name", "nickname");//添加并设置name属性
$(selector).attr("name");//获取name属性值 //原生JS 修改和获取属性值
document.querySelector("input[type='text']").setAttribute("name", "account");
document.querySelector("input[type='text']").getAttribute("name");
//jquery 修改和获取css属性
$(selector).css("display", "none");//添加或设置CSS得display
$(selector).css("display");//获取当前的地上play的值 //原生JS 修改和获取CSS属性值
document.querySelector("input[type='text']").style.backgroundColor= "red";
;document.querySelector("input[type='text']").style.backgroundColor; //还可以通过修改className的方式来达到修改css的目的

3.jquery和原生JS添加节点和删除节点

Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.

//原生JS添加节点

document.querySelector("body").appendChild('<div>添加一个div</div>');

执行上面的代码就会报红色文字的错误,这是因为你想当然的认为jquery和原生JS的添加节点一样导致的。在原生JS中,appendChild不可以直接添加字符串,只能添加节点。

后插入节点:append()  和 appendChild

//Jquery添加节点
$("body").append('<div>添加一个div节点</div>'); //原生JS添加节点,相对要麻烦一些
var para=document.createElement("div");
var node=document.createTextNode("添加一个div节点");
para.innerHTML = "<span>这是一个span</span>"
para.appendChild(node);
para.className = "...";
document.querySelector("body").appendChild(para); //当然,你也可以这样;这样做弊端很大,body里面其他节点会被覆盖掉 document.querySelector("body").innerHTML = '<div>添加一个div节点</div>';

这也是jquery的append和原生JS的appendChild的根本区别所在,appendChild不可以直接添加字符串,只能添加节点。

前插入节点:prepend()  和 insertBefore(newChildNode, childNode)

//Jquery添加节点,前插入,也就是在所有子节点的前面添加这个节点
$("body").prepend('<div>添加一个div节点</div>'); //原生JS添加节点,前插入insertBefore,插入在第二个参数节点的前面,此处childNode为body中的子节点。
var para=document.createElement("div");
//...
document.querySelector("body").insertBefore(para, childNode);

jquery的prepend和原生JS的insertBefore的区别就很大,

prepend插入节点到所有子节点的前面,prepend(newChildNode);

而insertBefore可以插入节点到任何子节点的前面,这也是比较方便的地方,但需要提供第二个参数,insertBefore(newChildNode, childNode);

当然,prepend可以添加字符串,而insertBefore的参数必须是节点。

删除节点:remove()  和 removeChild(childNode)

<div id="parent">
<div class="first">a</div>
<div class="second">b</div>
<div class="third">c</div>
</div>
//Jquery的删除节点
$(selector).remove(); //没有参数即删除所有符合条件的节点
$(selector).remove(".first");   //有参数表示删除id为first的节点 //原生JS的删除节点,需要参数,参数表示想要删除的节点
var thisNode=document.getElementsByClassName("first");
thisNode.parentNode.removeNode(thisNode);

问题是:这样的原生JS不能够批量删除节点,怎么办?

//可以使用循环进行删除
var parent = document.getElementById("parent");
var childs = parent .childNodes;
for(var i = 0; i < childs.length; i++) {
alert(childs[i].nodeName);
parent .removeChild(childs[i]);
}

但是,在Firefox和IE中有问题,火狐会把空白部分算作节点,这样循环删除就不一定能够删除所有的节点。另外,删除节点后,索引会发生变化,导致删除出现错误。可以通过倒序删除来解决这些问题。

//原生JS循环删除节点
var parent = document.getElementById("parent");
var childs = parent .childNodes;
for(var i = childs.length - 1; i >= 0; i--) {
alert(childs[i].nodeName);
childs .removeChild(childs[i]);
}

三、结语

  先到这里,有补充继续。

原生JS的使用,包括jquery和原生JS获取节点、jquery和原生JS修改属性的比较的更多相关文章

  1. 封装常用的js(Base.js)——【01】理解库,获取节点,连缀,

    封装常用的js(Base.js)——[01]理解库,获取节点,连缀,  youjobit07 2014-10-10 15:32:59 前言:       现如今有太多优秀的开源javascript库, ...

  2. JS DOM中getElement系列和querySelector系列获取节点

    节点查找方法 document.getElementById() 前面必须是document document.getElementsByName()  前面必须是document ele.getEl ...

  3. JS里点击事件判断是否 触发了节点 和给标签添加class属性

    $("#activityType").click(function(e){ if(e.target==$("#bb")[0]){ var bb=document ...

  4. 原生的js操作实现通过对URL的监控获取参数

    原生的js操作实现通过对URL的监控获取用户的操作信息 优化网站的时候,因为列表是用vue组件进行循环渲染,就出现了一个问题,单击跳转的问题,想了很多方案,使用js函数的方式面对这种情况并不乐观,想到 ...

  5. (转)jQuery轻量级响应式图片轮播插件ResponsiveSlides.js(仅1kb)也可以做纯文本轮播

    ResponsiveSlides.js是一个展示同一容器内图片的轻量级响应式jQuery幻灯片插件(tiny responsive slideshow jQuery plugin).它支持包括IE6在 ...

  6. JS和jQuery获取节点的兄弟,父级,子级元素

    原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的 ...

  7. 前端(十七)—— jQuery基础:jQuery的基本使用、JQ功能概括、JS对象与JQ对象转换、Ajax简单应用、轮播图

    jQuery的基本使用.JQ功能概括.JS对象与JQ对象转换.Ajax简单应用.轮播图 一.认识jQuery 1.什么是jQuery jQuery是对原生JavaScript二次封装的工具函数集合 j ...

  8. jquery的height()和javascript的height总结,js获取屏幕高度

    jquery的height()和javascript的height总结,js获取屏幕高度 2014年9月18日 15048次浏览 引子 今天是九一八事变八十三周年,大家勿忘国耻!加油学习!经济和技术等 ...

  9. jQuery中设置form表单中action值与js有什么不同。。。。

    jQuery中设置form表单中action值与js有什么不同.... HTML代码如下: <form action="" method="post" i ...

随机推荐

  1. 让nodejs 支持 es6 import

    备注:    尽管nodejs 新版本已经支持es6 的好多特性了,但是还是有部分不支持,为了使用,实际上我们有一个 比较强大工具 bable,下面介绍几个比较简单的用法. 1. bable-cli ...

  2. 安装 Ruby, Rails 运行环境

    步骤1 - 安装 RVM RVM 是干什么的这里就不解释了,后面你将会慢慢搞明白. $ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1 ...

  3. 制作Windows XP万能克隆镜像

    制作Windows XP万能克隆镜像 战前分析:对于Windows XP,制作万能克隆时的一个重要问题就是系统激活,因为Windows XP为了防止盗版,采取了激活机制,当硬件发生改变时,系统就会要求 ...

  4. Proteus 仿真运算放大器出现 GMIN 问题

    Proteus 仿真运算放大器出现 GMIN 问题 为了仿真一个反相运算放大器,在仿真时出现 GMIN 问题,将 后面的 4.7UF 去掉就可以正常仿真. 初步检查是因为输入频率太低,输入时我用的是 ...

  5. linux的mysql

    mysql https://www.cnblogs.com/cnblogsfans/archive/2009/09/21/1570942.html https://blog.csdn.net/Smal ...

  6. 框架(yii和thinkphp)中实例化php内置或者扩展中的对象问题

    将php原生语句实例化SphinxClient对象移植到yii2框架中报错 原生语句中这样写: $s = new SphinxClient(); 框架中应该加入反斜杠,这样写: $s = new \S ...

  7. 基于STL优先队列和邻接表的dijkstra算法

    首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...

  8. linux安装oracle12c

    参考: https://blog.csdn.net/who__are__you_/article/details/79178303 记录:

  9. Hibernate学习5—Hibernate操作对象2

    第二节:Session 常用方法讲解 2)load和get()方法: 数据库中不存在与OID 对应的记录,Load()方法会抛出异常: load方法默认采用延迟加载,load出来的对象是一个代理类.开 ...

  10. NGUI的UIPanel、UIButton、AtlasMaker、Widget、Anchor、Tween、RectTransform

    全文请看:http://note.youdao.com/noteshare?id=f7b476be35ec554e311bc13ef60b62ef