AJax技术

Ajax标签导航实例详解

字号+ 作者:H5之家 来源:H5之家 2015-09-24 08:10 我要评论( )

AJAX教程,Ajax标签导航实例详解-Javascript技巧篇,提供网页设计教程,网站制作教程。

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

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

  • 选中当前标签的背景要区别显示;
  • 选中标签和其前一个标签的分隔线要隐藏;
  • 不过在改变标签样式这个步骤开始之前我们要给我们的标签菜单(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);
    }
    }

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • JQuery实现Ajax加载图片的方法

      JQuery实现Ajax加载图片的方法

      2016-02-24 17:01

    • 判断用户是不是为ajax请求

      判断用户是不是为ajax请求

      2016-02-24 17:00

    • Ajax与WEB开发 by alixixi.com

      Ajax与WEB开发 by alixixi.com

      2016-02-11 11:02

    • jQuery.ajax()的相关参数及使用

      jQuery.ajax()的相关参数及使用

      2016-02-08 16:00

    网友点评