`
xiaobo.liu
  • 浏览: 39829 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

明河的shareList jQuery插件分析

 
阅读更多
 
突然间 想学习下javascript  
无奈很多代码看不懂  只能对着代码一句一句的调试 


(function($){
	$.fn.shareList = function(options){
		//alert(options);
		var opts;
		var DATA_NAME = "shareList";
		//返回API
		if(typeof options == 'string'){
			 if(options == 'api'){
			 	return $(this).data(DATA_NAME).interfaces[$(this).data(DATA_NAME).current];
			 }else if(options == 'interfaces'){
			 	return $(this).data(DATA_NAME).interfaces;
			 }
		}
		else{
			var options = options || {};
			//覆盖参数
			opts = $.extend(true,{},$.fn.shareList.defaults,options);
			if(options.shareSites)  opts.shareSites = options.shareSites;
		}
		
		return this.each(function(){
			//调用方法
			if(typeof options == 'string'){
				
			}
			//创建
			else{
				
				/* test opts of value */
				for( var i in opts)
				{
				   ADS.log.write(i);
				}
				
				var _shareList = new yijs.ShareList(opts);
				_shareList.$applyTo = $(this);
				//alert(_shareList.$applyTo.constructor);
				//alert(_shareList.$applyTo instanceof jQuery);
				_shareList.render();
				$(this).data(DATA_NAME,_shareList);
			}
		})
	}
	var yijs = yijs || {};
	yijs.ShareList = function(options){
		this.options = $.extend($.fn.shareList.defaults,options);
		this.effect = this.options.effect;
		//组件所起作用的对象
		this.$applyTo = options.applyTo && $(options.applyTo) || null;
		//alert(this.$applyTo);
		this.$li = null;
		this.width = 0;
		this.liWidth = 0;
		this.tpl = this.options.tpl;
		this.getListAjaxOptions = this.options.getListAjaxOptions;
		this.pageUrl = encodeURIComponent(window.location.href);
		this.pageTitle = encodeURIComponent(document.title.substring(0,76));
		if($.browser.msie&&($.browser.version == "6.0")&&!$.support.style) this.options.showShadow = false;
	}
	yijs.ShareList.prototype = {
		/**
		 * 运行
		 */
		render : function(){
			var _that = this;
			/* test this object alert(_that instanceof yijs.ShareList); return true */
			var _cls = this.options.cls;

			/* for(var i in _cls){ADS.log.write(i);} */
            /* alert(this.$applyTo.size()); */
			/* alert(this.$applyTo instanceof jQuery); return true */
			/* ADS.log.write(_cls.shareList); ruturn share-list */
			//ADS.log.write(this.options.style);
			/* alert(this.options.style); return null */

			if(this.$applyTo != null && this.$applyTo.size() > 0){
				this.$applyTo.html("<ul class='"+_cls.shareList+" clearfix'></ul>");
				this.$applyTo.css({"position":"relative","overflow":"hidden"});
				this.options.style && this.$applyTo.css(this.options.style);
				this.$applyTo = this.$applyTo.children("."+_cls.shareList);
				/* for(var i in this.$applyTo){ADS.log.write(i);} */
                /* ADS.log.write(this.$applyTo.selector); return .children(.share-list) */
				/* ADS.log.write(this.getListAjaxOptions.url); return js/shareListData.js */
				/* ADS.log.write(this.getListAjaxOptions.type); return get */
				/* ADS.log.write(this.getListAjaxOptions.dataType); return json */

				$.ajax({
					url : this.getListAjaxOptions.url,
					type : this.getListAjaxOptions.type,
					dataType : this.getListAjaxOptions.dataType,
					success : function(data){
				    /*for( var i in data){for(var j in data[i]){ADS.log.write(j);}} test data return value */
						_that._getListSuccess(data);
					},
					beforeSend : function(){
						_that._getListBeforeSend();
					}
				});
			}
		},
		/**
		 * 成功获取分享列表后执行的回调函数
		 * @param {Object} data json数据源
		 */
		_getListSuccess : function(data){

			var _that = this;
			var _cls = this.options.cls;
			_that._createList(data,function(){
				//alert(this);
				_that.$li = _that.$applyTo.children("li");
				//alert(_that.options.showShadow);
				_that.options.showShadow && _that.$li.children("."+_cls.text).hide();
				_that._setLocalBookmark();
				_that._addShadow();
				_that._setUlWidth();
				_that._followMouseScroll();
				//鼠标滑过li
				_that.$li.hover(function(){
					var index = $(this).index();
					_that.iconToTop(index);
				},function(){
					var index = $(this).index();
					_that.iconTopDefault(index);					
				})
				_that.getListAjaxOptions.success && _that.getListAjaxOptions.success.call(this,data);					
			});			
		},
		/**
		 * 触发ajax请求前的回调函数
		 */
		_getListBeforeSend : function(){
			/* ADS.log.write(this.options.preloadImgSrc); return style/images/loading.gif */
			/* alert(this.getListAjaxOptions.beforeSend); */
			//alert(this instanceof yijs.ShareList) call(this) 'this' is yijs.ShareList object in the getListAjaxOptions.beforeSend
			this.$applyTo.html("<img src='"+this.options.preloadImgSrc+"' class='"+this.options.cls.preload+"' />");
			this.getListAjaxOptions.beforeSend && this.getListAjaxOptions.beforeSend.call(this);			
		},		
		/**
		 * 创建分享按钮列表
		 * @param {Object} data json数据源
		 * @param {function} afterCreate 回调函数
		 */
		_createList : function(data,afterCreate){

				var _that = this;
				var _li;
				var _list = _that.options.shareSites;
				/* for(var i in _list){ADS.log.write(_list[i]);} */
				var _ali = []; 
				/* ADS.log.write(this.tpl); return string */
				$.each(_list,function(a){
					$.each(data,function(i){
						if(data[i].name == _list[a]){
							_li = _that.tpl.TFtpl(data[i]);
							//ADS.log.write(_li);
							_li = _li.TFtpl({url:_that.pageUrl,title:_that.pageTitle});
							//ADS.log.write(_li);
							_ali.push(_li);
						} ;
					})							
				})
				_that.$applyTo.children().fadeOut("slow",function(){
					_that.$applyTo.html(_ali.join(""));
					//alert(this instanceof yijs.ShareList); return false
					//alert(this instanceof jQuery); return false
					//alert($(this) instanceof jQuery); return true
					afterCreate && afterCreate.call(this);
				})			
				
		},
		/**
		 * 给本地收藏夹按钮绑定特殊事件
		 */
		_setLocalBookmark : function(){
			var _that = this;
			this.$li.children("."+this.options.cls.icon+"[name=favorite]").click(function(){
				_addBookmark(window.location.href,document.title.substring(0,76));
				return false;
			}).next().click(function(){return false});
			//添加到本地收藏夹
			function _addBookmark(url,title) {
			    if (window.sidebar) {
			        window.sidebar.addPanel(title,url,"");
			    } 
			    else if(document.all) {
			        window.external.AddFavorite( url, title);
			    }
			    else if( window.opera && window.print ) {
			        return true;
			    }
			}			
		},
		/**
		 * 给每个图标下加个阴影图片
		 */
		_addShadow : function(){
			var _opt = this.options;
			/* for(var i in _opt){ADS.log.write(i);} return default */
			/* _opt.showShadow reutrn true */
			if(_opt.showShadow){
				//ADS.log.write(_opt.cls.iconShadow);
				//ADS.log.write(_opt.shadowSrc); return style/images/icon-shadow.png
				$("<div class='"+_opt.cls.iconShadow+"'><img src='"+_opt.shadowSrc+"' /></div>").appendTo(this.$li);
			}
		},
		/**
		 * 设置列表宽度
		 */
		_setUlWidth : function(){
			var _$liFirst = this.$li.eq(0);
			/* for(var i in this.$li){for(var j in this.$li[i]){ ADS.log.write(j);}} */
			//alert(this.$li.eq(0).selector);
			//alert(_$liFirst.width());
			//var w = _$liFirst.width();
			/* ADS.log.write(w); */
			/* ADS.log.write(_$liFirst.css("marginLeft")); */
			/* ADS.log.write(_$liFirst.css("marginRight")); */
			this.liWidth = _$liFirst.width()+parseInt(_$liFirst.css("marginLeft"))+parseInt(_$liFirst.css("marginRight"));
			// alert(this.liWidth); return 66
			// alert(this.$li.size()); return 19 
			this.$applyTo.width(this.liWidth * this.$li.size());
			this.width = this.$applyTo.width();
		},
		/**
		 * 列表随鼠标滚动
		 */
		_followMouseScroll : function(){
			var _that = this;
			var _opts = this.options;
			var _parentWidth = this.$applyTo.parent().width();
			// alert(_parentWidth); return 660
			// alert(this.width); return 1254
			var _totScroll = this.width-_parentWidth;
			if(this.width > _parentWidth){
				this.$applyTo.mousemove(function(e){
					//ADS.log.write(e.pageX);
					//alert(e.pageX);
					//alert(e.clientX);
					if(_opts.allowSroll){
						var _pageX = e.pageX;
						var _pos = _that.$applyTo.offset();
						_that.$applyTo.css({marginLeft:'-'+_totScroll*(Math.max(_pageX-_pos.left,0)/_that.width)+'px'});	
					}
				})
				this.$applyTo.mouseleave(function(e){
					if(!jQuery.browser.msie || jQuery.browser.version != "7.0"){
						var _marginLeft = Math.abs(Math.floor(parseInt(_that.$applyTo.css("marginLeft"))));
						var _is = _marginLeft % _that.liWidth;
						if (_is != 0) {
							var _d = Math.floor(_marginLeft / _that.liWidth);
							_that.$applyTo.animate({"marginLeft": "-"+_d * _that.liWidth},"fast")
						}						
					}
					
				})
			}
			
		},
		/**
		 * 鼠标滑过时图标向上移动,阴影发生变化
		 */
		iconToTop : function(index){
			var _that = this;
			var _lihoverEffect = _that.effect.liHover;
			var _speed = this.options.speed;
			var _$currentLi = this.$li.eq(index);
			var _icon_cls = this.options.cls.icon;

			if(_$currentLi.size() > 0){
				_$currentLi.children("."+_icon_cls).stop().animate(_lihoverEffect.icon,_speed,function() {
					$(this).animate(_lihoverEffect.iconBack,_speed);
				});
				//改变阴影大小和透明度
				if(this.options.showShadow){
					var _$shadowDiv = _$currentLi.children("."+this.options.cls.iconShadow);
					_$shadowDiv.children("img").stop().animate(_lihoverEffect.shadowImg,_speed);
					_$shadowDiv.stop().animate(_lihoverEffect.shadowDiv,_speed);
				}				
			}			
		},
		/**
		 * 鼠标离开时图标复位,阴影复位
		 */
		iconTopDefault : function(index){
			var _that = this;
			var _liMouseoutEffect = _that.effect.liMouseout;
			var _speed = this.options.speed;
			var _$currentLi = this.$li.eq(index);
			var _icon_cls = this.options.cls.icon;
			if (_$currentLi.size() > 0) {
				_$currentLi.children("."+_icon_cls).stop().animate(_liMouseoutEffect.icon, _speed, function() {
					$(this).animate(_liMouseoutEffect.iconBack, _speed);
				});
				//复位阴影大小和透明度
				if(this.options.showShadow){
					var _$shadowDiv = _$currentLi.children("."+this.options.cls.iconShadow);
					_$shadowDiv.children("img").stop().animate(_liMouseoutEffect.shadowImg,_speed);
					_$shadowDiv.stop().animate(_liMouseoutEffect.shadowDiv,_speed);
				}				
		    }			
		}			
		
	}
	//接口数组
	$.fn.shareList.interfaces = [];
	//样式
	$.fn.shareList.classes = {
		defaults : {
				shareList   : "share-list",
				shareListLi : "share-list-li",
				icon        : "share-list-icon",
				text        : "share-list-text",
				iconShadow  : "share-list-icon-shadow",
				preload     : "share-list-preload"
		}
	}
	//模板
	$.fn.shareList.tpl = {
		defaults : '<li class="l share-list-li">'+
                       '<a href="{href}" name="{name}" localName="{localName}" class="share-list-icon icon-{name}" target="_blank"></a>'+
					   '<a href="{href}" class="share-list-text">{localName}</a>'+
                   '</li> '
	}		
	//默认参数
	$.fn.shareList.defaults = {
				/**想要显示的按钮列表*/
				shareSites : ["9dian","feerbook","chouti","diglog","sinaminiblog","renren","zhuaxia","xianguo","greader","qqshuqian",
				              "douban","twitter","favorite","kaixin001","baiducang","gbuzz","digu","zuosa",
							  "renjian","sohubai"],
				/**ajax配置*/			  
				getListAjaxOptions : {
					type: "GET",
					url : "js/shareListData.js",
					dataType : "json",
					beforeSend:function(){}
				},
				/**是否允许列表随鼠标滚动*/
				allowSroll   : true,
				/**是否显示阴影*/
				showShadow	 : true,
				/**阴影图片路径*/
				shadowSrc	 : "style/images/icon-shadow.png",
				/**预加载动画图片*/
				preloadImgSrc : "style/images/loading.gif",
				/**动画速度*/
				speed        : 250,	
				/**样式*/
				style : null,				
				/**动画效果设置*/			
				effect       : {
					/**鼠标滑过li时的动画*/	
					liHover : {
						icon 	 : {marginTop: "-10px"},
						iconBack : {marginTop: "-6px"}, 
						shadowImg   : { width: "65%", height: "10px", marginLeft: "10px"},
						shadowDiv : {opacity: 0.25}						
					},
					/**鼠标离开li时的动画*/	
					liMouseout : {
						icon     : {marginTop: "4px"},
						iconBack : { marginTop: "0px" },
						shadowImg   : { width: "100%", height: "21px", marginLeft: "0"},
						shadowDiv : {opacity: 1}		
					}
				},
				/**样式名集合*/ 	
				cls          : $.fn.shareList.classes.defaults,
				/**模板*/
				tpl          : $.fn.shareList.tpl.defaults
				
	};	
})(jQuery);

//简单的转换模板函数
String.prototype.TFtpl = function(o){   
    return this.replace(/{([^{}]*)}/g,   
            function (a,b){   
                var r = o[b];   
                return typeof r==='string'?r:a;   
            }   
    );   
       
}; 
 
分享到:
评论
1 楼 jimoshutong 2011-12-21  

看起来有点小复杂啊

相关推荐

    sharelist

    - **插件扩展**:ShareList拥有丰富的插件生态系统,允许用户根据自己的需求安装插件,增强软件功能,如文件预览、加密、同步等。 2. **技术栈与开发语言** - **JavaScript**:作为主要开发语言,JavaScript使得...

    ShareList

    在IT行业中,"ShareList"很可能是一个项目或应用的名称,尤其考虑到它被标记为"Java",我们可以推测这是一个使用Java编程语言实现的共享列表或者文件分享系统。在这个系统中,用户可以创建、管理和分享列表,可能...

    sharelist-heroku

    标题“sharelist-heroku”指的是一个项目,它允许用户快速地将某个应用部署到Heroku平台上。Heroku是一个流行的云平台,它支持多种编程语言,包括Python、Ruby、Node.js等,使得开发者可以轻松地托管和管理他们的Web...

    sharelist:快速分享 GoogleDrive OneDrive

    ShareList ShareList 是一个易用的网盘工具,支持快速挂载 GoogleDrive、OneDrive ,可通过插件扩展功能。 文档 许可 Copyright (c) 2018-present, Reruin

    sharelist-smb

    共享列表的SMB 该lib基于 。

    博客中关于内核链表的例子

    在写了内核链表后,写了这段代码,以便自己和他人易于理解和使用链表。

    eva05

    此外,它还支持通过插件进行功能扩展,这意味着用户可以根据自己的需求安装额外的模块或组件,以增强ShareList的功能,比如添加对其他云服务的支持、增加文件管理功能等。 “许可 Reruin版权所有(c)2018年至今”...

    Valor_T5K_DFM_培训手册

    #### 5.6 分析错误及创建报告文件ShareList - **内容**:分析错误,并生成报告文件。 #### 5.7 3D VRML模拟装配 - **内容**:使用3D VRML技术进行装配模拟。 ### 五、PLM建库 #### 6.1 定义新的Vendor(厂商) - ...

    linux2.6内核同步实例

    让我们深入探讨这两个主题,并通过分析`sharelist.c`源码来理解它们在实际操作中的应用。 **内核同步** 内核同步是为了防止多个处理器或线程在同一时间访问共享资源,导致数据不一致或错误。Linux 2.6内核提供了...

    操作系统实验报告三大问题之生产者与消费者问题完整版.docx

    操作系统中的“生产者-消费者问题”是一个经典的并发编程问题,主要涉及进程或线程的同步与互斥。在这个问题中,生产者...此外,还能提升软件开发、调试技巧,培养团队协作精神和创新能力,以及算法设计和分析能力。

    操作系统实验报告-三大-问题之生产者与消费者问题.docx

    在本实验中,`synchronized`用于锁定`shareList`,防止生产者和消费者同时访问。`wait()`方法使当前线程进入等待状态,释放锁,直到被其他线程唤醒。`notify()`则用来唤醒一个等待的线程,通常是在资源可用时调用。 ...

    如果遇到MD5加密文件,而又不知道的密码的,

    至于提供的压缩包子文件的文件名列表,这些ASP文件可能是某个网站或应用程序的一部分,涉及用户管理(如Register.asp和User_Left.asp)、文件共享(如MyShareFiles.asp和ShareList.asp)、收藏夹(Favorites.asp)、...

    操作系统实验报告三大经典问题之生产者与消费者问题.docx

    通过`synchronized`关键字保证了对共享资源`shareList`的互斥访问,`wait()`和`notify()`方法用于线程间通信,控制生产者和消费者的执行顺序。 总结来说,生产者与消费者问题是操作系统中典型的同步问题,通过使用...

    史上最全面的PopupWindow总结

    1. **构建ListView布局**:首先,你需要创建一个包含ListView的布局文件,如`sharelist.xml`,定义ListView的各项属性和子元素。 2. **填充数据**:创建一个List,将每个ListView项的数据(如字符串、图片等)放入...

    iOS开发:如何使用ShareSDK让APP快速拥有分享功能

    [ShareSDK showShareActionSheet:self shareList:shareList content:publishContent statusBarTips:YES oneKeyShareList:[NSArray defaultOneKeyShareList] shareViewStyle:style shareViewTitle:@"内容分享" result...

    asp网络硬盘的设计与实现

    5. **ShareList.asp**:展示所有公开或特定用户可访问的共享文件列表,ASP在这里处理文件共享的逻辑,包括权限控制和文件搜索功能。 6. **GetFile.asp**:用户通过点击链接下载文件,这个页面负责处理文件的下载...

Global site tag (gtag.js) - Google Analytics