网站如何做到完全不需要jQuery也可以满足简单需求_jquery
jQuery 是现在最流行的 JavaScript 工具库。
据统计,目前全世界 57.3% 的网站使用它。也就是说,10 个网站里面,有 6 个使用 jQuery。如果只考察使用工具库的网站,这个比例就会上升到惊人的 91.7%。
虽然 jQuery 如此受欢迎,但是它臃肿的体积也让人头痛不已。jQuery 2.0 的原始大小为 235KB,优化后为 81KB;如果是支持 IE6、7、8 的 jQuery 1.8.3,原始大小为 261KB,优化后为 91KB。
这样的体积,即使是宽带环境,完全加载也需要 1 秒或更长,更不要说移动设备了。这意味着,如果你使用了 jQuery,用户至少延迟 1 秒,才能看到网页效果。考虑到本质上,jQuery 只是一个操作 DOM 的工具,我们不仅要问:如果只是为了几个网页特效,是否有必要动用这么大的库?
2006 年,jQuery 诞生的时候,主要用于消除不同浏览器的差异(主要是 IE6),为开发者提供一个简洁的统一接口。相比当时,如今的情况已经发生了很大的变化。IE 的市场份额不断下降,以 ECMAScript 为基础的 JavaScript 标准语法,正得到越来越广泛的支持。开发者直接使用 JavScript 标准语法,就能同时在各大浏览器运行,不再需要通过 jQuery 获取兼容性。
下面就探讨如何用 JavaScript 标准语法,取代 jQuery 的一些主要功能,做到 jQuery-free。
一、选取 DOM 元素
jQuery 的核心是通过各种选择器,选中 DOM 元素,可以用 querySelectorAll 方法模拟这个功能。
代码如下:var $ = document.querySelectorAll.bind (document);
这里需要注意的是,querySelectorAll 方法返回的是 NodeList 对象,它很像数组(有数字索引和 length 属性),但不是数组,不能使用 pop、push 等数组特有方法。如果有需要,可以考虑将 Nodelist 对象转为数组。
代码如下:myList = Array.prototype.slice.call (myNodeList);
二、DOM 操作
DOM 本身就具有很丰富的操作方法,可以取代 jQuery 提供的操作方法。
尾部追加 DOM 元素。
代码如下:
// jQuery 写法
$(parent) .append ($(child));
// DOM 写法
parent.appendChild (child)
头部插入 DOM 元素。
代码如下:
// jQuery 写法
$(parent) .prepend ($(child));
// DOM 写法
parent.insertBefore (child, parent.childNodes[0])
删除 DOM 元素。
代码如下:
// jQuery 写法
$(child) .remove ()
// DOM 写法
child.parentNode.removeChild (child)
三、事件的监听
jQuery 的 on 方法,完全可以用 addEventListener 模拟。
代码如下:Element.prototype.on = Element.prototype.addEventListener;
为了使用方便,可以在 NodeList 对象上也部署这个方法。
代码如下:NodeList.prototype.on = function (event, fn) {
[]['forEach'].call (this, function (el) {
el.on (event, fn);
});
return this;
};
四、事件的触发
jQuery 的 trigger 方法则需要单独部署,相对复杂一些。
代码如下:
Element.prototype.trigger = function (type, data) {
var event = document.createEvent ('HTMLEvents');
event.initEvent (type, true, true);
event.data = data {};
event.eventName = type;
event.target = this;
this.dispatchEvent (event);
return this;
};
在NodeList对象上也部署这个方法。
代码如下:
NodeList.prototype.trigger = function (event) {
[]['forEach'].call (this, function (el) {
el['trigger'](event);
});
return this;
};
五、document.ready
目前的最佳实践,是将 JavaScript 脚本文件都放在页面底部加载。这样的话,其实 document.ready 方法(jQuery 简写为$(function))已经不必要了,因为等到运行的时候,DOM 对象已经生成了。
六、attr 方法
jQuery 使用 attr 方法,读写网页元素的属性。
代码如下:$("#picture") .attr ("src", "http://url/to/image");
DOM 元素允许直接读取属性值,写法要简洁许多。
代码如下:$("#picture") .src = "http://url/to/image";
需要注意,input 元素的 this.value 返回的是输入框中的值,链接元素的 this.href 返回的是绝对 URL。如果需要用到这两个网页元素的属性准确值,可以用 this.getAttribute (‘value')和 this.getAttibute (‘href')。
七、addClass 方法
jQuery 的 addClass 方法,用于为 DOM 元素添加一个 class。
代码如下:
$('body') .addClass ('hasJS');
DOM 元素本身有一个可读写的 className 属性,可以用来操作 class。
代码如下:
document.body.className = 'hasJS';
// or
document.body.className += ' hasJS';
HTML 5 还提供一个 classList 对象,功能更强大(IE 9 不支持)。
代码如下:
document.body.classList.add ('hasJS');
document.body.classList.remove ('hasJS');
document.body.classList.toggle ('hasJS');
document.body.classList.contains ('hasJS');
八、CSS
jQuery 的 css 方法,用来设置网页元素的样式。
代码如下:$(node) .css ( "color", "red" );
DOM 元素有一个 style 属性,可以直接操作。
代码如下:
element.style.color = "red";;
// or
element.style.cssText += 'color:red';
九、数据储存
jQuery 对象可以储存数据。
代码如下:$("body") .data ("foo", 52);
HTML 5 有一个 dataset 对象,也有类似的功能(IE 10 不支持),不过只能保存字符串。
代码如下:
element.dataset.user = JSON.stringify (user);
element.dataset.score = score;
十、Ajax
jQuery 的 Ajax 方法,用于异步操作。
代码如下:
$.ajax ({
type: "POST",
url: "some.php",
data: { name: "John", location: "Boston" }
}) .done (function ( msg ) {
alert ( "Data Saved: " + msg );
});
我们可以定义一个 request 函数,模拟 Ajax 方法。
代码如下:
function request (type, url, opts, callback) {
var xhr = new XMLHttpRequest ();
if (typeof opts === 'function') {
callback = opts;
opts = null;
}
xhr.open (type, url);
var fd = new FormData ();
if (type === 'POST' && opts) {
for (var key in opts) {
fd.append (key, JSON.stringify (opts[key]));
}
}
xhr.onload = function () {
callback (JSON.parse (xhr.response));
};
xhr.send (opts ? fd : null);
}
然后,基于 request 函数,模拟 jQuery 的 get 和 post 方法。
代码如下:
var get = request.bind (this, 'GET');
var post = request.bind (this, 'POST');
十一、动画
jQuery 的 animate 方法,用于生成动画效果。
代码如下:$foo.animate ('slow', { x: '+=10px' });
jQuery 的动画效果,很大部分基于 DOM。但是目前,CSS 3 的动画远比 DOM 强大,所以可以把动画效果写进 CSS,然后通过操作 DOM 元素的 class,来展示动画。
代码如下:foo.classList.add ('animate');
如果需要对动画使用回调函数,CSS 3 也定义了相应的事件。
代码如下:
el.addEventListener ("webkitTransitionEnd", transitionEnded);
el.addEventListener ("transitionend", transitionEnded);
十二、替代方案
由于 jQuery 体积过大,替代方案层出不穷。
其中,最有名的是 zepto.js。它的设计目标是以最小的体积,做到最大兼容 jQuery 的 API。zepto.js 1.0 版的原始大小是 55KB,优化后是 29KB,gzip 压缩后为 10KB。
如果不求最大兼容,只希望模拟 jQuery 的基本功能,那么,min.js 优化后只有 200 字节,而 dolla 优化后是 1.7KB。
此外,jQuery 本身采用模块设计,可以只选择使用自己需要的模块。具体做法参见它的 GitHub 网站,或者使用专用的 Web 界面。
十三、参考链接
- Remy Sharp,I know jQuery. Now what?
- Hemanth.HM,Power of Vanilla JS
- Burke Holland,5 Things You Should Stop Doing With jQuery
(完)
怎么做网站啊?
如何创建网页?如何创建网页?制作一个完整的网页有什么步骤吗? 首先,定义网页的主题。 网页的影响力是整个企业,所以在网页建设之前一定要确定网页建设的主题。例如,需要制作的网页是用于宣传企业形象、推广企业产品或面向服务的网页。不同的需求对应不同的网页主题和不同的网页功能。如果不想漫无目的的建网站,又想保证...
躺着用脚向前一蹬就跳起来站起,不用手,怎么练,
鲤鱼打挺。臂力,腰力。最最主要两个动作。1仰卧起坐(这个简单不解释)2平爬下。抬头脸视前方,双手包头,猛地同时,后腿向后屈起抬起,同时上半身利用背部肌肉挺起离开地面。多练这两个动作吧
太空中氧气从何而来?空间站每天要消耗1650升氧气,为何用不完?
据统计,成年人每天大概需要呼吸三万多次,那么三个人在太空一天就需要消耗1650L氧气,半年至少需要30万升。空间站距离地球大约有400公里,也不具备返回地球的能力,每个火箭都是有限重的,根本不可能携带大量的氧气和水上去,氧气如此稀薄,三名航天员怎么能进行长期的工作跟生活,面对大家的一系列疑问,...
国际空间站的氧气是怎么来的?为什么一直都用不完?
不过空间站里面的水不能够完全用于制造氧气,因为宇航员的日常生活和工作也需要用到水,所以,水是非常珍贵的资源,必须要有效的循环利用,所以在太空中宇航员所采用的方法就是废水回收,将宇航员在生活和工作中所产生的废水收集起来,也有一些排放在空气中的水蒸气,通过冷凝的方式来收集。水的循环利用与...
西安北高铁转车需要出站吗?不需出站具体怎么做?
不需要出站,直接站内转车,下车之后有专门的换车通道,你可以询问下当地的乘务员或站内服务员。20分钟速度快点,完全可以。西安北站(Xi'anbei Railway Station)位于中国陕西省西安市未央区,为特等站,隶属于中国铁路西安局集团有限公司,于2008年9月19日开工建设,2011年1月11日投入使用。西安北站...
一个人不敢坐火车怎么办,没一个人坐过,火车站那么大,怕找不到,唉...
1、到达火车票上面的火车站,到了火车站之后,找到火车站的进站口,进站的时候工作人员需要扫描乘客的身份证或火车票,把身份证和车票给她。2、验票之后进行安检,所有身上的不管小包大包全部需要过安检,将自己的背包行李放入传送带,扫描成功后就可以进站了。3、进站后先的列车的候车室,车站里的屏幕...
基站里为什么不用路由器
目前国内4G基站大约是400多万个,5G基站大约建600万个就差不多了,可见并不是严格的按照300米一个站来建的。二、WIFI再怎么样也传不了300米目前WIFI的使用场景主要是在家中,家里牵了宽带,然后用WIFI来供手机、电脑等上网,实际距离并没有300米,同时WIFI的穿墙效果也不好,将WIFI放到基站中,技术上来讲,似乎也行...
QQ邮箱中转站容量不足如何解决?
QQ邮箱中转站容量不足的解决办法包括以下几个步骤:1. 清理中转站文件:定期检查中转站,删除不必要的文件。这有助于释放空间,解决容量不足的问题。2. 删除已发送邮件:在QQ邮箱中,可以找到已发送的邮件并删除它们。这些邮件会占用中转站的容量,删除后可以释放空间。3. 升级中转站容量:如果上述方法...
如何上台演讲不紧张?
通过训练彻底完成从不敢讲话到讲话 自信从容的表达的转变。 2、如何快速掌握当众讲话的基 本规范 站有站相,坐有坐相,走有走相 ,举手投足,自然、适度、得体大方; 目光表情丰富多彩,感染力超强;声音 的规范,声音的洪亮度和清晰度,讲 话的节奏和抑扬顿挫;上台、开台、谢 台和退场合乎规范,28个细节体现出 ...
有没有不下三滥的工作,就是不用看别人脸色的,你站了那里别人去找你
只是说怎么个分量而已。 如果想活的潇洒点就自己先忍气吞声去创业,熬出头了就好了 不用受人管的工作?不用看领导脸色的工作? 我觉得应该没有,因为工作是为了赚钱,钱在别人手里的时候,你觉得可以完全做到吗?换个心态也许开心一点吧. 做什么工作不用看别人脸色吃饭? 做什么工作都要直接或间接看别人脸色吃饭的 ...
戊阁健胃: 可能原因如下1、门户网站早在jquery诞生之前就有了自己一套js系统,如果强行更换的话,成本开销不小.2、jquery应该是首选的web前端js框架,而国内门户网站的项目往往不是很多,对jquery的需求也相对较少.3、Jquery的体积日益庞大,现在的1.62版本不压缩的话已经达到了90k,对于高流量的门户网站来说,1K的大小对于他们来说都是意味着昂贵的服务器带宽费用成本.4、Jquery面向DOM的思想和门户网站使用的oop思想有冲突,故门户对jquery不怎么感冒
克什克腾旗13222938002: 有必要用JQuery来做页面吗? - ?
戊阁健胃: 1、任何只要配置一下就能用的东西必定是高封装,集成好的了,你觉得jquery做级联慢,是因为你没有包装好,没有包装成插件的形式.事实上jquery最大的优势就是插件很好,易于开发.2、什么东西都只要配置一下就行的,那还要编程人员做什么,那是学用软件,而不是开发软件,自己写插件.dorado封装度高,那么就不灵活,什么东西都有利有弊3、jquery版本更新快,功能完美,插件很多,前途真的很不错.
克什克腾旗13222938002: 图片轮播不用jQuery怎么做 - ?
戊阁健胃: 用原生JS代码啊我举个例子吧 <!DOCTYPE html> <html lang="zh-cn"> <head><meta charset="UTF-8"><title>Document</title> </head> <body><img src="/i/eg_cute.gif" id="img" alt="" > <script typt="text/javascript">var curr...
克什克腾旗13222938002: 如何禁用jquery mobile自动添加样式,不用jquery mobile的css样式,但JQM老是自动添加一些class="x"?
戊阁健胃: 你不引用jquery.mobile.css 就行,这个是添加默认css的,同时你将html中默认的那些class=“x”去掉,加上自己的样式就行了.
克什克腾旗13222938002: 如何在没有 jQuery 的情况下使用 Bootstrap 组件 - ?
戊阁健胃: 下面我在这里简单的介绍下Bootstrap框架.Bootstrap框架属于UI框架,这个和jQuery不太一样,其实准确的描述Bootstrap框架属于css框架而非javascript框架,但是它本身也使用javascript来完善Bootstrap框架的视觉效果.此外,Bootstrap框架...
克什克腾旗13222938002: 如何去掉jquery - dad插件默认添加上来的占位符啊? - ?
戊阁健胃: 1.引入过多的jquery插件:(1)如果你是放在不同的文件中引用有可能增加页面打开时http请求的数量,(2)如果是放到同一个js文件里面理论上来说是会增加浏览器下载的网页资源的时间,但是整体来说影响不会比(1)明显.(3)当然你完全...
克什克腾旗13222938002: 如何将Pjax整合进网站,实现全站无刷新加载 - ?
戊阁健胃: 最简单的一种方式是,能过JQuery来实现:例:$.ajax({ url:"a.aspx?a=123",type:"post",success:function(data){ } }); Ajax的原理就是:通过javascript的方式,将前台数据通过xmlhttp对象传递到后台,后台在接收到请求后,将需要的结果,再...
克什克腾旗13222938002: 如何用js过渡网页 - ?
戊阁健胃: 网页元素一个一个删除,然后一个一个载入新网页的元素,这样子网页在过度过程中会出现变形和抖动.比较好的办法是把老网页和新网页的元素分别放置到一个层里,开始是现实老网页层,新网页层display设为none,不显示. 过度时使用新网页层盖住老网页层,过度效果就是新网页层盖住老网页层的过程效果.效果可以百度一下.当新网页层完全盖住老网页层时,把老网页层(这是页个元素)删除就可以了.
克什克腾旗13222938002: 如果不是专门去做网页界面设计,有必要学jQuery ui插件吗 - ?
戊阁健胃: 如果是从找工作的角度来说,个人感觉这个看能力和公司规模吧,在大型公司,网站一般都是三部分,设计师出效果图,前端工程师负责将效果图做成页面、做特效等等,然后就是像.net、php等程序员处理数据逻辑等等.这三个方面都有专门的岗位,需要较高的专业技能.如果设计方面不是很出色,就学点儿脚本方面的知识,比较好一些吧.小型的公司都希望员工是全能的,网站外包公司很多都要求美工设计图,做页面效果的.如果你了解一种jQuery插件的用法,那其他的都差不多
克什克腾旗13222938002: 网站必须要JS框架吗代码吗,不用js框架,只用源码可以吗. - ?
戊阁健胃: 可以,js 框架只是封装了很多方法,你完全可以自己使用原生js来实现的