`
HeroXuan
  • 浏览: 79377 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

Mootools、jQuery比较,JQuery之多宗罪

阅读更多

看到很多人在讨论jQuery和Mootools,但是流于分析,理论,我来说说一些实际的体会吧。

首先摆明立场,我是倾向Mootools的,jQuery的很多东西让我觉得他只是名声在外,下面我会一一说明。

Prototype公布1.6的时候,我就开始在同时关注jQuery和MT。当时的MT没有jQuery出名,代码也没有jQ的精彩,但是当时他具备了一些很重要的特性,比如样式转换类的CSS,缓动类的Tween,还有很好的将两者结合的Effect类,并且在他的特效类里面,全部都和Effect类接口,使得你很容易的就创建一个活生生的widget。

MT另外一个重要的特点,是他传承了Propertyp框架的一些思想和方法,使得你能够很容易的调用MT已经封装好的类,尤其是1.2以后的Class类,可能实现上算不上精彩,但却很实用。

其实说实在的,做JS时间长的,无论那个是曾经让你多么的赏心悦目的优雅精致的一个框架,也总不自然的会咒骂两句,一些小Bug,自己动手改改也就算了,但有些很核心的东西,你怕是回天乏力,只好将就用吧!心里再把咒骂的句子重复若干遍、若干天,然后当碰到别人问,JS用啥好呢?他,他,脱口而出的还是他,然后你就会忘记自己曾经怎么样的痛苦。

还记得MT1.20Rc的时候,FormObj.toQueryString()的这个方法,没有填写值的input,他居然默认将其key也删除了。Google刚出Chrome的那时期,Mt又出状况了,当时国内一点资料都没有,我是把MT的论坛翻到底了,才找到那条解决办法。这不,到MT1.21了,Swiff类又不好使了,居然给每个new Swiff都默认设置了嵌入HTML流(就是设置Flash透明的那个属性),即使在你设置了其输出模式的条件下。好吧,小Bug总是能容忍的,不管怎么说,MT的代码思路清晰、泾渭分明,即使改,也好下手,而且改动不会很大,因为他标准化。

这时不得不列举两条jQuery的臭事,尤其是那个万恶的jQuery(),一切皆是jQuery的实例,所以都从jQuery开始(从唯物和唯心的角度讲,如果说MT是唯物的,jQ就是唯我的,唯我论其实就是一种唯心论)。有时候真的很不明白,jQuery('element')怎么就做得那么臭,尤其当我要取出一个jQuery('#elementId')的时候,竟然那么辛苦,那么龌龊,jQuery('#elementId')[0],哦my god,这是什么滴家伙?

也许有人会说,你偏心眼,对jQuery净用贬义词。也有人会说,瞧,这家伙献丑了吧?这都不懂,一切都是jQuery啊!

其实恰恰就是一切皆jQuery,才惹出了问题。首先,导致jQuery()出问题的根源在于,假如你要遍历一个数组,jQuery没有提供基于Array类的扩展,你必须jQuery([0, 1, 2, 3, 4]).each(...)。或者这么说吧,当全世界都是jQuery的时候,就会产生很多问题,就是这个jQuery实例是一个element呢?还是一个Array呢,还是一个Object呢,还是个啥啥啥啥呢?搞不清楚,搞不清楚就得拿出来问个究竟,结果就要jQuery()[0]。

在MT里面,有一系列的方法判断一个变量的引用值,究竟是exist呢,还是define呢,实在不行,干脆把它的type弄出来看看?不过我们的jQuery可是不管3721,尤其当if (!$obj)jQuery老哥会告诉你,yes it is....my god...当你尝试调用typeof 一个无情、冷漠的答案就是jQuery,yes it is....能体会我说的是什么?

这些都是jQuery中的陷阱,也许很多人会觉得用jQuery很容易上手,插件N多,要多少有多少,没有你搜不到,只有你想不到的。对于新人来说,这也无可厚非,尤其对于急于完成项目人来说。但不管项目大小,代码多少,每个过程的结束,你总会冷静沉思,我从这个过程里收获了什么?我个人以为,jQuery除了纵容一些不良习性以外,不会给你带来更多,关于JS的思考。

jQuery所谓插件其实不过浮云,jQuery源代码本身是精彩的,但你想动他一动,是不可以的。我曾经做个一些尝试,同样的sortAble,MT提供标准化的事件接口、标准化的options设置,哪怕你想修改其一些内部的东东,也没有问题,因为是标准化的,好改。jQuery就不能够了,且不说FP的代码本来就不那么好看,稍微改个什么地方,结果整个soatAble都垮了。老实话,饶是我这种动不动就写上千行JS的人,也受不了jQuery的这份折腾,真的很无语,他那拖动本身实现的就很小儿科(当然,1年多以前的光景),又碰不得,我还不只能作罢干休。

说着说着,又忍不住要说说jQuery那该死的Ajax。complete,success这些事情,都好像是Ajax这个东东凭空有的,当然,天马行空也不是不可以,但较之MT,jQuery的Ajax实现真的很小儿科。首先是有事件,Request类才具有事件的特征,事件实现了什么,事件什么时候激发。然后是Request.HTML,Request.JSON,之后是若干动态方法,和Element类的有机结合。整个流程下来,合情合理,而且你心里很明白,这样用起来也会很放心,因为出问题了,有根可循,有据可查。

我看jQuery的Ajax,一头烟雾,尤其是success和complete的参数还不是统一的,丫的像找抽一样,load方法,居然整整1年多过去了,还是那样的僵硬,死板。近期的某一个项目,我尝试利用jQuery的Ajax类封装一些高级的事件,可是我每次打开jQuery的源代码,都觉得没有什么统一的标准,可以一劳永逸的修改整个流程(这意味着,假如我修改了A和B两处,有可能A发生故障了,B需要重复的代码,或者B暂时没问题,我需要增加对B点的测试,以暴露出他是不是有问题,这是很郁闷很烦恼的)。最后我决定采取暴力封装的方法,比如有这么一段:

 

JavaScript代码
Mix.Ajax = function(option) {   
    // $(option.update)其实永远返回真   
    // 所以必须附加一条,$(option.update).length == 1,我当然不想要length > 1的jQuery实例   
    // 被传进来。   
    var update = (option.update && $(option.update) && $(option.update).length == 1) ? $(option.update) : null;   
    if (update) {   
        // 开始封装   
        // 先把用户调用complete和cancelUpdate的函数保存起来   
        var complete = option.complete, cancelUpdate = option.cancelUpdate;   
        // 伪装一个complete包   
        option.complete = function(request, status) {   
            // 终止update的条件   
            // cancelUpdate参数可能是一个函数,可能是一个变量值,   
            // 总之当cancelUpdate返回true就是中止update,就是$().load   
            if (cancelUpdate)   
                cancelUpdate = jQuery.isFunction(cancelUpdate) ? cancelUpdate.call(this, request, status, update) : cancelUpdate;   
            if (status == 'success' && !cancelUpdate) {   
                // 如果中止条件不为真   
                // 执行beforeUpdate的方法   
                if (jQuery.isFunction(option.beforeUpdate)) option.beforeUpdate.call(this, request, status, update);   
                if (!this.cancelUpdate) jQuery(update).html(request.responseText);   
                if (!this.cancelUpdate && jQuery.isFunction(option.afterUpdate)) option.afterUpdate.call(this, request, status, update);   
            }   
            // 最后才执行真正用户设定的那个complete的包   
            if (jQuery.isFunction(complete))   
                complete.call($, request, status);   
        }   
    }   
    option.async = true;   
    jQuery.ajax(option);   
}  

真的是一个丑陋的实现,不过好像只能望而兴叹吧。

还有一些很细节的地方,比如说jQuery是率先实现捕获批量对象的,但是他没有好好的发挥这个长处,比如一组批量元素setStyle,就必须要遍历这组元素。其实他是不敢,因为捕获回来的,可能是一个,可能是成群,你没法确定之后的所谓“链式操作”会不会把浏览器拖垮。又是jQuery()惹得祸。相反,由于MT很明确的区分$和$$,以及getElement和getElements的返回结果,你很清楚你所作的事情会导致什么什么结果。所以MT也不忌讳在$$('someProperty').setStyle()会对所有的捕获的元素批量设置样式。

同样的问题,蔓延在jQuery框架上下,比如bind,比如arrt。可是反观MT,由于一切都是标准,$$().addEvents(...),你可以冠冕堂皇的用而不会返回什么不必要的错误。

这一切的一切,导致到最后的结果就是,jQuery一无是处,而MT则能够真真正正的安全实现所谓“链式操作”,何况,他还不止一种链式操作的方式,通过chain可以真真正正实现上一个事件完成,下一个事件才开始。看官千万别说jQuery也有,这丫明抄的。

好了,叽叽歪歪的说三道四半天,给予那些还在彷徨做选择的人一点实际的感受,或者对于那些,真的在使用jQuery的人,请好好看清自己写的JS代码。

本文来自:青软培训(www.qingsoft.net)原文链接:http://www.qingsoft.net/bbs/html/article/1301.jhtml

分享到:
评论
1 楼 sunjunfeng3 2010-09-07  
还好我学一了年多的 jQuery  知道它的强大,不然又被这些妖言妖言惑众的人 吓走,你根本就没用熟悉Jquery
比如一组批量元素setStyle,就必须要遍历这组元素     这是什么话

相关推荐

    Mootools和JQuery的比较

    【Mootools和JQuery的比较】 Mootools和JQuery是两个著名的JavaScript库,它们在Web开发中被广泛用于简化DOM操作、事件处理、动画效果和Ajax交互。虽然两者都旨在提高前端开发效率,但它们的设计理念和实现方式存在...

    jQuery、Mootools、Prototype三大JavaScript框架中文手册

    然而,原生JavaScript的API庞大且不统一,为了简化开发,社区创造了一系列的框架,其中jQuery、MooTools和Prototype是三个非常著名的JavaScript库。这些框架提供了一致的接口,增强了DOM操作,简化了事件处理,并...

    四种时兴的框架jQuery,Mootools,Dojo,ExtJS的对比

    四种时兴的框架jQuery,Mootools,Dojo,ExtJS的对比

    jquery_mootools_date_plugn

    《jQuery与MooTools日期插件的融合应用》 在Web开发中,处理日期和时间是常见的需求,jQuery和MooTools作为JavaScript库,都提供了丰富的功能和插件来简化这一过程。本篇文章将深入探讨名为"jquery_mootools_date_...

    四种流行的AJAX框架jQuery_Mootools_Dojo_ExtJS的对比

    ### 四种流行的AJAX框架对比分析:jQuery, Mootools, Dojo, ExtJS #### 一、jQuery **主页**: <http://jquery.com/> **设计思想**: - **简洁性**: 几乎所有操作都始于选择DOM元素,并对其进行操作(支持Chaining...

    最新Mootools.chm教程及jquery-1.2.6教程

    **Mootools与jQuery是两种流行的JavaScript库,它们极大地简化了网页动态效果的实现和DOM操作,提高了开发效率。** **Mootools** Mootools是一个面向对象的JavaScript框架,以其模块化、高性能和对浏览器的广泛兼容...

    Prototype、JQuery和Mootools的概要图

    3. **链式调用**:jQuery的方法返回jQuery对象,使得多个操作可以连续执行,提高了代码的可读性。 4. **动画效果**:jQuery内置了多种动画效果,如`.fadeIn()`, `.slideUp()`, `.animate()`等,为网页增加动态效果。...

    表单验证及jquery mootools解决方案

    `jQuery`和`MooTools`都是流行的JavaScript库,它们提供了丰富的功能,包括方便的表单验证。本文将深入探讨表单验证的概念,以及如何使用`jQuery`和`MooTools`来实现这一功能。 首先,让我们理解表单验证的基本概念...

    jquery,mootools,ext3,prototype对class选择符速度比较

    标题中的"jquery,mootools,ext3,prototype对class选择符速度比较"指的是对四个流行的JavaScript库——jQuery、MooTools、EXT3和Prototype——在处理CSS类选择器时的性能进行的比较测试。这些库在Web开发中广泛用于...

    MooTools1.4中文PDF手册+MooTools-Core-1.5.1.js

    - **与其他库的关系**:MooTools与jQuery、Prototype等其他JavaScript库在功能上有许多相似之处,但MooTools更注重代码的组织结构和可维护性。 - **互操作性**:MooTools允许在项目中与其他库共存,通过NoConflict...

    mootools.js插件 1.4.5 core下载.zip

    mootools.js可以生成较为复杂的、动态的网页交互效果,和jquery一样强大。。Mootools从Prototype.js中汲取了许多有益的设计理念,语法也和其极其类似。但它提供的功能要比Prototype.js多,整体设计 也比Prototype.js...

    300+Jquery, CSS, MooTools 和 JS的导航菜单

    标题 "300+Jquery, CSS, MooTools 和 JS的导航菜单" 涵盖了四个关键领域:jQuery、CSS、MooTools以及JavaScript,这些都是网页开发中的核心技术。这些技术用于创建动态、交互式的网站导航菜单,为用户提供更丰富的...

    ecshop解决jquery冲突js

    然而,在实际应用中,由于各种第三方插件和库的引入,可能会出现JavaScript库之间的冲突,尤其是当JQuery与其他使用$符号作为主要作用域的库(如Prototype或MooTools)同时存在时。标题中的"ecshop解决jquery冲突js...

    15天学会jquery(完整版)

    jQuery之所以备受青睐,原因在于其简洁的语法、丰富的插件生态以及广泛的社区支持。相较于其他JavaScript库,如Prototype或MooTools,jQuery提供了更直观、更易于理解的API,使得开发者能够以最少的代码量实现复杂的...

    web基于jquery拓扑图生成插件 jquery.jsPlumb-1.4.0-all.rar

    jsPlumb是一个强大的JavaScript连线库,它可以将html中的元素用箭头、曲线、直线等连接起来,...它同时支持jQuery+jQuery UI、MooTools和YUI3这三个JavaScript框架,十分强大。大家可以在官网的Demo中看看它的功能。

    JavaScript libraries--->jQuery, Prototype, Mootools, YUI, Extjs, Dojo

    在给定的标题"JavaScript libraries--->jQuery, Prototype, Mootools, YUI, Extjs, Dojo"中,提到了五种著名的JavaScript库:jQuery、Prototype、Mootools、YUI和ExtJS。这些库都有各自的特性和优势,下面将详细介绍...

    Jquery1.2.6源码分析教程

    在这个教程中,我们将探讨 jQuery 的核心机制,以及它为何能与其他 JavaScript 库如 Prototype、YUI 和 Mootools 相比,在性能上表现出色。 **一、jQuery 的核心概念** 1. **选择器引擎(Sizzle)**:jQuery 的...

    JQuery入门,JQuery总结

    jQuery的核心理念是"write less, do more",即用更少的代码实现更多的功能。 **jQuery环境配置** 要开始使用jQuery,首先需要在HTML文件的`<head>`部分引入jQuery库的文件。可以从jQuery官方网站下载最新版本,但...

Global site tag (gtag.js) - Google Analytics