请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 64457|回复: 107

[12-24更新]雅虎、网易ajax标签导航效果的实现 [复制链接]

easeman 楼主
帖子
272
体力
1189
威望
41
居住地
河南省 周口市
发表于 2006-10-25 18:58:40 |显示全部楼层
经过多次改进,可以在普通网站上直接使用了,现在发布源程序下载(编码为utf-8,改为gb3212的方法是:用记事本打开,另存时选择相应的编码),希望对大家有用(虽然不一定实用)。
因为只是标签导航,所有内容还会在频道页中体现,所在全部用AJAX读取。
功能的实现思路:

S1  雅虎中国

·单击触发
·<A>块锁定:a{display:block;height:16px;}/*将A锁定为块级,再定义高度和宽度*/
·再次单击弹出链接:在<A>标记的onclick事件中需要执行读取时,return false;否则return true;
·AJAX读取数据
·数据暂存
·窗口平滑收缩
<!--由于我看不懂雅虎的代码,所以使用了一些基本的代码去实现这些功能,可能效率不高,不过效果是出来了.-->

S2    网易
·鼠标滑过延时触发: onmouseover时var waitInterval=window.setTimeout("func();",300);onmouseout时clearTimeout(waitInterval);
·<A>块锁定、AJAX读取数据、数据暂存、窗口平滑收缩

其它功能:
·cookie记忆
·最后读取数据的服务器时间
·滑动门技术

在线效果
http://www.lorlo.com/tab.html

源码下载(见附件)

JS文件分析:
  1. function getObject(objectId) {
  2.      if(document.getElementById && document.getElementById(objectId)) {
  3.         // W3C DOM
  4.            return document.getElementById(objectId);
  5.      }
  6.      else if (document.all && document.all(objectId)) {
  7.         // MSIE 4 DOM
  8.            return document.all(objectId);
  9.      }
  10.      else if (document.layers && document.layers[objectId]) {
  11.         // NN 4 DOM.. note: this won't find nested layers
  12.            return document.layers[objectId];
  13.      }
  14.      else {
  15.            return false;
  16.     }
  17. }

  18. var responsecont;
  19. var xmlHttp;
  20. var xH=new Object();
  21. var rqtp=new Object();
  22. var dateStr,dStr;
  23. var requestType;
  24. var etype=0;
  25. var newsstring;
  26. var ajccache=new Object();
  27. var url;
  28. var MouseDelayTime=200;//鼠标感应延迟
  29. var waitInterval;
  30. var Browser = new Object();
  31. Browser.isMozilla = (typeof document.implementation != 'undefined') && (typeof document.implementation.createDocument != 'undefined') && (typeof HTMLDocument!='undefined');
  32. Browser.isIE = window.ActiveXObject ? true : false;
  33. Browser.isFirefox = (navigator.userAgent.toLowerCase().indexOf("firefox")!=-1);
  34. Browser.isOpera = (navigator.userAgent.toLowerCase().indexOf("opera")!=-1);

  35. function SetCookie(name,value,expires){//写cookie
  36. var exp=new Date();
  37. exp.setTime(exp.getTime()+expires*60000);
  38. document.cookie=name+"="+escape(value)+";expires="+exp.toGMTString();//+";domain=arkoo.com;path=/";
  39. }
  40. function readcookie(name){//读取cookie
  41. var oRegex=new RegExp(name+'=([^;]+)','i');
  42. var oMatch=oRegex.exec(document.cookie);
  43. if(oMatch&&oMatch.length>1)return unescape(oMatch[1]);
  44. else return '';
  45. }

  46. function CreateXMLHttpRequest(){
  47.    // Initialize Mozilla XMLHttpRequest object
  48.    if (window.XMLHttpRequest){
  49.        xmlHttp = new XMLHttpRequest();
  50.    }
  51.    // Initialize for IE/Windows ActiveX version
  52.    else if (window.ActiveXObject) {
  53.        try{
  54.                         xmlHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
  55.            }
  56.        catch (e){
  57.                         try{
  58.                         xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  59.                         }
  60.                         catch (e){newsstring = "<div class='loading'>Loading rquest content fail, Please try it again latter...</div>";}
  61.        }
  62.    }
  63. }

  64. function getnews(tagid,x){
  65. url = "tab/"+tagid+'_'+x+'.html';
  66. var url2=url;
  67. requestType = tagid;
  68. if(ajccache[url]==null){
  69. var loadstatustext="<div class='loading'><img src='tab/images/loading.gif' /> Loading request content, please wait...</div>";
  70. rqtp[tagid]=tagid;
  71. CreateXMLHttpRequest();   
  72. var hdr=tagid;
  73.    xH[tagid]=xmlHttp;
  74.    if(etype==1)getObject(requestType+'_cnt').innerHTML = loadstatustext;
  75.    xH[tagid].onreadystatechange = function(){
  76.    // only if xmlHttp shows "complete"
  77.    if (xH[tagid].readyState == 4){
  78.       // only http 200 to process
  79.       if (window.location.href.indexOf("http")==-1 || xH[tagid].status == 200){
  80.          newsstring = xH[tagid].responseText;
  81.     dateStr=xH[tagid].getResponseHeader("Date");
  82.     dStr = new Date(dateStr);SetCookie('dStr',dStr,10000000);
  83.          //inject centent to tab-pane
  84.             shownews(rqtp[tagid],newsstring);
  85.             ajccache[url2]=newsstring;
  86.       }
  87.    }
  88. }
  89.    xH[tagid].open("GET", url, true);
  90.    xH[tagid].setRequestHeader("If-Modified-Since","0");
  91.    xH[tagid].send(null);
  92. }
  93. else
  94. {shownews(requestType,ajccache[url]);}
  95. }

  96. function shownews(requestType,newsstring){
  97. //<![CDATA[
  98.     responsecont = getObject(requestType+'_cnt');
  99.     responsecont.innerHTML = newsstring;
  100.     getObject("pdate").innerHTML=dStr;
  101. if(getObject("alta")){ata(getObject("alta"));hideText();}
  102. //]]>
  103. }


  104. function TabNews(tagid,x){
  105.         var lim=getObject(tagid+"_mn").getElementsByTagName('li');
  106.         var mnt=getObject(tagid+"_mn").getElementsByTagName('li').length;
  107.         if(!mnt)mnt=4;
  108.         for(var i=0;i<mnt;i++){
  109.                 if(i == (x-1)){
  110.                         if(i==0){
  111.                                 lim[i].className="tabactive1";
  112.                         }
  113.                         else{
  114.                                 lim[i].className="tabactive2";
  115.                                 lim[i-1].getElementsByTagName('a')[0].style.background="url()";
  116.                         }
  117.                         lim[i].getElementsByTagName('a')[0].style.background="url(tab/images/tab_bgs.gif) right -60px no-repeat";
  118.                         try{getnews(tagid,x);}catch(e){alert(e);}
  119.                 }       
  120.                 else{
  121.                         lim[i].className="";
  122.                         lim[i].getElementsByTagName('a')[0].style.background="url(tab/images/tab_bgs.gif) right -88px no-repeat";               
  123.                 }
  124.         }
  125. }

  126. var idn,tmpa,tmpat;
  127. var aw="";
  128. var rT;
  129. function aet(tagid,etp){
  130. var lis=getObject(tagid+"_mn").getElementsByTagName('li');
  131. var wts=tagid+"_cnt";
  132. var wnf=tagid+"info";
  133. if(readcookie(tagid+"_cntd")=="none"){
  134.         hiddenList(getObject(wts));
  135.         maxh[wts]=readcookie(tagid+"_cnth");
  136.         getObject("pdate").innerText=readcookie("dStr");
  137.         }
  138. else{
  139.         if(parseInt(readcookie(wnf))>1)
  140.         TabNews(tagid,readcookie(wnf));//返回上次访问
  141.         else
  142.         TabNews(tagid,1);
  143.         if(etp==1)aw=tagid+readcookie(wnf);
  144. }
  145.         for(var iy=0;iy<lis.length;iy++){
  146.                 with(lis[iy]){
  147.                 if(etp==0){
  148.                 lis[iy].onmouseover=function(){
  149.                         rT=attributes.getNamedItem('id').value.substring(0, attributes.getNamedItem('id').value.length-1);
  150.                         if(getObject(rT+'_cnt').style.display != "none"&&className!="") return;
  151.                         idn=parseInt(attributes.getNamedItem('id').value.substring(attributes.getNamedItem('id').value.length-1, attributes.getNamedItem('id').value.length));
  152.                         clearTimeout(waitInterval);
  153.                         waitInterval=window.setTimeout("etype=0;TabNews(rT,idn);if(getObject(rT+'_cnt').style.display == 'none')displayList(rT+'_cnt'); SetCookie(rT+'info',idn,10000000);SetCookie(rT+'_cntd','ture',10000000);",MouseDelayTime);
  154.                         }
  155.                 lis[iy].onmouseout=function(){if(getObject(rT+'_cnt').style.display != "none"&&className!="") return;clearTimeout(waitInterval);}
  156.                 }
  157.                 if(etp==1){
  158.                 lis[iy].onmouseover=function(){getElementsByTagName('a')[0].blur();}
  159.                 lis[iy].onclick=function(){
  160.                         idn=parseInt(attributes.getNamedItem('id').value.substring(attributes.getNamedItem('id').value.length-1, attributes.getNamedItem('id').value.length));
  161.                         rT=attributes.getNamedItem('id').value.substring(0, attributes.getNamedItem('id').value.length-1);
  162.                         if(getObject(rT+'_cnt').style.display != "none"&&(idn==1&&(this.className=="tabactive1")||aw==attributes.getNamedItem('id').value)) return true;
  163.                                 if(getObject(rT+'_cnt').style.display == "none"){
  164.                                 displayList(rT+'_cnt');SetCookie(rT+'_cntd','ture',10000000);
  165.                                 }
  166.                         etype=1;
  167.                         TabNews(rT,idn);
  168.                         SetCookie(rT+'info',idn,10000000);
  169.                         aw=attributes.getNamedItem('id').value;
  170.                         getElementsByTagName('a')[0].blur();
  171.                         return false;
  172.                         }}}
  173.         }
  174. }

  175. function ata(objid){
  176. var as=objid.getElementsByTagName('a');
  177. for(var i=0;i<as.length;i++){
  178. as[i].target="_self";
  179. }
  180. }


  181. function GetUrlParam(paramName){        //获取URL参数的函数
  182.     var oRegex = new RegExp('[\?&]' + paramName + '=([^&]+)', 'i');
  183.     var oMatch = oRegex.exec(window.location.search);
  184.     if(oMatch && oMatch.length > 1)
  185.         return oMatch[1];
  186.     else
  187.         return '';
  188. }


  189. function hideText(){
  190. if(document.getElementsByTagName("arkoo:title").length==0){
  191. var upu=GetUrlParam("username");
  192. var upa=GetUrlParam("articleid");
  193. getObject("closeit").innerHTML='<a href="http://cn.arkoo.com/diaryfiles/showpage.aspx?username='+upu+'&articleid='+upa+'" target="_blank">查看原文</a> <a href="tab.html" target="_self">×</a>';
  194. }
  195. }

  196. var maxh=new Object();
  197. //显示内容框
  198. function displayList(oid){   
  199.         var h = 0;  
  200.         var objid=getObject(oid);
  201.               if(isNaN(parseInt(maxh[oid]))) var max_h = 210; // 容器的最大高度
  202.                 else
  203.                         var max_h = maxh[oid];
  204.               var anim = function(){                       
  205.                                     h += 50; // 每次递增50像素
  206.                                     if(h >= max_h){
  207.                             objid.style.height = max_h + "px";;
  208.                             getObject('tab'+objid.attributes.getNamedItem('id').value).style.background="url(tab/images/tab_bgs.gif) 5px -113px no-repeat"; // 让图片标签改变背景               
  209.                             if(tt){window.clearInterval(tt);}
  210.                                     }
  211.                                     else{
  212.                 objid.style.display="block";
  213.                 objid.style.height = h + "px";
  214.                                     }
  215.                     }
  216.                           
  217.                           var tt = window.setInterval(anim,2);         
  218. }

  219. // 隐藏列表框
  220. function hiddenList(objid){
  221.        var h = objid.offsetHeight;
  222.                    var anim = function(){
  223.                              h -= 50; // 每次递减50像素
  224.                              if(h <= 5){
  225.                      objid.style.display="none";
  226.                            getObject('tab'+objid.attributes.getNamedItem('id').value).style.background="url(tab/images/tab_bgs.gif) -14px -114px no-repeat";
  227.                            if(tt){window.clearInterval(tt);}
  228.                        }
  229.                        else{
  230.                            objid.style.height = h + "px";
  231.                        }
  232.                    }
  233.                      
  234.                    var tt = window.setInterval(anim,2);
  235. }

  236. function showClassList(oid){
  237. var objid=getObject(oid);
  238.    if(objid.style.display == "none"){
  239.         if(objid.getElementsByTagName("img").length==0)TabNews(oid.substring(0,oid.indexOf("_")),1);
  240.        displayList(oid); // 显示内容框
  241.         SetCookie(oid+'d',"ture",10000000);
  242.    }
  243.    else{
  244.       if(isNaN(parseInt(maxh[oid]))){

  245.          maxh[oid]=objid.offsetHeight; // 内容容器的初始高度

  246.       }
  247.       hiddenList(objid); // 隐藏内容框
  248.         SetCookie(oid+'d',"none",10000000);SetCookie(oid+'h',maxh[oid],10000000);
  249.    }
  250. }
复制代码

[ 本帖最后由 easeman 于 2007-5-6 20:28 编辑 ]
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
E-file 互联网基础平台建设项目
西部数码顶级域名注册商39元抢注!
帖子
129
体力
610
威望
2
发表于 2006-10-25 19:30:42 |显示全部楼层
另:韩国YAHOO的标签效果真爽(可收展及上下移动板块位置)不知LZ能否提取其精华否?
http://kr.yahoo.com
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

jmtgj 
帖子
176
体力
756
威望
0
居住地
广东省 江门市
发表于 2006-10-25 19:32:57 |显示全部楼层
呵,不错啊.正适合,多谢楼主提供

使用道具 举报

lkp528 

北溟游鱼

银牌会员 手机认证 

帖子
1891
体力
2643
威望
1
居住地
广东省 深圳市
发表于 2006-10-25 19:35:35 |显示全部楼层
网易的哪个是触发试的,鼠标经过时自动跳转,而这个还需要点击哦
那位高手能否在改进下?

使用道具 举报

easeman 楼主
帖子
272
体力
1189
威望
41
居住地
河南省 周口市
发表于 2006-10-25 20:32:57 |显示全部楼层

回复 #5 lkp528 的帖子

第一部分是鼠标滑过触发(onmouseover),第二部分是单击触发(onclick).

使用道具 举报

会武术的科学家

实习版主

帖子
2051
体力
5602
威望
45
居住地
浙江省 杭州市
发表于 2006-10-26 22:15:24 |显示全部楼层

呵呵,写得不错哦!!!!!!

支持!!! :D :D :D 对了,上下移动的效果我也写出来了啊,这里(有详细的注释哦!!!)

 提示:您可以先修改部分代码再运行


[ 本帖最后由 yaohaixiao 于 2006-10-26 22:22 编辑 ]

使用道具 举报

jijiyy 
帖子
61
体力
137
威望
0
发表于 2006-10-27 14:41:24 |显示全部楼层
http://openswitch.org/
的这个卵以前用过,问问他吧。他好像是www.9rules.com的设计师,他的blog总是和9rules的页面一样的风格。

[ 本帖最后由 jijiyy 于 2006-10-27 14:43 编辑 ]

使用道具 举报

easeman 楼主
帖子
272
体力
1189
威望
41
居住地
河南省 周口市
发表于 2006-10-29 11:22:31 |显示全部楼层

回复 #8 yaohaixiao 的帖子

谢谢yaohaixiao 提供的代码,我加上去了.

使用道具 举报

帖子
23
体力
53
威望
0
发表于 2006-10-31 00:41:32 |显示全部楼层
为什么不支持GB2312的编码呢?显示为乱码

使用道具 举报

帖子
65
体力
80
威望
0
发表于 2006-10-31 09:18:58 |显示全部楼层
不錯呀,能不能提供一個完整的代碼包呀,謝謝

使用道具 举报

easeman 楼主
帖子
272
体力
1189
威望
41
居住地
河南省 周口市
发表于 2006-10-31 10:39:18 |显示全部楼层

回复 #14 glitter520 的帖子

这个是utf-8的,改变编码方法:
以windows系统自带的记事本为例:在[文件][另存为]对话框的[编码]项,选择“GB2312”,JS,CSS,HTML都要改,HTML中的<meta>也要改.

使用道具 举报

帖子
154
体力
510
威望
0
发表于 2006-10-31 13:17:53 |显示全部楼层
乖乖,这么复杂,我觉得标签导航很简单啊。我自己早就做了一个
http://hs3z.keke100.cn

使用道具 举报

yjjx 
帖子
330
体力
759
威望
0
居住地
重庆市 江北区
发表于 2006-11-3 15:23:35 |显示全部楼层
楼上的真的好简单呀,
只可惜我是新手,没能完全看懂
有谁能帮解释一下吗?

使用道具 举报

ruiz 
帖子
30
体力
75
威望
0
发表于 2006-11-8 09:37:45 |显示全部楼层
觉得还可以啊~只是一时难以运用上..

使用道具 举报

bing8 

冰贝

银牌会员 手机认证 

帖子
988
体力
1419
威望
0
居住地
北京市 朝阳区
发表于 2006-11-8 09:46:06 |显示全部楼层

同14楼问题一样,遇到乱码.请高手指教~

同14楼问题一样,遇到乱码.请高手指教~调用其他页时,显示乱码全是问号,更改编码后,不能解决.调用页单独显示时,正常.(显示中文乱码,英文正常.)

18楼上,请问在DM8 里面怎么改?

[ 本帖最后由 bing8 于 2006-11-8 09:47 编辑 ]

使用道具 举报

wjeasy 
帖子
2327
体力
2299
威望
3
居住地
山东省 泰安市
发表于 2006-11-9 22:30:01 |显示全部楼层
唉,先研究一下,怎么这么复杂啊

使用道具 举报

帖子
2
体力
8
威望
0
发表于 2006-11-12 16:34:17 |显示全部楼层
请问调用的tab_3.html之类的文件里插入js调用,为什么就显示不出来了呢?

使用道具 举报

easeman 楼主
帖子
272
体力
1189
威望
41
居住地
河南省 周口市
发表于 2006-11-13 14:35:05 |显示全部楼层
原帖由 freemax 于 2006-11-12 16:34 发表
请问调用的tab_3.html之类的文件里插入js调用,为什么就显示不出来了呢?

AJAX读取数据中的JS不执行解释.可以路过一个IFRAME来解决:http://bbs.blueidea.com/thread-2690836-1-1.html

使用道具 举报

poco 
帖子
60
体力
137
威望
0
发表于 2006-11-13 14:45:34 |显示全部楼层
不明白的地方是↑鼠标滑过触发↑下的,譬如E-file菜单下的内容去哪了?

使用道具 举报

帖子
2
体力
8
威望
0
发表于 2006-11-13 19:42:39 |显示全部楼层
原帖由 easeman 于 2006-11-13 14:35 发表

AJAX读取数据中的JS不执行解释.可以路过一个IFRAME来解决:http://bbs.blueidea.com/thread-2690836-1-1.html


谢谢指导了!

使用道具 举报

帖子
104
体力
314
威望
0
发表于 2006-11-22 22:36:16 |显示全部楼层
原帖由 bwangel 于 2006-10-31 13:17 发表
乖乖,这么复杂,我觉得标签导航很简单啊。我自己早就做了一个
http://hs3z.keke100.cn

晕,你这个能跟楼主的比吗?

使用道具 举报

帖子
1
体力
7
威望
0
发表于 2006-11-24 09:10:25 |显示全部楼层
请告诉function.js中函数function aet(objid,tagid,etp)中
“url = "tab/"+rT+"_1.html";”使用方法?或者命名页面及存放路径规律?

[ 本帖最后由 huanxitang 于 2006-11-24 09:12 编辑 ]

使用道具 举报

easeman 楼主
帖子
272
体力
1189
威望
41
居住地
河南省 周口市
发表于 2006-11-25 09:10:51 |显示全部楼层
原帖由 huanxitang 于 2006-11-24 09:10 发表
请告诉function.js中函数function aet(objid,tagid,etp)中
“url = "tab/"+rT+"_1.html";”使用方法?或者命名页面及存放路径规律?


命名规律:

tab/news_3.html
tab/news_5.html
tab/news_7.html

tab/tab_3.html
tab/tab_5.html
tab/tab_7.html

因为tab/news_1.html tab/tab_1.html内容和tab.html上原有内容相同,所以省去了.

[ 本帖最后由 easeman 于 2006-11-25 09:12 编辑 ]

使用道具 举报

帖子
11
体力
21
威望
0
发表于 2006-11-28 16:06:39 |显示全部楼层

学习中

完成按照原来的代码,为什么会出现
[object Error]的错误提示框???

使用道具 举报

wylmfe 
帖子
6
体力
7
威望
0
发表于 2006-11-29 11:02:59 |显示全部楼层
同问:

完成按照原来的代码,为什么会出现
[object Error]的错误提示框???

使用道具 举报

帖子
11
体力
21
威望
0
发表于 2006-11-29 15:18:57 |显示全部楼层

怎么都没有人帮助一下,回答一下问题的呀

怎么都没有人帮助一下,回答一下问题的呀

使用道具 举报

帖子
18
体力
45
威望
0
发表于 2006-11-30 14:43:21 |显示全部楼层
[object Error]的错误  是在本地 预览的,按住 Ctrl  就好了,到服务器就没事了,问题就是 好演示的差远了 ,根本没那么完美,
强烈要求 高手 提供一个 打包 下载, 害苦了那么多想学习的兄弟。。

使用道具 举报

easeman 楼主
帖子
272
体力
1189
威望
41
居住地
河南省 周口市
发表于 2006-12-6 11:09:49 |显示全部楼层
现在发布源程序下载(编码为utf-8,改为gb3212的方法是:用记事本打开,另存时选择相应的编码),希望对大家有用。
欢迎大家继续改进。

使用道具 举报

帖子
18
体力
45
威望
0
发表于 2006-12-6 14:40:19 |显示全部楼层

使用道具 举报

206578 
帖子
26
体力
74
威望
0
发表于 2006-12-6 15:41:36 |显示全部楼层
顶上去,正在寻思着怎么去实现像163、雅虎的这种效果呢。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 13:18 , Processed in 0.169705 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部