`
yangwencan2002
  • 浏览: 37144 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

还说网易旗下免费邮(163、126、Yeah.net)的js代码

    博客分类:
  • Js
阅读更多

      经过大致浏览163免费邮(126、Yeah.net和163用的js其实大致一样,只是页面和css不一样)的核心js后(该文章有个上下文,请看我之前的几篇文章),个人感觉其js写法还存在改善的空间。所以本文试图从个人的理解角度(本文只是试图要改善其js写法,并不是站在设计得更好的角度,所以有些想法依然沿袭其做法,也许还存在更好的做法),用prototype库来重构163免费邮的核心js,具体函数细节并不予实现,待日后再抽出时间,将其中常用的功能模块重构成组件(已实现部分),有兴趣的同学再保持关注哦:)

      在这之前,试想,如果你是网易163免费邮的js设计者,如此UI的用户体验,你会怎么来组织和架构你的js呢?从OOP的角度来想,应该是先把系统分好模块,然后各个模块至少独立出一个类来管理这个模块。网易的js设计者是这样来划分这个系统的模块:文件夹管理模块(操作对象为收件箱、草稿箱等,如对他们进行清空、重命名等操作)、文件夹模块(和前一模块的区别在于操作对象是文件夹下的邮件条目,其主要职责为对该文件夹下的条目进行管理。 主要包含对其邮件条目的操作有:删除、移动、收藏、状态设置、标签等)、欢迎模块(即登陆邮箱后的第一界面具有的功能管理)、阅读界面模块(主要包含阅读邮件时的一系列操作)、发送界面模块(主要包含撰写邮件时的一系列操作)、外部链接模块(主要对应于左边邮件服务栏目的超链接等)、通讯录模块等。

      网易js设计者把以上所有模块都统一放置于mainmodule.js(这种做法实在是不太可能,可能是我推测错误?!),个人觉得这样明显不合理,建议把其按各个模块进行拆分,独自命名一个js文件,如Folder.js、FolderMain.js等,方便维护,避免冗长,尽管有人建议减少js文件有利于节省带宽。详细请见js附件(Compose.js、Folder.js、FolderMain.js、OutLink.js、Read.js、Send.js、Welcome.js)。既然这么多个模块都是在右下角进行切换,是不是可以考虑做个类似模块管理者来对这些模块进行管理呢,比如切换等,而且这些模块肯定具有某些公共特性,所以我建议为各个模块增加一个父类。所以,如果是我,我会增加2个类——BaseModule和ModuleManager。详见附件(BaseModule.js、ModuleManager.js)。

      另外,engine.js也是太过于臃肿,建议分出这样几个类——CommonControl.js(工具类)、CoremailManager.js(核心邮件管理者,建议可以把getCMData方法移到工具类)、GlobeEngine.js(全局发动机,所有全部的变量都保存到该类中)、HistoryManager.js(暂时没研究,貌似为了回退按钮服务),然后最后在这样来调用你的js:

document.observe('dom:loaded', function() {
	window.CC = new CommonControl();
	window.CM = new CoremailManager();
	window.GE = new GlobeEngine();
	window.HM = new HistoryManager();
	window.MM = new ModuleManager();
	/**
	 * 将各个模块注册到模块管理者
	 */
	MM.registModule("folderMain", new FolderMain());
	MM.registModule("folder", new Folder());
	MM.registModule("read", new Read());
	MM.registModule("send", new Send());
	MM.registModule("outLink", new OutLink());
	MM.registModule("compose", new Compose());
	MM.registModule("welcome", new Welcome());
	// 之后便如是调用compose对象——MM["compose"]或MM.compose
	});

当然,最后别忘记了prototype库的prototype.js。

以上,对整体js架构和组织提了自己的意见,有兴趣的可具体看附件的js。

      另外,大致看了一下其细节部分js的写法,我也提几个意见:

1.163免费邮右上角的“数据处理中,请稍后...”,即传说中经典的spinner,其代码的做法每做一次ajax请求操作都先调用show(),然后再调用hide(),如此甚是麻烦,应该在ajax请求的全局设置,代码类似:

Ajax.Responders.register({
	  onCreate: function() {
        if($('spinner') && Ajax.activeRequestCount>0)
          $('spinner').show();
        },
	  onComplete: function() {
        if($('spinner') && Ajax.activeRequestCount==0)
          $('spinner').hide();	  
        }
	});

 即在ajax上注册全局的监听器,维护一个进度指示器的显示和隐藏,免去每个方法都可见对spinner的操作。

2.163免费邮页面上嵌入了一些事件的js,如onclick事件等,为了遵从不唐突的js优良传统做法,我们利用prototype里的事件注册处理器,将html代码与js尽可能地剥开,如document.observer("dom:loaded",start()),$("selectAll").observe("click",toggleAll)等。

3.163免费邮有自己的封装库engine.js,但其中心思想还是在模仿prototype(其源代码中模仿prototype清晰可见),但是又没有模仿到家,一些prototype非常有用而简易的api没有模仿到,所以,这里建议,既然要模仿,但又做得不比prototype好,那为什么不直接用prototype呢?比如文件夹收件箱中checkbox的全选操作,如果借助于prototype,代码将大大减少,如:

//勾选操作
function toggleAll(event,isChecked){
event.stop();
$("table").select("input[type=checkbox]").each(function(checkbox){
checkbox.checked = isChecked;
});
}
//全选按钮
$("selectAll").observe("click",toggleAll.bindAsEventListener(this,true));
//去全选按钮
$("deselectAll").observe("click",toggleAll.bindAsEventListener(this,false));

 借助于prototype强大的select函数,根据css选择器来获取元素(当然,其他框架也有类似api,比如jquery,这里并不是要比较prototype好,还是jquery)。而我163中的js看到了比以上代码还要长得多的代码却也只实现同样的功能。

4.163免费邮主界面除了上部和左部是静态的html,右下角的模块,其hmtl都是在js中动态生成的。所以在js中会看到很长的html拼凑,我想163免费邮的同学当时调试维护肯定花了不少时间吧?呵呵,就像动态拼凑sql语句那样,如果够长沟复杂,的确很容易出错和难维护。而且我发现其拼凑的html的格式有些是几乎一样的,只是数据不一样。所以建议可以考虑一下prototype的template,其主要思想是定义个html模板,然后给这个模板动态赋值,填充数据,肯定可以省力不少。

5.发现网络带宽有限的情况下,进入邮箱速度比较慢,建议不妨尝试在js数据加载的能力方面进行一些改进(特别是之前的一个版本,进入通讯录时,默认把“所有联系人”这个组的数据加载进来,明显特别慢,还有,点击写信进入发送界面时,右边通讯录树显示慢)?个人觉得可以改进的一个点——当数据量大时,如果你需要遍历,那么用js的普通循环替代你们封装的迭代函数——Hashtable:each,即Hashtable对象中的each方法。普通循环代码类似:

var item;
for(var i = 0,len = data.length;i!=len;++i){
item = data[i];
//处理item
}

 首先,它在循环体外声明item变量,所以每次循环都没有分配和释放的开销;其次,它缓存了集合的长度,避免了在每次循环的时候再计算,第三,它使用了前置的++操作,避免了操作数的复制。

6.最后建议建立一个面向对象的体系,添加自己的Object.extend方法,尽管它不是必须的,但是它会让你的代码更加易懂。我在163免费邮的js中看到,Read对象对ModuleStatus的扩展是纯粹的方法复制(即为了实现Read继承于ModuleStatus,将ModuleStatus的方法全部复制一遍到Read对象中,当然,这和prototype做法是一样的)。如果能看到类似以下代码是不是会更加明了呢?

//Read对象继承于BaseModule
var Read = Class.create(BaseModule,{//具体实现...});

 7.163免费邮的js前台数据传入到后台的格式为 xml 格式,个人觉得解析xml相对json较为复杂, 建议采用json,忘记xml,目前无论是java还是其他比如grails都集成了方便的json解析库,非常方便变可获取到前台传入的数据对象,从而更加OO。

8.也许还有更多……

      最后,因为个人能力和见解有限,可能存在某些理解错误,毕竟是局外人。以上建议只代表个人意见,仅供大家谈笑,欢迎拍砖:)

分享到:
评论
4 楼 02221021 2009-06-03  
说的很好说的很好
3 楼 yangwencan2002 2009-05-19  
好像没啥反应,想咨询一下大家,是不是表达得太晦涩了,还是没啥兴趣呢?!
2 楼 yangwencan2002 2009-05-18  
冯冀川 写道
你看到的js是最后打包发布的,还是原始的代码?

pack过的,不过把它们还原出来了(当然,恢复不到原始代码),然后将还原出来的代码进行修改,弄成一山寨版(当然,业务完全不一样)。
1 楼 冯冀川 2009-05-18  
你看到的js是最后打包发布的,还是原始的代码?

相关推荐

    linux mint下使用外部SMTP(如网易yeah.net)发邮件.docx

    在Linux Mint系统中,使用外部SMTP服务器(例如网易的yeah.net)发送邮件的过程可能涉及到一些配置挑战,特别是对于默认的sendmail和postfix服务。如果你只是需要简单的邮件发送功能,而不是构建邮件服务器,那么...

    微时代网易邮箱(163yeah126)密码-密保批量修改软件 最新版 V3.3

    在现代信息技术领域,电子邮件服务是不可或缺的一部分,而网易邮箱作为国内知名的邮件服务商,提供163和126两个主流邮箱品牌。对于企业用户或个人大量管理邮箱账号时,密码和密保的安全与便捷修改至关重要。"微时代...

    微时代网易163yeah126邮箱密码密保批量全自动修改_V3.3 最新版

    总的来说,"微时代网易邮箱(163yeah126)密码-密保批量修改软件 最新版 V3.31.exe"是针对163和126邮箱用户的一款高效工具,旨在提升账户安全管理的便捷性和效率。然而,用户在使用这类工具时必须谨慎,确保软件的...

    网易闪电邮

    网易闪电邮是网易网络有限公司独家研发的...“超全面”—— 国内首个支持所有网易邮箱(163、126、yeah、188、vip)的客户端,同时支持pop3等协议,全面兼容所有网易邮箱和非网易邮箱,支持多帐号同步管理,方便易用。

    hotmail,Gmail,Yahoo,126,163,Yeah,QQ邮箱配置POP参数

    ### Hotmail, Gmail, Yahoo, 126, 163, Yeah, QQ 邮箱配置POP参数 #### 一、概述 在互联网时代,电子邮箱作为重要的通信工具之一,广泛应用于个人和企业之间。为了更好地管理和利用邮件资源,用户常常需要将不同...

    yeah页面js

    综上所述,“yeah页面js”涵盖了JavaScript在网页前端开发中的多种应用,特别是对于邮箱服务来说,JavaScript是构建动态、响应式用户界面不可或缺的技术。通过对提供的HTML和相关资源文件进行深入研究,我们可以学习...

    网易闪电邮,网易客户端软件

    支持多种邮箱平台的接入,包括网易163邮箱、126邮箱、Yeah.net邮箱等,同时也兼容其他主流的IMAP/POP3/SMTP邮箱服务。用户只需简单设置,就能将多个邮箱账号集中管理,大大减少了在不同邮箱之间切换的繁琐步骤。此外...

    Windows环境下32位汇编语言是一种全新的编程语言。

    本书作者罗云彬拥有十余年汇编语言编程经验,是汇编编程网站http://asm.yeah.net和汇编编程论坛http://win32asm.yeah.net的站长。本书是作者多年来编程工作的总结,适合于欲通过Win32汇编语言编写Windows程序的读者...

    spring.net 中文文档

    译者:郭鸿飞(delpher@yeah.net) Version 1.1 您可以创建本文档的副本留作自用或分发他人,但前提是不得收取任何费用,另外,不管是以印刷版还是以电子版形式分发本文档,请在每个副本中包含这条版权信息。 最近...

    同步文章到网易博客插件 for WordPress.zip

    WordPress同步文章到网易博客插件 支持功能 支持将Wordpress中文章链接发布到网易博客,并可选原文链接显示的位置。 不支持功能 不支持将Wordpress中私密(private)文章发布到网易博客。 PHPMailer 版...

    flashmail-2.0 网易闪电邮

    应用平台:Win7/Vista/WinXP/Win2000/ 网易闪电邮(FlashMail)是一款网易自主... (3)超全面:首个支持所有网易邮箱(163、126、yeah、188、vip)的客户端,同时支持pop3等协议。多个邮箱帐户同时管理,方便易用。

    用于发送邮件的工具-网易右键邮

    网易邮箱是中国知名的电子邮件服务提供商之一,提供免费且功能丰富的邮箱服务,包括163邮箱、126邮箱和Yeah.net邮箱等。注册过程相对简单,只需要访问网易邮箱的官方网站,按照提示填写必要的个人信息,如用户名、...

    易语言-网易邮箱(163/126/yeah)取件源码过滑块接口

    对于“易语言-网易邮箱(163/126/yeah)取件源码过滑块接口”这个主题,我们可以深入探讨以下几个重要知识点: 1. **易语言**: 易语言是一种中国本土开发的、面向对象的、支持组件化的编程语言,它强调易学易用,...

    计算工厂

    计算工厂里有许多功能,但有一个功能也许大家最不常用,那就是“自定义表达式功能”。为什么呢?就是因为大家没有公式可用。本来我想尽全力为大家提供尽量多的公式,但本人才疏学...我的主页:http://johnbill.yeah.net

    仿网易邮箱切换登录html代码

    这个项目旨在模仿网易邮箱的登录界面,实现用户可以通过左侧的选项卡在163邮箱、126邮箱和Yeah邮箱之间进行切换登录。 【HTML】是超文本标记语言,是构建网页的基础。在这个项目中,HTML用于定义页面结构,包括标题...

    常见邮件服务器(接收服务器和发送邮件服务器)地址.docx

    3. 网易163免费邮: 接收服务器:pop.163.com 发送服务器:smtp.163.com 4. 网易163VIP邮箱: 接收服务器:pop.vip.163.com 发送服务器:smtp.vip.163.com 5. 网易188财富邮: 接收服务器:pop.188.com 发送服务器...

    一键邮箱申请器v1.3

    软件作用是帮助你快速...支持网易三种邮箱@126,@163以及@yeah.net 软件内置邮箱管理功能,双击可快速登陆,申请的邮箱右导出,可删除, 小提示:在申请介面右下角,双击完整邮箱名即可完成邮箱登陆哦..省去填写密码的麻烦.

    字模提取(可用于汇编或C的点阵液晶取字模用)

    字模提取 看看What Is New In This ...我为自由软件撰稿人,现在挂单于龙啸九天的http://mcs51.yeah.net。 由于我邮件丢失,向我鼓励的网友姓名我已记不全了,向小磊、李锋及所有给我帮助的朋友致谢! HORSE2000

Global site tag (gtag.js) - Google Analytics