JS实现点击事件统计的简单实例
JS实现网站点击事件的统计功能。
点击事件上报,分为立即上报和延时上报,延时上报通过cookie存储。
一、配置参数,主要用于定义上报的一些配置信息。通过在外部定义_clickc对象重置参数。
参数名称 类型 默认值 说明
selector: string '_click_rp' 点击触发的选择器,支持ID、class
prefix: string '_rp_' 需要上报的参数属性名前缀,如_rp_type,表示要上报type参数的值
cookie: string '_click_rp' 延迟上报时的cookie名称
domain: string '.skye.com' cookie存储的域名(可以通过使用的网站来获得)
delay: boolean false 是否延迟上报,延迟上报通过cookie实现
delay_attr: string _delay 标签中指定是否延迟上报,优先级最高,ture延时,其他不延时。
二、外部参数,主要用于定义上报的参数。通过在外部定义_clickq数组增加参数。
三、标签参数,使用前缀_rp_定义,上报的时候会将所有_rp_开头的参数上报。参数的格式分为两种,1种纯字符,1中回调函数。
<aclass="_click_rp"href=""_rp_a="aa"_rp_b="bb">a</a>,表示上报时的参数为a=aa&b=bb
1,纯字符,直接定义字符,表示需要上传参数的值。
2,回调函数,以javascript:开头。只需定义函数体,在函数体中返回参数的值。
如,<ahref="/qa_question/press.html"id="ques_search_btn"class="_click_rp"_rp_act="javascript:if($('#ques_search_btn').text()=='提问'){return'act_qa_ques';}else{return'act_search';}"><span>提问</span></a>
四、延时上报,分为三种优先级,如下由高到低
1,标签属性_delay是否指定为true,如果是表示延迟上报。
2,是否为特定标签,如a标签本窗口打开(target等于"_self"或空),submit按钮。
3,配置参数中指定的delay参数。
五、支持:需要依赖jQuery插件。
六、使用案列
1,引入JS
var_clickq=_clickq||[]; _clickq.push(['param1','value1']); var_clickc={selector:'_click_rps'}; (function(){ varclick=document.createElement("script"); click.src="//cache.skye.com/js/lib/stat/click.js"; vars=document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(click,s); })();
2,定义选择器和上传参数
如,<aclass="_click_rp"href=""_rp_a="aa"_rp_b="bb">a</a>
(function(){ //默认参数 varoptions={ selector:'_click_rp', prefix:'_rp_', cookie:'_click_rp', domain:'.skye.com', delay:false, delay_attr:'_delay' }; varparams={}; var_params={}; varclickObj=null;//当前点击对象 //获得对象 vargetObject=function(selector){ if(typeof(selector)=='object'){ returnselector; }else{ varobj=$('#'+selector); if(obj.length){ returnobj; } obj=$('.'+selector); if(obj.length){ returnobj; } returnnull; } } //获得选择器 vargetSelector=function(selector){ return'#'+selector+',.'+selector; } //操作cookie函数 vargetCookie=function(c_name){ if(document.cookie.length>0){ c_start=document.cookie.indexOf(c_name+"=") if(c_start!=-1){ c_start=c_start+c_name.length+1 c_end=document.cookie.indexOf(";",c_start) if(c_end==-1)c_end=document.cookie.length returnunescape(document.cookie.substring(c_start,c_end)) } } return""; } varsetCookie=function(c_name,value,expiredays,path,domain){ varexdate=newDate() exdate.setDate(exdate.getDate()+expiredays) varcookie=c_name+"="+escape(value)+((expiredays==null)?"":";expires="+exdate.toGMTString()); if(path)cookie=cookie+";path="+path; if(domain)cookie=cookie+";domain="+domain; document.cookie=cookie; } //获得标签中的参数 vargetAttrParam=function(){ if(clickObj){ varattrs=clickObj.get(0).attributes; $.each(attrs,function(i){ varname=attrs[i].name; if(name.indexOf(options.prefix)==0){ name=name.replace(options.prefix,''); varvalue=attrs[i].value; if(value.indexOf('javascript:')==0){ //执行js获得参数值 value=value.replace('javascript:',''); eval('varvalFun=function(){'+value+'};'); value=valFun(); } params[name]=value; } }); } } //获得默认参数 vargetDefaultParam=function(){ if(document){ params.url=document.URL||''; params.referrer=document.referrer||''; } //时间 vardate=newDate(); params.ltime=date.getTime()/1000; //时间戳 params.t=date.getTime(); } vargetParamStr=function(){ getAttrParam(); getDefaultParam(); //合并配置参数 for(varkeyin_params){ params[key]=_params[key]; } //拼接参数串 varargs=''; for(variinparams){ if(args!=''){ args+='&'; } args+=i+'='+encodeURIComponent(params[i]); } returnargs; } //清空参数 varclearParam=function(){ params={}; } //是否立即上报,如果跳转页面,则计入延时上报 vargetIsDelay=function(){ if(clickObj){ //有具体指定 if(clickObj.attr(options.delay_attr)=='true'){ returntrue; } //特定标签 //a标签 if(clickObj.is('a')){ if(clickObj.attr('href').indexOf('javascript:')==0){ returnfalse; } if(clickObj.attr('target')&&clickObj.attr('target')!='_self'){ returnfalse; } returntrue; } //submit按钮 if((clickObj.is('input')||clickObj.is('button'))&&clickObj.attr('type')=='submit'){ returntrue; } } returnoptions.delay; } //加入cookie,下次上报 varsetDelayCookie=function(){ //获得参数 varargs=getParamStr(); varcookieStr=getCookie(options.cookie); if(cookieStr==''){ cookieStr=args; }else{ cookieStr=cookieStr+','+args; } setCookie(options.cookie,cookieStr,7,'/',options.domain); clearParam(); } //上报cookie varrpCookie=function(){ //获得cookie,循环操作 varcookieStr=getCookie(options.cookie); if(cookieStr){ varcookieArr=cookieStr.split(','); for(varkeyincookieArr){ rpClick(cookieArr[key]); } setCookie(options.cookie,'',7,'/',options.domain); } } //上报 varrpClick=function(args){ if(args==undefined){ args=getParamStr(); } varimg=newImage(1,1); img.src='http://data.skye.com/stat/click?'+args; console.info(img.src); clearParam(); } //js上报函数 varrpComm=function(obj){ console.info('click'); clickObj=obj; if(getIsDelay()){ setDelayCookie(); }else{ rpClick(); } } //解析外部配置 if(_clickc){ for(variin_clickc){ options[i]=_clickc[i]; } } //解析外部参数 if(_clickq){ for(variin_clickq){ _params[_clickq[i][0]]=_clickq[i][1]; } } //提供外部js函数 $.rpComm=function(obj){ rpComm(obj); } $.fn.rpComm=function(){ rpComm($(this)); } //cookie中的上报 rpCookie(); //初始化信息 var_time=newDate().valueOf(); varselector=getSelector(options.selector); $('body').delegate(selector,'click',function(){ //连续点击限制 if(newDate().valueOf()-_time<300){ return; } _time=newDate().valueOf(); rpComm($(this)); }); })();
以上这篇JS实现点击事件统计的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。