ASP.NET网页编程之google的剖析(analytics)js代码剖析和...
有理由相信是能提供更出色的性能。很多平台无法支持复杂的编译器,因此需要二次编译来减少本地编译器的复杂度。当然可能做不到java编译器那么简易。google|js信任用过google的analytics的伴侣都懂得其功效的壮大.因为事情必要,比来将其urchin.js的代码down了一份上去研讨了一下.因为其正文很少,定名也很难读懂.研讨了1个月.小有所成.将其代码重写并加上了正文.与人人一同分享.这内里将google的用户辨认代码删除./**//*
=====================================
|--------AuthorByBlackSoul---------|
|------------2006.04.27--------------|
|--------BlackSoulylk@gmail.com------|
|------------QQ:9136194--------------|
|------http://blacksoul.cnblogs.cn---|
======================================
*///界说全局量
varur="";//来历地点
varurp=newArray();//来历参数称号
varurpv=newArray();//来历参数值
vararrayCount=0;//参数数量
pageOpen=newDate();//进进页面的工夫
varreqURL="http://192.168.0.219/Analytics/";//吸收数据的页面地点
varGUID=Math.round(Math.random()*2147483647);//用户独一随机数
vartitle=document.title;//网页题目
varuexp=pageOpen.getTime()+(1000*60*60*24*30);//设置cookie过时工夫既回访用户的限制
varrtu="false";//唆使用户是不是回访用户
//扫瞄器特性信息
varbrower=newArray();
/**//*
*brower扫瞄器范例
*brower扫瞄器版本
*brower扫瞄器java是不是翻开1开-1关
*brower扫瞄器flash版本
*brower扫瞄器操纵体系
*brower扫瞄器分辩率
*brower扫瞄器色深
*brower扫瞄器言语
*brower扫瞄器插件
*/
varsEn=newArray();//搜刮引擎的称号
varkeyWord=newArray();//关头字传输情势
sEn="google";keyWord="q";
sEn="yahoo";keyWord="p";
sEn="msn";keyWord="q";
sEn="aol";keyWord="query";
sEn="lycos";keyWord="query";
sEn="ask";keyWord="q";
sEn="altavista";keyWord="q";
sEn="search";keyWord="q";
sEn="netscape";keyWord="query";
sEn="earthlink";keyWord="q";
sEn="cnn";keyWord="query";
sEn="looksmart";keyWord="key";
sEn="about";keyWord="terms";
sEn="excite";keyWord="qkw";
sEn="mamma";keyWord="query";
sEn="alltheweb";keyWord="q";
sEn="gigablast";keyWord="q";
sEn="voila";keyWord="kw";
sEn="virgilio";keyWord="qs";
sEn="teoma";keyWord="q";
sEn="baidu";keyWord="wd";
//testdata------------//////////////////////////////-----------/-/-/-/-/-/-/-/-/-/-/-
sEn="localhost";keyWord="q";
这内里界说一些全局的量,个中upr,urpv为来历参数和指,好比来历为http://www.google.com/?p=BlackSoul&q=javascript,则urp="p",urp="q"绝对应的urpv="BlackSoul",urpv="javascript".
可是终极传输的时分是以分开符的情势传送给服务器真个.
GUID为随机数,google是这么做的.现在没有想通为何要保留一个随机数,厥后剖析数据的才分明过去.为了考证用户的独一性.
以下是函数处置:
//对照url,假如为搜刮引擎则保留关头字-------------
functiongetKeyword(url)
{
varhostname;
if(url.indexOf(".")==-1)
{hostname=url;}
else
{hostname=url.substring(url.indexOf("."),url.lastIndexOf("."));}
for(vari=0;i<sEn.length;i++)
{
if(hostname==sEn)
{
for(varj=0;j<urp.length;j++)
{
if(urp==keyWord)
{
returnurpv;
}
}
}
}
return"";
}
//将URL转换为地点和页面参数和参数值参数uri为页面地点
functiongethn(uri)
{
if(!uri||uri=="")return"";
ur=uri;
varsub;
//带参数
if(ur.indexOf("?")!=-1)
{
varurl=ur.substring(0,ur.indexOf("?"));
varpara=ur.substring(ur.indexOf("?")+1,ur.length);
while(para.length>0)
{
if(para.indexOf("&")==-1)
{
urp=para.substring(0,para.indexOf("="));
urpv=para.substring(para.indexOf("=")+1,para.length);
break;
}
sub=para.substring(0,para.indexOf("&"));
urp=sub.substring(0,sub.indexOf("="));
urpv=sub.substring(sub.indexOf("=")+1,sub.length);
para=para.substring(para.indexOf("&")+1,para.length);
arrayCount++;
}
returnurl;
}
else
returnur;
}
//----------------------------取得域名-----------------------------
functiongetHostName(url)
{
url=url.substring(url.indexOf(://)+3,url.length);
url=url.substring(0,url.indexOf("/"));
returnurl;
}
//---------------------------取得flash版本------------------
functiongetFlash(){
varf="-1",n=navigator;
if(n.plugins&&n.plugins.length){
for(varii=0;ii<n.plugins.length;ii++){
if(n.plugins.name.indexOf(ShockwaveFlash)!=-1){
f=n.plugins.description.split(ShockwaveFlash);
break;
}
}
}elseif(window.ActiveXObject){
for(varii=10;ii>=2;ii--){
try{
varfl=eval("newActiveXObject(ShockwaveFlash.ShockwaveFlash."+ii+");");
if(fl){f=ii+.0;break;}
}
catch(e){}
}
}
if(f=="-1")
returnf;
else
returnf.substring(0,f.indexOf(".")+2);
}
//--------------------------设置异步传输-----------------------------------
functioncreateXMLHttpRequest()
{
if(window.XMLHttpRequest)
{
returnnewXMLHttpRequest();
}
elseif(window.ActiveXObject)
{
returnnewActiveXObject("Microsoft.XMLHttp");
}
}以上的办法能够获得一些基础信息.可是关头的成绩仍是设置用户cookie,判别回访,判别最初一次会见工夫,并设置其GUID.这里看了好久没有发明google是怎样做的...因而本人想了一些笨举措.见一下代码:
//扫瞄器特性信息
functionBrowserInfo()
{
brower=navigator.appName;
brower=navigator.language;
if(brower=="Netscape")
{
varbrowerInfo=navigator.userAgent;
brower=browerInfo.substring(browerInfo.lastIndexOf("")+1,browerInfo.length);
brower=brower.substring(0,brower.lastIndexOf("/"));
brower=browerInfo.substring(browerInfo.lastIndexOf("/")+1,browerInfo.length);
brower=navigator.language;
}
elseif(brower=="MicrosoftInternetExplorer")
{
brower=navigator.userAgent.split(";");
brower=navigator.userLanguage;
}
brower=navigator.javaEnabled()?1:-1;
brower=getFlash();
brower=getOS();
if(self.screen){
sr=screen.width+"x"+screen.height;
sc=screen.colorDepth+"-bit";
}
elseif(self.java)
{
varj=java.awt.Toolkit.getDefaultToolkit();
vars=j.getScreenSize();
sr=s.width+"x"+s.height;
}
//分辩率
brower=sr;
//色深
brower=sc;
//插件列表
brower=getPlugin();
}
//-----------------------取得以后地点-----------------------------
functiongetHref()
{
returndocument.location.href;
}
//-----------------------cookie操纵入手下手----------------------------
functionsetCookie(name,value)
//设定Cookie值
{
varexpdate=newDate();
varargv=setCookie.arguments;
varargc=setCookie.arguments.length;
varexpires=15768000;
varpath=(argc>3)?argv:null;
vardomain=(argc>4)?argv:null;
varsecure=(argc>5)?argv: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=":"");
}
}
functiondelCookie(name)
//删除Cookie
{
varexp=newDate();
exp.setTime(exp.getTime()-1);
varcval=getCookie(name);
document.cookie=name+"="+cval+";expires="+exp.toGMTString();
}
//取得Cookie的值
functiongetCookie(fname)
{
varname,value;
varcookies=newObject();
varbeginning,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)
{
returnunescape(value);
}
beginning=end+2;
}
}
//-----猎取GUID的cookie是不是存在取得------------------
functiongetCookieValue()
{
varguid=getCookie("GUID");
if(guid!=null)
{
returnguid;
}
else
{
return"noCookie";
}
}
//---------------------取得注册用户cookie-----------------
functiongetRegUserCookie()
{
return;
}
//---------------------cookie操纵终了------------------
//------------------------得操纵体系---------------------------
functiongetOS()
{
varOSlist=newArray();
varOSName=newArray();
OSlist="Windows4.0";OSName="Windows95";
OSlist="Windows98";OSName="Windows98";
OSlist="WindowsNT5.0";OSName="Windows2000";
OSlist="WindowsNT5.1";OSName="WindowsXP";
OSlist="WindowsNT5.2";OSName="WindowsServer2003";
varua=navigator.userAgent.split(";");
for(vari=0;i<OSlist.length;i++)
{
if(ua==OSlist)
returnOSName;
}
returnua;
}
//取得插件
functiongetPlugin()
{
varplugin="";
varua=navigator.userAgent.split(";");
if(ua.length<4)
return"";
for(vari=4;i<ua.length;i++)
{
plugin+=ua+",";
}
returnplugin.substring(0,plugin.length-2);
}
必要申明的一点是GetResidentTime这个函数,google接纳了img.load的办法加载了吸收处置信息页面的,必要再服务器端设置将后缀为.gif或你所取的其他情势的文件利用aspx的体例编译运转.由于我本来思索的是利用xmlHttp异步伐用.可是页面加入的时分偶然候不实行.以是就弃用了.代码以下:
functionGetResidentTime()
{
pageClose=newDate();
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异步传输------------------
//varxmlHttp=createXMLHttpRequest();
//xmlHttp.open("POSt",reqURL+firstvisit.aspx?"+StrPara(),false);
//xmlHttp.send(null);
//----------------------------图片情势传送----------------------------
if(isReturn()==false)
{
vari=newImage(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
{
vari=newImage(1,1);
i.src=reqURL+"pageView.gif?"+pageView()+"&st="+time;
i.onload=function(){LoadVoid();}
}
}
最初就是挪用了.我利用了window.onunload=GetResidentTime
传送的参数人人能够打印出来看一下.应当能够分明其意义.
剩下的就是服务器真个处置了,在服务器端处置实在相称复杂.获得request的值,考证并保留进数据库.如今有了数据,剖析的事变就由用户依照本人的请求来处置了..增补一句,ip地点是由服务器端来获得保留的.
利用的时分记得必定将其放到服务器端,然后利用<javascriptlanguage="javascript"type="text/javascript"src=服务器地点+路径+"statistics.js"></script>附上完全的代码http://www.ckuyun.com/Files/BlackSoul/statistic.rar下载.
该例子我在IE,firefox,netscape上面测试都很一般.弄了一个月,总算有所成绩了.可是另有良多必要改善的中央,但愿做过的,感乐趣的伴侣多多指导交换.
既然话题已经抄起,我打算今晚发篇博文再引导一下舆论方向,使它再火两天,抛砖引玉,而且赵劼先生一直在跟帖,使.NET阵营的我感到万分难得。 由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。 ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。 Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境! 大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。 ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。 PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。 我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。 Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!
页:
[1]