ajax标签导航实例详解教程(3)

作者:海啸 来源:无忧脚本 时间:2008-02-01 10:54:00 


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")了。

标签:akax,标签,导航,XMLHTTP
0
投稿

猜你喜欢

  • 学习ASP的理由 分析小结

    2011-02-26 10:54:00
  • 大牌 Banner 设计欣赏(468x60)

    2008-01-20 13:02:00
  • 根据Dreamweaver里的ToolTip代码改进的提示框

    2008-11-27 12:19:00
  • 十个简单好用的设计技巧[译]

    2009-04-08 12:56:00
  • 浅析“Rich”设计模式

    2009-03-12 12:36:00
  • 虾米网今年三月所用加密解密函数

    2010-08-09 12:54:00
  • MySQL安全性指南(3)(转)

    2010-07-26 13:07:00
  • 转换字符串单词的第一个字母为大写

    2007-10-18 10:50:00
  • ASP缓存类 【先锋缓存类】Ver2004

    2009-01-05 12:28:00
  • ORACLE数据库应用开发常见问题及排除

    2010-07-26 13:17:00
  • Javascript 小游戏,“是男人坚持 100 次”

    2009-01-22 14:25:00
  • 30个出色的分页设计

    2009-05-12 17:49:00
  • CSS元素类型

    2009-04-27 12:25:00
  • 十几行的超简日历组件(兼容FF)js源码

    2010-08-08 08:49:00
  • ORACLE实例的后台进程

    2009-09-30 10:28:00
  • asp如何显示已在数据库编码了的相对应的记录?

    2010-06-09 18:44:00
  • Asp生成RSS的类_给网站加上RSS

    2011-04-19 11:06:00
  • PHP工厂模式Factory Pattern的实现及特点

    2023-05-25 05:19:24
  • 用滤镜使网页图片产生旋转效果

    2007-11-03 11:36:00
  • asp如何读取Windows的信息文件(.ini)?

    2009-11-20 18:27:00
  • asp之家 网络编程 m.aspxhome.com