`
jianguang_qq
  • 浏览: 90838 次
  • 性别: Icon_minigender_1
  • 来自: 深圳南山
社区版块
存档分类
最新评论

【JS优化系列】一个通用公告系统的实现

阅读更多

       之前一篇《【JS优化系列】从一个计时器的写法探讨js多种实现方式的优劣》的讨论让我学到不少东西,现在再来一篇,抛砖引玉。

 

       站点的很多页面经常需要发一些公告,而每次发公告都需要开发同学手工来操作是很麻烦的,而且经常不够实时。因此写了一个通用公告系统,希望能将这份工作交由产品同学来操作。这里只写了“小黄条”一种形式的公告,其他形式实现方法类似。实现了可以“定时自动关闭”,“所有页面每次打开都显示小黄条”,“仅在第一次打开的页面显示一次”,“用户手动关闭后不再显示”功能。以此基本能满足日常运营需求。

      先将代码和实现方式贴出,邀请大家一起探讨优化。

 

/**
 * 通用公告系统
 * 
 * @package    pub_notice.js
 * @author     jessezhang <jianguang.qq@gmail.com>
 * @date       2009-08-15
 * @version    1.0.0
 */

var LIB = LIB || {};
LIB .pubNotice = (function(){
	
	var $id = function(id){return document.getElementById(id);}
	var $ = LIB ;
	
	/**
	 * 小黄条
	 * 	 
	 * @access public
	 * @param {json} json 小黄条属性
	 */
	function yellowTips(json){
		this._id = json["id"];
		this._text = json["text"];
		this._showType = json["showType"];
		this._timeout = json["timeout"];
		this._domId = "QQVIP_pubNotice_yellowTips_" + json["id"];
		this._timer = null;
	}
	
	yellowTips.prototype = (function(){	
									 
		/**
		 * create一个小黄条
		 * 
		 * @access public
		 */	 				 
		function create(){	
			if(!_checkShowType.call(this))return ;
			//container标签为必须,诺没有container,则不显示小黄条						
			if(!$id("container"))return;
			
			var _nBox = document.createElement("div");
			_nBox.id = this._domId;
			_nBox.className = "bulletin";
			_nBox.innerHTML = "<button type=\"button\" class=\"bt_close_bulletin\" title=\"关闭\" onclick=\"javascript:document.getElementById('"+this._domId +"').style.display='none';QQVIP.cookie.set('" + this._domId + "', '2');\">X</button>" + this._text;
			document.body.insertBefore(_nBox,$id("container"));
			this._timeout && this.hide(this._timeout);
			$.cookie.set(this._domId,"1");//1:表示已经显示过该小黄条
		}
		
		/**
		 * 显示小黄条
		 * 
		 * @access public
		 */	 
		function show(){
			$id(this.domId).style.display = "";
		}
		
		/**
		 * 隐藏小黄条的接口
		 * 
		 * @access public
		 */		
		function hide() {
			var _this = this;
			if (this._timeout) {
				this._timer && clearTimeout(this._timer);
				this._timer = setTimeout(function(){_hide.call(_this);}, this._timeout);
			} else {
				_hide.call(_this);
			}
		}
		
		/**
		 * 内部实现隐藏小黄条
		 * 
		 * @access private
		 */	
		function _hide(){
			this._timer && clearTimeout(this._timer);
			$id(this._domId).style.display = "none";
		}	
		
		/**
		 * showType : 显示方式
		 * 1:所有页面每次打开都显示
		 * 2:只在第一次打开的页面显示一次
		 * 3:用户手动关闭后不显示
		 *
		 * cookieValue : cookie存储的状态
		 * 1:已经显示过
		 * 2:用户手动关闭
		 */	
		function _checkShowType(){
			if(this._showType == "1") return true;
			var cookieValue = $.cookie.get(this._domId);
			return (this._showType == "2" && cookieValue != "1" && cookieValue != "2") || (this._showType == "3" && cookieValue != "2");
		}
		
		return {
			create : create, 
			show : show, 
			hide : hide
		}		
	})()
	
	/**
	 * 浮出层,建设中...
	 * 
	 */
	function floatLayer(obj){}
	
	/**
	 * 弹出窗口,建设中...
	 * 
	 */
	function openWindow(obj){}
	
	/**
	 * 将设置的url转化成验证页面地址的正则表达式
	 * 
	 * @access private
	 * @param {istring} url 设置的url
	 * @return {RegExp} 验证页面地址的正则表达式
	 */
	 
	function _regURL(url){
		if (/^\^/.test(url)) {
			//以符号"^"开头的url都看成本身已经是正则表达式的形式了,不需要再处理
			return new RegExp(url);
		} else {
			//不是以符号"^"开头的url都需要处理成正则表达式的形式,
			//主要对符号"/"和index.html、index.htm、index.php进行处理,		
			//使得"http://vip.lib.com/index.html"、"http://vip.lib.com/"都可以被正确识别
			var RegStr = url.replace(/(^[\w-:\/\.]*).*/, function($0, $1){
				var ret = $1.replace(/\//g, "\/").replace(/\?/g, "\?");			
				var reg = new RegExp("(index.html|index.htm|index.php)$");
				if (reg.test($1)) {
					ret = ret.replace(reg, function(a,b){
						return 	"(("+b+")+|$|\\?|\\#)";						  
					});
				} else {
					ret = $1+"((index.html|index.htm|index.php)+|$|\\?|\\#)";
				}
				return ret;
			});
			return new RegExp(RegStr);
		}
	}
	
	/**
	 * 判断当前页面的url是否符合要求
	 * 
	 * @access public
	 * @param {istring} str 设置的验证url的字符串
	 */
	function checkUrl(str){
		var loaction = window.location;
		str = str.replace(/^\||\|$/g,"");
		var urls = str.split("|");
		for(var j=0; j<urls.length; j++){
			if(_regURL(urls[j]).test(loaction)){			
				return true;
			}
		}
		return false;
	}
		 
	return {
		yellowTips : yellowTips,
		floatLayer : floatLayer,
		openWindow : openWindow,
		checkUrl : checkUrl
	};
})();

 (function(){
	var yellowTips = [
		{id:1, url:'^http://vip.LIB .com/|', text:'<strong>LIB 宣:</strong><p>这是世界上最强大的紧急公告系统!</p>', showType:1, timeout:3*1000},
		{id:2, url:'http://vip.LIB .com/mall/mall.php|http://vip.LIB .com/freedom_act/act.html|http://vip.LIB .com/my_status/my_status_index.php', text:'<strong>LIB 专区问题</strong><p>LIB 专区问题</p>', showType:2, timeout:0*1000},
		{id:3, url:'http://vip.LIB .com/qq.html|http://vip.LIB .com/life.html|', text:'<strong>[LIB ]</strong><p>LIB 频道,生活公告ffff</p>', showType:3, timeout:0*1000}
	]
	for(var i=0; i<yellowTips.length; i++){
		if(LIB.pubNotice.checkUrl(yellowTips[i]["url"])){
			new LIB.pubNotice.yellowTips(yellowTips[i]).create();
		}
	}
})()

      目前的实现方式是,所有页面都在自身加载完成之后去加载这段代码。代码会通过页面的url来判断是否显示公告,以及显示哪几条公告。而设置的时候有两种方式,一种是输入特定页面的完全url,另一种是通过正则来匹配。在本实现中以传入的url是否以“^”符号其起始来判断是否当正则来处理(这种方式好坏大家可以一起探讨),如“^http://vip.lib.com/”表示发布到vip.lib.com域名下的所有页面,“http://vip.lib.com/”或者“http://vip.lib.com/index.html”表示仅仅发布到lib首页一个页面。

      这里的代码将由管理后台生成,若没有没有公告,则所有代码为空,以节省流量。

      在本例中应该有很多地方可以优化的,希望大家一起探讨优化。比如_regURL()这个函数的实现,我并没有做很多的考虑,肯定有很多可以优化的地方。还有实现方式上也有很多地方值得探讨,比如这样做所有页面都多了个请求,所有页面都会引入所有的公告内容,这样实现是否是最好的。代码是由管理后台生成的,那么产品同学输入内容的,在后台输出的时候是不是需要过滤处理那些特殊字符,等等。。。还有很多其他需要周全考虑的地方。

      希望大家一起来探讨,让代码达到最“优雅”。当然大家的探讨不仅仅是代码上,还可以是整个公告实现的方式上的。

 

 

 

 

【本人发帖抛砖引玉,希望能够引出更多的“玉”来,希望所写的每一段代码都能够得到一种最“优雅”的实现方式。以后本人会抛出更多的“砖”,希望能引来更多的“玉”,以供大家一起学习进步】

 

分享到:
评论

相关推荐

    信息办公Asp.net通用OA系统-uds.rar

    Asp.net通用OA系统_uds.rar是一个基于ASP.NET技术的通用办公自动化系统源码文件包,适用于作为毕业设计、课程设计的项目。该系统采用了B/S架构,前端使用HTML、CSS和JavaScript进行页面设计,后端使用C#语言进行业务...

    新酷CMS网站管理系统 10.018.78.rar

    新酷CMS网站管理系统是面向各类中大型站点建设和管理而设计研发的通用建站管理系统(又称新酷CMS建站系统),是目前国内用户数量最多、最受用户欢迎的建站系统。其强大的功能和简单易用的完善融合赢得了广大用户的一致...

    CMS 网站管理系统 源码

    循环弹出窗口:页面打开时同时弹出一个窗口,在同一窗口内循环显示广告位中的正常广告,这样,每刷新一次就会在弹出窗口中更替显示一个新的广告条 广告文件支持: 图片、动画、纯文本、嵌入代码、植入网页 只需后台...

    EIMSCMS企业网站管理系统 v6.0.rar

    46、优化了上传代码,一次性解决上传问题; 47、新增了产品缩略图字段; 48、新增了具体信息的分类功能; 49、优化了位置导航; 50、去掉了后台的特殊字符限制; 51、优化了编辑页面的提示信息; 52、优化了...

    EimsCMS企业网站管理系统 6.0.rar

    46、优化了上传代码,一次性解决上传问题; 47、新增了产品缩略图字段; 48、新增了具体信息的分类功能; 49、优化了位置导航; 50、去掉了后台的特殊字符限制; 51、优化了编辑页面的提示信息; 52、优化了...

    asoft签到管理系统tykq3.5_build20110125

    1、增加自定义用户组名称功能,现在您可以自由的为所有权限的用户取一个您喜欢的名字了(更改后用户下一次登录系统将会显示新的权限名称。例如,将“数据员”改为“秘书”等) 2、调整登陆页面设计。暂时屏蔽日程...

    OA系统+手机版源码t源代码

    利用最新的ASP.NET平台、javascript和AJAX、SQLSERVER关系型数据库等技术,结合OA思想的独特设计,建立一个开放的信息资源管理平台。 利用数据库及分布式处理技术、模块化功能设计,构造信息存储与事务处理平台。该...

    Art2008 CMS 网站管理系统 v3.1.rar

    循环弹出窗口:页面打开时同时弹出一个窗口,在同一窗口内循环显示广告位中的正常广告,这样,每刷新一次就会在弹出窗口中更替显示一个新的广告条 广告文件支持: 图片、动画、纯文本、嵌入代码、植入网页 只需...

    最好的asp CMS系统科讯CMSV7.0全功能SQL商业版,KesionCMS V7.0最新商业全能版-免费下载

    循环弹出窗口:页面打开时同时弹出一个窗口,在同一窗口内循环显示广告位中的正常广告,这样,每刷新一次就会在弹出窗口中更替显示一个新的广告条 只需后台修改广告即可更新广告;可设置广告过期时间,通用于站内...

    JspRun!社区论坛系统 v6.0.0 build 20110516 GBK 安装版.zip

    的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...

    JspRun!社区论坛系统 v6.0.0 build 20110516 GBK 源码版.zip

    的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...

    JspRun!社区论坛系统 v6.0.0 build 20110516 UTF-8 源码版.zip

    的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...

    JspRun!社区论坛系统 v6.0.0 build 20110516 UTF-8 安装版.zip

    的基础架构采用世界上最先进流行的 web 编程组合 JAVA MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。系统采用struts、hibernate框架及中间件的结合既实现了业务逻辑与控制逻辑的...

    网奇CMS网站管理系统 v6.0.2 bulid2015.07.09.zip

    网奇CMS网站管理系统是由网奇公司开发的一套安全易用的CMS系统,本系统采用ASP.NET内核开发,本系统最大的特点是;后台管理功能强大,网站运行速度快,支持静态输出,网站安全性极高,对搜索引擎收录支持性好,24小时自动...

    www.zwdyw.com站源码代码

    功能与特色列表: 01.丰富的模板及强大易用的标签 ...程序模板多达100余套,全部免费、任意下载使用,全站DIV+CSS...播放页生成单独JS文件调用,性能更加优化 31.自定义模板、支持分页生成,比如最新10页热播数据列表

    Dm72网站管理系统源码 V1.0 Beta

    网站通用模版管理:第一次安装系统请生成网站首页。首页、栏目页、内容页、专题页……都可以生成完全的HTML页面(评论和点击数统计除外)。(首页可以直接调用论坛内容)网站通用关键字管理:为整个系统定义与信息...

    青果校园兼职网,阿赛企业网站管理

    35、阿赛分页程序商业版:一个分页面文件,实现所有拖沓冗长的高级分页才能实现的功能,代码精短,执行速度快捷,修改操作方便; 36、高兼容二级下拉导航:支持火狐、IE等各种浏览的导航条下拉二级导航功能,可以...

    深度学习网站系统程序 v2.1.10

    由文章、下载、图片主要功能模块和广告、公告、调查、友情链接、网站统计、用户、数据库管理等多个通用模块组成,每个模块又包含若干个子模块,构建出强大和完善的功能体系。系统防止SQL注入攻击,对密码进行MD5不...

    动易网站管理系统 2005 SP2 Build 0816

     ●修复了留言、公告、模板中使用编辑器插入图片会加入无效js代码的问题  ●修复了添加内容时从上传图片中选择,如果不指定时图片显示错误的问题  ●修复了普通管理员有会员消费明细权限但无法管理的问题  ●...

    动易网站管理系统 2005 SP2 Build 0805 正式版

     ●修复了留言、公告、模板中使用编辑器插入图片会加入无效js代码的问题  ●修复了添加内容时从上传图片中选择,如果不指定时图片显示错误的问题  ●修复了普通管理员有会员消费明细权限但无法管理的问题  ●...

Global site tag (gtag.js) - Google Analytics