您的位置: 首页 > 技术文档 > 网页制作 > Ajax标签导航实例详解
再谈文字溢出问题 回到列表 XMLHTTPRequest的属性和方法简介
 Ajax标签导航实例详解

作者:yaohaixiao 时间: 2008-02-25 文档类型:原创 来自:蓝色理想

第 1 页 代码篇
第 2 页 CSS技巧篇
第 3 页 Javascript技巧篇
第 4 页 DOM技巧篇
第 5 页 大结局

Javascript技巧篇(arguments对象的运用技巧)

好了,我们现在已经把CSS样式写好了,现在就开始用脚本来控制了。通过刚才讲解标签样式的时候,其实我们也基本把脚本控制的逻辑流程分析了下:

  1. 选中当前标签的背景要区别显示;
  2. 选中标签和其前一个标签的分隔线要隐藏;

不过在改变标签样式这个步骤开始之前我们要给我们的标签菜单(ul)来设置onclick事件(功能函数),从而触发改变当前选中项的样式的事件。到我们的主题了,呵呵!快来看看代码吧:

/* ===========================================================
* 函数名称:tabsEvent()
* 参数说明:要设置事件的DOM节点ID
* 函数功能:为导航TAB菜单(li)设置onclick处理方法(函数),
*           屏蔽掉a标签默认的处理(打开新链接)事件
* 返 回 值:false - 屏蔽掉a标签默认的处理(打开新链接)事件
* 使用方法:tabsEvent("news","sports");
============================================================ */
function tabsEvent(){
      for(var i=0;i<arguments.length;i++){
         var tabs = $(arguments[i]);
         // DOM节点(tabs)不存在或者浏览器不支持getElementsByTagName()方法
         // 函数不执行
           if(!tabs || !document.getElementsByTagName) return false;
              
           var theList = tabs.getElementsByTagName("li"); // 搜寻导航标签(ID为tabs)里的所有li标签
           var theLink = tabs.getElementsByTagName("a");  // 搜寻导航标签(ID为tabs)里的所有a标签
              
           for(var j=0;j<theList.length;j++){
                 var theTab = theList[j];
                 if(theTab.parentNode!=tabs) continue;
                    
                 var theA = theLink[j];
                 // 屏蔽掉a标签默认的处理(打开新链接)事件
                 theA.onclick = function(){
                     return false;   
                 }
                
                 // 为导航TAB菜单(li)设置onclick处理方法(函数)   
                 theTab.onclick = function(){
                  var theClass = this.className;
                  if(theClass!="current" && theClass!="first"){
                            var objId = this.getAttribute("id").split("-")[1]; // 当前选中标签(li)在菜单(ul)中的索引值
                            var tarObj = this.getAttribute("id").split("-")[0]; // 要显示信息的目标DOM节点ID值
                       var theURL = tarObj + "/" + tarObj + objId + ".htm"; // 要异步加载的URL地址
                         ajaxInject($(tarObj),objId,tarObj,theURL);   
                         return false;
                     }
               }
           }
      }     
}

上面这段脚本,我们使用了$(i)函数获取DOM节点,方法就是$("DOMId"),这里就不多说了。这里要花些时间讲的是arguments对象,恩,...,恩,开始讲arguments对象了,注意听讲(不是在卖弄哦,这个我们经常要用到的,也很重要的一个知识点):

Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象。Arguments是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。

”隐藏对象“,怎么个隐藏法呢?看看我们函数的写法吧:

function tabsEvent(){
...
}

而我在调用这个函数是确是这么写的:

<script language="javascript" type="text/javascript">
<!--
tabsEvent("news","sports");
//-->
</script>

“tabsEvent("news","sports");”, 我使用了参数,而我定义tabsEvent时,却没有使用形参(形参个数为零),就是这么个隐藏法。

它像数组,而又不是数组,怎么解释了?还是看个说明arguments不是数组(Array类)的代码:

Array.prototype.selfvalue = 1;
alert(new Array().selfvalue);

function testAguments(){
    alert(arguments.selfvalue);
}

运行代码你会发现第一个alert显示1,这表示数组对象拥有selfvalue属性,值为1。而当你调用函数testAguments时,你会发现显示的是“undefined”,说明了selfvalue不是arguments的属性,即arguments并不是一个数组对象。

呵呵,又说了这么多,要将就讲彻底些:caller、callee、apply、call都讲讲吧,^-^!

caller - 返回一个对函数的引用,该函数调用了当前函数。

对于函数来说,caller 属性只有在函数执行时才有定义。如果函数是由顶层调用的,那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。 下面的例子说明了 caller 属性的用法:

function callerDemo() {
   if (callerDemo.caller) {
       var a = callerDemo.caller.toString();
       alert(a);
   }
   else {
       alert("this is a top function");
   }
}

function handleCaller() {
   callerDemo();
}

handleCaller();
callerDemo();

我们通过handleCaller();调用执行callerDemo();时callerDemo.caller才定义,可以看到一个警告框,显示的反编译的handleCaller()的文本。而直接使用callerDemo();时,我们callerDemo函数的caller是没有定义的,所以你会看到”this is a top function“提示字符。

callee - 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。 用法[function.]arguments.callee,可选项 function 参数是当前正在执行的 Function 对象的名称。

callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性,这个属性有时候用于验证还是比较好的。arguments.length是实参长度,arguments.callee.length是形参长度,由此可以判断调用时形参长度是否和实参长度一致。

//callee可以打印其本身
function calleeDemo() {
   alert(arguments.callee);
}

//用于验证参数
function calleeLengthDemo(arg1, arg2) {
   if (arguments.length==arguments.callee.length) {
       alert("验证形参和实参长度一致!");
       return;
   }
   else {
       alert("实参长度:" +arguments.length);
       alert("形参长度: " +arguments.callee.length);
   }
}

//递归计算
var sum = function(n){
   if (n <= 0) {
      return 1;
   }
   else{
      return n + arguments.callee(n - 1);
   }
}

调用alert(sum(9));时,其中函数内部包含了对sum自身的引用,函数名仅仅是一个变量名,在函数内部调用sum即相当于调用一个全局变量,不能很好的体现出是调用自身,这时使用callee会是一个比较好的方法。

apply 和 call 它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式时有所区别:

apply(thisArg,argArray);

call(thisArg[,arg1,arg2…] ]);

即所有函数内部的this指针都会被赋值为thisArg,这可实现将函数作为另外一个对象的方法运行的目的

apply的说明:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。如果没有提供 argArray 和 thisArg 任何一个参数,那么 Global 对象将被用作 thisArg,并且无法被传递任何参数。

call的说明:call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg 指定的新对象。 如果没有提供 thisArg 参数,那么 Global 对象被用作 thisArg。

应用call和apply还有一个技巧在里面,就是用call和apply应用另一个函数(类)以后,当前的函数(类)就具备了另一个函数(类)的方法或者是属性,这也可以称之为“继承”。看下面示例:

// 继承的演示
function base() {
    this.member = "dnnsun_Member";
    this.method = function() {
         alert(this.member);
    }
}

function extend() {
    base.call(this);
    alert(member);
    alert(this.method);
}

上面的例子可以看出,通过call之后,extend可以继承到base的方法和属性。

呵呵,你可能发现了,在javascript框架prototype里就使用apply来创建一个定义类的模式,其实现代码如下:

var Class = {
   create: function() {
       return function() {
           this.initialize.apply(this, arguments);
       }
   }
}

从代码看,该对象仅包含一个方法:Create,其返回一个函数,即类。但这也同时是类的构造函数,其中调用initialize,而这个方法是在类创建时定义的初始化函数。通过如此途径,就可以实现prototype中的类创建模式,示例代码:

var vehicle=Class.create();

vehicle.prototype={
   initialize:function(type){
       this.type=type;
   }

   showSelf:function(){
       alert("this vehicle is "+ this.type);
   }
}

var moto=new vehicle("Moto");
moto.showSelf();

呵呵,越扯越多了,现在清楚了arguments对象的用法了吧!哈哈,还是有些收获的吧?^-^!!! 不过该回到我们的主题了,怎么实现点击标签(li)触发更改样式的事件。还是接着看我们的ajaxtab.js的代码吧:

for(var i=0;i<arguments.length;i++){
         var tabs = $(arguments[i]); 
}
  

看看上面讲的arguments的用法,呵呵,这里我们就获取了全部的标签导航菜单了。arguments.length = ?等于2,arguments[i]是什么,就是我们传的参数本身(tabsEvent("news","sports");),那么$(arguments[i])就是我们的标签菜单,具体点就是$("news")和$("sports")了

出处:蓝色理想
责任编辑:moby

上一页 CSS技巧篇 下一页 DOM技巧篇

◎进入论坛网页制作WEB标准化版块参加讨论,我还想发表评论

相关文章 更多相关链接
不用组件实现Ajax效果
用 AjaxTags 简化 Ajax 开发
静态页面分页的AJAX实现
Ajax的小贴士
AJAX通用类:AJAXRequest v0.3
作者文章
XMLHTTPRequest的属性和方法简介
Ajax标签导航效果
关键字搜索 常规搜索 推荐文档
热门搜索:CSS Fireworks 设计比赛 网页制作 web标准 用户体验 UE photoshop Dreamweaver Studio8 Flash 手绘 CG
站点最新 站点最新列表
周大福“敬•自然”设计大赛开启
国际体验设计大会7月将在京举行
中国国防科技信息中心标志征集
云计算如何让安全问题可控
云计算是多数企业唯一拥抱互联网的机会
阿里行云
云手机年终巨献,送礼标配299起
阿里巴巴CTO王坚的"云和互联网观"
1499元买真八核 云OS双蛋大促
首届COCO桌面手机主题设计大赛
栏目最新 栏目最新列表
浅谈JavaScript编程语言的编码规范
如何在illustrator中绘制台历
Ps简单绘制一个可爱的铅笔图标
数据同步算法研究
用ps作简单的作品展示页面
CSS定位机制之一:普通流
25个最佳最闪亮的Eclipse开发项目
Illustrator中制作针线缝制文字效果
Photoshop制作印刷凹凸字体
VS2010中创建自定义SQL Rule
>> 分页 首页 前页 后页 尾页 页次:3/51个记录/页 转到 页 共5个记录

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。

您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
网站可用性测试及优化指南
《写给大家看的色彩书1》
《跟我去香港》
众妙之门—网站UI 设计之道
《Flex 4.0 RIA开发宝典》
《赢在设计》
犀利开发—jQuery内核详解与实践
作品集 更多内容

杂⑦杂⑧ Gold NORMANA V2