相信用过google的analytics的朋友都了解其功能的强大.
//定义全局量
var ur = ""; //来源地址
var urp = new array(); //来源参数名称
var urpv = new array(); //来源参数值
var arraycount = 0; //参数数目
pageopen = new date(); //进入页面的时间
var requrl = "http://192.168.0.219/analytics/"; //接收数据的页面地址
var guid = math.round(math.random()*2147483647); //用户唯一随机数
var title = document.title; //网页标题
var uexp = pageopen.gettime() + ( 1000 * 60 * 60 * 24 * 30 ); //设置cookie过期时间 既回访用户的限定
var rtu = "false"; //指示用户是否回访用户
//浏览器特征信息
var brower = new array();
/**//*
* brower[0] 浏览器类型
* brower[1] 浏览器版本
* brower[2] 浏览器java是否打开 1开-1关
* brower[3] 浏览器flash版本
* brower[4] 浏览器操作系统
* brower[5] 浏览器分辨率
* brower[6] 浏览器色深
* brower[7] 浏览器语言
* brower[8] 浏览器插件
*/
var sen=new array(); //搜索引擎的名称
var keyword=new array(); //关键字传输形式
sen[0]="google"; keyword[0]="q";
sen[1]="yahoo"; keyword[1]="p";
sen[2]="msn"; keyword[2]="q";
sen[3]="aol"; keyword[3]="query";
sen[4]="lycos"; keyword[4]="query";
sen[5]="ask"; keyword[5]="q";
sen[6]="altavista"; keyword[6]="q";
sen[7]="search"; keyword[7]="q";
sen[8]="netscape"; keyword[8]="query";
sen[9]="earthlink"; keyword[9]="q";
sen[10]="cnn"; keyword[10]="query";
sen[11]="looksmart"; keyword[11]="key";
sen[12]="about"; keyword[12]="terms";
sen[13]="excite"; keyword[13]="qkw";
sen[14]="mamma"; keyword[14]="query";
sen[15]="alltheweb"; keyword[15]="q";
sen[16]="gigablast"; keyword[16]="q";
sen[17]="voila"; keyword[17]="kw";
sen[18]="virgilio"; keyword[18]="qs";
sen[19]="teoma"; keyword[19]="q";
sen[20]="baidu"; keyword[20]="wd";
//test data------------//////////////////////////////-----------/-/-/-/-/-/-/-/-/-/-/-
sen[21]="localhost"; keyword[21]="q";
这里面定义一些全局的量,其中upr,urpv为来源参数和指,比如来源为http://www.google.com/?p=blacksoul&q=javascript,则urp[0]="p",urp[1]="q" 相对应的urpv[0]="blacksoul",urpv[1]="javascript".
但是最终传输的时候是以分隔符的形式传递给服务器端的.
guid为随机数,google是这么做的.当初没有想通为什么要保存一个随机数,后来分析数据的才明白过来.为了验证用户的唯一性.
以下是函数处理:
//比较url,如果为搜索引擎则保存关键字-------------
function getkeyword(url)
{
var hostname;
if(url.indexof(".") == -1)
{hostname = url;}
else
{hostname = url.substring(url.indexof("."),url.lastindexof("."));}
for(var i = 0; i < sen.length; i++)
{
if(hostname == sen[i])
{
for(var j = 0; j < urp.length; j ++)
{
if(urp[j] == keyword[i])
{
return urpv[j];
}
}
}
}
return "";
}
//将url转换为地址和页面参数和参数值 参数uri为页面地址
function gethn(uri)
{
if(!uri || uri == "") return "";
ur = uri;
var sub;
//带参数
if(ur.indexof("?") != -1)
{
var url = ur.substring(0,ur.indexof("?"));
var para = ur.substring(ur.indexof("?")+1,ur.length);
while(para.length > 0)
{
if(para.indexof("&") == -1)
{
urp[arraycount] = para.substring(0,para.indexof("="));
urpv[arraycount] = para.substring(para.indexof("=")+1,para.length);
break;
}
sub = para.substring(0,para.indexof("&"));
urp[arraycount] = sub.substring(0,sub.indexof("="));
urpv[arraycount] = sub.substring(sub.indexof("=")+1,sub.length);
para = para.substring(para.indexof("&")+1,para.length);
arraycount ++;
}
return url;
}
else
return ur;
}
//----------------------------获得域名-----------------------------
function gethostname(url)
{
url = url.substring(url.indexof('://')+3,url.length);
url = url.substring(0,url.indexof("/"));
return url;
}
//---------------------------获得flash版本------------------
function getflash() {
var f="-1",n=navigator;
if (n.plugins && n.plugins.length) {
for (var ii=0;ii<n.plugins.length;ii++) {
if (n.plugins[ii].name.indexof('shockwave flash')!=-1) {
f=n.plugins[ii].description.split('shockwave flash ')[1];
break;
}
}
} else if (window.activexobject) {
for (var ii=10;ii>=2;ii--) {
try {
var fl=eval("new activexobject('shockwaveflash.shockwaveflash."+ii+"');");
if (fl) { f=ii + '.0'; break; }
}
catch(e) {}
}
}
if(f == "-1")
return f;
else
return f.substring(0,f.indexof(".")+2);
}
//--------------------------设置异步传输-----------------------------------
function createxmlhttprequest()
{
if (window.xmlhttprequest)
{
return new xmlhttprequest();
}
else if (window.activexobject)
{
return new activexobject("microsoft.xmlhttp");
}
} 以上的方法可以取得一些基本信息.但是关键的问题还是设置用户cookie,判断回访,判断最后一次访问时间,并设置其guid.这里看了很久没有发现google是怎么做的...于是自己想了一些笨办法.见一下代码:
//浏览器特征信息
function browserinfo()
{
brower[0] = navigator.appname;
brower[7] = navigator.language;
if(brower[0] == "netscape")
{
var browerinfo = navigator.useragent;
brower[1] = browerinfo.substring(browerinfo.lastindexof(" ")+1,browerinfo.length);
brower[0] = brower[1].substring(0,brower[1].lastindexof("/"));
brower[1] = browerinfo.substring(browerinfo.lastindexof("/")+1,browerinfo.length);
brower[7] = navigator.language;
}
else if(brower[0] == "microsoft internet explorer")
{
brower[1] = navigator.useragent.split(";")[1];
brower[7] = navigator.userlanguage;
}
brower[2] = navigator.javaenabled()?1:-1;
brower[3] = getflash();
brower[4] = getos();
if (self.screen) {
sr=screen.width+"x"+screen.height;
sc=screen.colordepth+"-bit";
}
else if (self.java)
{
var j=java.awt.toolkit.getdefaulttoolkit();
var s=j.getscreensize();
sr=s.width+"x"+s.height;
}
//分辨率
brower[5] = sr;
//色深
brower[6] = sc;
//插件列表
brower[8] = getplugin();
}
//-----------------------获得当前地址-----------------------------
function gethref()
{
return document.location.href;
}
//-----------------------cookie操作开始----------------------------
function setcookie(name, value)
//设定cookie值
{
var expdate = new date();
var argv = setcookie.arguments;
var argc = setcookie.arguments.length;
var expires = 15768000;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
if(expires!=null)
{
//设置过期时间24小时
expdate.settime(uexp);
document.cookie = name + "=" + escape (value) +((expires == null) ? "" : ("; expires="+ expdate.togmtstring()))
+ ((path == null) ? "" : ("; path=" + path)) +((domain == null) ? "" : ("; domain=" + domain))
+ ((secure == true) ? "; secure=" : "");
}
}
function delcookie(name)
//删除cookie
{
var exp = new date();
exp.settime (exp.gettime() - 1);
var cval = getcookie (name);
document.cookie = name + "=" + cval + "; expires="+ exp.togmtstring();
}
//获得cookie的值
function getcookie(fname)
{
var name,value;
var cookies = new object();
var beginning,middle,end;
beginning = 0;
while(beginning < document.cookie.length)
{
middle = document.cookie.indexof("=",beginning);
end = document.cookie.indexof(";",beginning);
if(end == -1)
{
end = document.cookie.length;
}
if((middle > end) || (middle == -1))
{
name = document.cookie.substring(beginning,end);
value = "";
}
else
{
name = document.cookie.substring(beginning,middle);
value = document.cookie.substring(middle+1,end);
}
if(name == fname)
{
return unescape(value);
}
beginning = end + 2;
}
}
//-----获取guid的cookie是否存在获得------------------
function getcookievalue()
{
var guid = getcookie("guid");
if(guid != null)
{
return guid;
}
else
{
return "nocookie";
}
}
//---------------------获得注册用户cookie-----------------
function getregusercookie()
{
return ;
}
//---------------------cookie 操作完毕------------------
//------------------------得操作系统---------------------------
function getos()
{
var oslist = new array();
var osname = new array();
oslist[0] = " windows4.0"; osname[0] = "windows 95";
oslist[1] = " windows 98"; osname[1] = "windows 98";
oslist[2] = " windows nt 5.0"; osname[2] = "windows 2000";
oslist[3] = " windows nt 5.1"; osname[3] = "windows xp";
oslist[4] = " windows nt 5.2"; osname[4] = "windows server 2003";
var ua = navigator.useragent.split(";");
for(var i = 0; i < oslist.length; i++)
{
if(ua[2] == oslist[i])
return osname[i];
}
return ua[2];
}
//获得插件
function getplugin()
{
var plugin = "";
var ua = navigator.useragent.split(";");
if(ua.length < 4)
return "";
for(var i = 4; i < ua.length; i++)
{
plugin += ua[i] + ",";
}
return plugin.substring(0,plugin.length-2);
}
需要说明的一点是getresidenttime这个函数,google采用了img.load的方法加载了接收处理信息页面的,需要再服务器端配置将后缀为.gif或你所取的其他形式的文件使用aspx的方式编译运行.因为我原来考虑的是使用xmlhttp异步调用.但是页面退出的时候有时候不执行.所以就弃用了.代码如下:
function getresidenttime()
{
pageclose = new date();
minutes = (pageclose.getminutes() - pageopen.getminutes());
if(minutes < 0)
{
minutes = minutes + 60;
}
seconds = (pageclose.getseconds() - pageopen.getseconds());
if(seconds < 0){ seconds += 60;}
time = (seconds + (minutes * 60));
//---------------修改此处为接收链接地址 xml 异步传输------------------
// var xmlhttp = createxmlhttprequest();
// xmlhttp.open("post", requrl + firstvisit.aspx?" + strpara(), false);
// xmlhttp.send(null);
//----------------------------图片形式传递----------------------------
if(isreturn() == false)
{
var i = new image(1,1);
i.src = requrl + "firstvisit.aspx?" + strpara() + "&guid=" + guid;
i.onload = function() {loadvoid();}
//进入页面的信息
if(getcookievalue("guid") == "nocookie"){return ;}
i.src = requrl + "pageview.gif?" + pageview() + "&st=" + time;
i.onload=function() {loadvoid();}
}
else
{
var i=new image(1,1);
i.src = requrl + "pageview.gif?" + pageview() + "&st=" + time;
i.onload=function() {loadvoid();}
}
}
最后就是调用了.我使用了window.onunload = getresidenttime
传递的参数大家可以打印出来看一下.应该可以明白其意思.
剩下的就是服务器端的处理了,在服务器端处理其实相当简单.取得request的值,验证并保存入数据库.现在有了数据,分析的事情就由用户按照自己的要求来处理了..补充一句,ip地址是由服务器端来取得保存的.
使用的时候记得一定将其放到服务器端,然后使用<javascript language="javascript" type="text/javascript" src=服务器地址+路径+"statistics.js"> </script> 附上完整的代码http://www.cnblogs.com/files/blacksoul/statistic.rar下载.
该例子我在ie,firefox,netscape下面测试都很正常.搞了一个月,总算有所成就了.但是还有很多需要改进的地方,希望做过的,感兴趣的朋友多多指点交流.
新闻热点
疑难解答