jquery美元背后的一点小技巧

1、如
【菜科解读】
在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg') 的写法。
1、如何给一个id为casper的标签添加一个名为“world”的class
考虑下面一个场景,假设我们页面上有个id为casper的div标签,如下所示
casper是个大傻瓜,啦啦啦啦啦现在我们想要给它添加一个class,比如“world”,用jquery的话如何实现?很简单,不卖关子
$('#casper').addClass('world');很好,接下来我们思考:如何不用jquery,我们如何如何实现实现上述功能?最简单的方式:
var node = document.getElementById('casper');node.className += ' world';getElementById、getElementsByTagName神马的,名字老长老长的,写着有点不爽,于是把getElementById这个方法用美元($)包装下:
function $(id){ return document.getElementById(id);$('casper').className += ' world';className品字符串神马的,jquery的调用方式相比麻烦多了,那再改进下:
function $(id){
var node = document.getElementById(id); node.addClass = function(addName){ node.className += ' ' + addName; return document.getElementById(id);$('casper').addClass('world');看上去挺像那么一回事了,多优雅的接口啊(热泪盈眶中)~
真的是这样吗,再仔细瞧瞧?于是果断发现不对劲的地方:对于$,每次调用,都会给返回的dom元素上添加一个addClass方法,这对空间来说是极大的浪费。
当然,可以将addClass方法抽取出来:
function addClass(className){
//实现略function $(id){ var node = document.getElementById(id); node.addClass = addClass; return document.getElementById(id);$('casper').addClass('world');原先的空间浪费问题可以在很大程度上得到解决,但明显这解决方法还不够好。
如果有那么一种实现方式,让所有的对象实例都共享一个方法。
。
。
2、jQuery中的实现思路
同样不必卖关子,这里说的就是原型方法,我们再看下jquery的调用方式
$('#casper').addClass('world');$('#casper')并不是像我们上面那样,简单地将id为casper的元素返回。
实际上,$('#casper')返回的是一个jQuery对象,该对象特征如下:
拥有一个length属性,length等于你调用$选中的元素的数目,在$('#casper')中为1
拥有0~n-1的实例属性,分别对应调用$时选中的第1~第n个元素,如本例中$('#casper')[0]即为目标dom元素
拥有一堆原型方法,如常见的addClass、removeClass、bind等
根据上面三点,很容易对我们之前写的代码进行修改,如下:
function $(id){
this[0] = document.getElementById(id); this.length = 1;$.prototype.addClass = function(className){ this[0].className += ' ' + className;var noode = new $('casper');node.addClass('world');其实就几行代码的事情,但。
。
。
还是觉得有些不对劲,new $('casper'),平常在用jquery的时候似乎不需要new一下的说,想想看,我们代码中一坨new是多么可怕的事情~
好吧,其实是因为jQuery帮你完成了构造函数调用的这部分工作,这一小小的细节改善对jQuery的流行起到了很大的帮助。
按照这个思路,继续修改之前的代码:
function $(id){
if(!(this instanceof $) return new $(id); //加了这么个语句 this[0] = document.getElementById(id); this.length = 1;//其他一样,节省空间不贴代码在上面的代码中,只有一点小小的修改,就是加了个判断语句 if(!(this instanceof $)) ,作用在于判断,当$被调用时,究竟是采用以下两种调用方式的哪一种,关于这种判断方式,可参考之前写的《【经验总结】构造函数的强制调用》:
$('casper'),直接调用,于是this为window
new $('casper'),此时$为构造方法,this instanceof $ == true
3、jQuery中的源码实现以及问题所在(俺的疑惑)
罗嗦了这么多,我们看看关于这点,jQuery里是如何实现的,源码大致如下,一些不相干的代码略过:
(function( window, undefined ) {
//去掉无关变量声明等,防止干扰分析var jQuery = (function() { // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); //一堆无关细节暂时略过 jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { //继续略过 // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; return jQuery;})();window.jQuery = window.$ = jQuery;})( window );对于研究过jQuery源码或曾经打算研究jQuery源码的同学来说,上面这段代码肯定不会陌生,它有一个特点:看上去比较晦涩,特别是是结合了jQuery源码里面比较诡异的代码缩进~
通过闭包返回的jQuery对象,闭包里面是有jQuery函数定义,jQuery函数里面return了new jQuery.fn.init 。
。
。
快速看懂上面这段代码的秘诀在于:一个支持代码高亮和职能中括号匹配的编辑器,比如webstorm。
。
。
上面只是开个小玩笑,绕了这么久,无法是想做下面几件事情:
无论有没有new,只要调用$,都给你返回一个jQuery对象(实际上jQuery.fn.init才是实际的构造函数)
将jQuery.fn.init.fn指向jQuery.prototype,这样的话,当我们通过$.fn.newPrototypeAttr 方式向jQuery添加原型属性或方法,其实最终都成为了jQuery.fn.init地原型属性或方法
将constructor属性指向jQuery,不然$('#casper').constructor 获得的会是jQuery.fn.init
个人觉得上面这段代码有些费解,似乎完全可以采用相对不那么曲折的方式实现,如下所示,其实思路都是相同的:
然后,就是添加各种原型方法了,兼容性处理和优雅的API,这块才是精华,这里还没讲到。
(function(){
var jQuery = function(id){ return new _jquery(id); var _jquery = function(id){ //此处各种选择分支神马的都忽略~ this[0] = document.getElementById(id); this.length = 1; jQuery.fn = jQuery.prototype = { constructor: jQuery, addClass: function(className){ this[0].className += ' ' + className; _jquery.prototype = jQuery.fn; window.$ = window.jQuery = jQuery;})(); jquery,美元,背,后的,一点,小,技巧,在,Jquer人类一直无法解释的四大谜团,谜团背后不知道的事?
尽管有很多技术的支持使得我们解决了很多不同层次的问题,但仍旧有很多谜团在一直阻挠着我们探索的脚步,似乎这些谜团背后有股神秘的力量在阻碍我们,今天小编就带大家来看看有哪些文明至今都是人类到现在都还没有办法解释的。
一丶管眼鱼之谜海洋深处一直是人类还未探寻到的地方,在海洋深处还有很多秘密正等待着人们一个一个解开,可现在人类的设备还不能往海洋的深处探究,在海洋深处存在太多其它的因素了。
曾经就有过科学家们在仪器上捕捉到一种长相奇特的鱼,这个鱼的管状的眼睛可以发现深海中的光,但是这眼睛只能往前看,但是它的大脑却是透明的。
就在前些年的时候,科学家们有幸对这种鱼进行了更深一步的考察,发现这种鱼的头部之所以是透明的,是因为它这样就能够透过透明的脑袋,进行全视野的观察,这样就能在深海中有光线的地方捕捉到食物,但是当科学家们想进一步对这种鱼进行研究的时候,却不能把这鱼打捞上来,带回实验室中,因为深海鱼一旦捞出海面,必定是一具死尸,这种鱼到底还有什么秘密是人类所不知道的?二丶西班牙黄金船队之谜在十八世纪的时候,有一个船队是在西班牙历史上极为著名的船队,那时候人们都把这个船队称为黄金船队,因为这个船队中有大量的宝藏,但是在一次航海的过程中,被一艘英国的军舰所击沉,然后这艘船带着大量的宝藏沉入了深深的海底,英国曾多次派人下海捞那些宝藏,但是每次的收获少之又少,还有很多寻宝者也来这个海域进行寻宝,到底黄金船队中有多少宝藏,现在应该没人知道了吧。
三丶鬼手刀之谜这把刀是当时意大利的一名铁匠所建造的,当时他欠了很多的债,他没有办法就只能自己造了一把刀还给债主。
这把刀是用他妻子的右手做成刀柄,他儿子的胸腔中的肋骨做成刀刃,把自己的小腿做成了刀柄给债主。
几天之后债主像受到诅咒一般把自己的家人全烧死了,而且每转手到另一家人的手中,也会出现这样的情况。
四丶神秘铭文之谜在新墨西哥的一个偏远地方,有一个巨石上刻满了很多神秘的文字,这些文字似乎是很久时候的人们所创造的,现在已经没有人用这种文字的。
这个神秘的文字是一位考古学家所发现。
根据一番调查研究之后,专家们给出了一致的意见,认为这是古希伯来语版的十诫,让他们感到疑惑的是,那时候是谁在这里刻下了这些神秘的铭文。
现代的技术依旧很难把一些古时候人们的建筑物或是其它创造发明所研究透彻,可以说那时候的古人智慧和创造力真的是我们现代人所不能比拟的,不过随着技术的发展。
这些谜团很快就能被破解。
#p#分页标题#e#
天池的背后藏着多少你不知道的谜团探秘长白山天池
天池可以称之为一种神奇的自然景观,我有机会探访过中国不同地区的几个天池,心中留下的深刻印象久久难以磨灭,其中给我留下印象最深的是长白山天池。
美丽的长白山天池 鞠传江摄影曾经两次从北坡登临东北吉林省的长白山,一睹天池的风采。
第一次去正处盛夏季节,细雨沥沥,从山下望去天池所在的山顶被云雾包裹着,但是好奇心驱使着人们毫不犹豫地登山。
从山下停车场到山顶停车场有小车摆渡,熟练的司机在弯曲陡峭的山路上开得飞快,一不会就来到到山顶。
最后两百米需要沿着崎岖山路爬上去。
顺着湾曲的山路排着长队想看天池究竟,可山顶的流云急雾变幻莫测,蒙蒙浓雾几米之外就难以见人,只听着游客的呼喊声和耳旁的风声,却见不到天池的踪影,在无比失望就要与天池告别的时候,突然云层闪开了一条缝隙,也就几十米宽的缝隙,露出了山下的天池,翡翠绿一般的湖水就像一面镜子,反射着从云雾缝隙里射进来太阳的光芒。
只听游客们不约而同地大声叫喊着:哇!、露出来了!、太美了!可仅仅几分钟过后,浓重的云雾又一次将天池封闭起来。
我在人们的叹息声中下山了。
有人说,天池是长白山中的一位仙女,常常是隐秘在云雾之中的,夏天登山能够一睹天池风采的游客是不多的。
天池与蓝天白云形映成趣 鞠传江摄影再一次探访天池则是初秋,天高云淡,秋风气爽。
经过一个多小时的排队等候终于来到天池旁边。
天池的水比天还蓝,周围高耸的群山拥簇着一汪清水,碧绿的湖水闪着令人炫目的光芒,一团团白云挂在山头上仿佛给那些山头戴上了洁白的帽子,湖水没有一丝波纹,宛如明镜映照着蓝天和白云,真真是美如仙境,美得让你眼睛不敢眨动,让人震撼,甚至不敢相信是身临其境。
人们争相拍照留影,悬崖之上用铁索相拦,脚下是碧湖如镜,头上是白云如絮,湖面与天空相映不知哪是湖哪是天了。
长白山是一座休眠火山,火山口积水成湖,可谓是自然的神奇造化。
地质学家说,长白山脉形成的历史超过2500万年,火山不断喷发造就了千万大山,而60万年至8万年前之间的4次喷发格外猛烈,天池形成于大约20万年前的火山爆发,从长白山多层堆积的岩石和土层可以看出不同时期火山喷发的熔岩历史痕迹,所以专家说,长白山是研究东北地区火山爆发运动历史的天然博物馆。
长白山火山在明代万历年间和清代康熙年间均出现了规模不等的喷发,出现岩石迸发、灰云弥漫的现象。
时光流逝,火山熔岩动力衰减冷却休眠,泉水却从地心喷涌而出,形成这十余平方千米的迷人湖水,加上周围大山的雨水、雪水,使火山口湖泊成为总蓄水量达20.4亿立方米常年溢出的动态湖。
天池海拔2189.1米,南北长4.4公里,东西宽3.37公里。
平均水深204米,最深处达373米。
那里是中国最大的火山湖,也是世界上最深的高山湖泊。
天池湖水在湖西北部的天豁峰和龙门峰间的缺口飞泻而出,成为著名的长白瀑布,形成经久不衰的河流,叫通天河,也是松花江的源头。
瀑布从悬崖上腾跃而起,飞流直下,银龙翻滚,浪花四溅,水雾弥漫升腾,远远就可听瀑布奔泻汹涌的轰鸣声,光线角度合适的时候会形成壮美的彩虹,彩虹跨越峡谷,与黑褐色的背景山体组成了迷人的色彩空间。
人们感到不可思议的是天池悬在高山之巅,日夜喷泻不止湖水是从哪里来的?天池被16座山峰所环绕,海拔均在2500米以上。
那些山峰都有着威武豪迈的名字,南面有将军峰,西面有白云峰,东北有华盖峰,西南有卧虎峰,西北有龙门峰和观日峰。
这些山峰的名字颇能显现山的特点,也承载着与众多与名字相关联的神话传说。
在古代,长白山曾经是女真人和满族的发祥之地,古代典籍中也曾将天池描述为龙宫,并有神兽出没。
还有一神话传说,是说天池是天宫仙女的宝镜,因为仙女梳妆时慎掉落,落入长白大山之间,形成了美丽的天池湖。
这或许是古人对长白山和天池的美好寄托吧。
#p#分页标题#e#长白山天池周围火山爆发遗存 鞠传江摄影天池一词最早出现在《庄子.逍遥游》中,是指寓言中所说的海,也天有上仙界之池的寓意。
北魏时期的郦道元在《水经注》中开始来命名那些位于山原之上的湖泊。
之后典籍中记述或诗文中出现天池一词开始多起来了。
庞大的长白山脉,被誉为原始状况保存最好,物种最丰富,生态系统最完整的山地生态系统。
乘坐直升机可以一览长白山气势恢宏的风采,东北西南走向的山系层峦叠嶂,居高临下俯视这里的原始森林,苔原、草甸、湖泊、沼泽和河流,而天池就如同这一庞大山系的眼睛,显得格外明亮,空中看去别有一番情趣。
壮观的长白山瀑布 鞠传江摄影在通往天池的山脚下有长白温泉,泉水带着蒸腾的热气从岩石的缝隙中喷涌,在方圆1000多平方米的范围内,竟有数十个泉口。
这里的泉水温度从60℃至82℃之间,用温泉煮鸡蛋成为一道美食,鸡蛋在80多度的泉水中只要十多分钟就熟了,人们争相体验这种温泉煮蛋的美食。
由于泉水富含硫化物的缘故,泉水周围的青灰色火山岩也被凝固上了澄红色或翠绿色,冬天里的长白山天池显得色彩斑斓。
天池如同镶嵌在大山中的宝石,群山拥簇,气象万千。
这里的地理要素是固定的。
但是,风云却赋予了大山变幻莫测的秉性,四季更迭又使这里像一个调色板,从春的翠绿藏红,夏的深绿衬黄,秋的五彩斑斓,到冬的银装素裹,演绎着大自然多彩的美丽画卷。
因此,你什么时候去长白山看天池都会感到是一次美妙之旅。
机缘巧合,在我游历长白山天池不久也曾游过新疆天山的天池,就是那个在古代典籍中称为瑶池的地方,天山天池湖面海拔比长白山天池低了200多米。
尽管两个天池都为高山湖泊并有雪山环绕。
但是,景观和风格大不相同,长白山天池位于长白山火山锥体的顶部,周围的山峰不高,旅游者占据山顶俯瞰天池,视野开阔,只是长白山天池周围只有苔藓和浅草。
而天山天池湖滨及周围的大山被云杉覆盖,远处5000多米高的雪峰在湖中映出洁白的影子。
由于天山天池是远古冰川运动的产物,山崩、滑坡形成了堰塞湖,与长白山火山喷发的成因大不相同,天山天池更少了些神秘和奇特。
长白山瀑布美景 鞠传江摄影其实,在中国的甘肃、江西、浙江、四川、湖北等不少地区还有不少天池,只是没有长白山和天山天池的名声显赫罢了。
像内蒙古兴安盟的阿尔山天池群,也是由于火山喷发而成。
还有青海省循化撒拉族自治县东部的孟达森林植物自然保护区的天池。
位于浙江省临安市境内的东西天目山,两山峰巅各有一个天池。
如果有机会到这些天池游览也会是美事一桩。
撰稿:鞠传江