zoukankan      html  css  js  c++  java
  • 巧用apply让javascript函数仅执行一次

    RT,有时候我们只想要让某些脚步函数执行一次就算完成任务了。如何实现这种功能呢?简单模仿下面这段就可以轻松搞定了:

    代码
    var obj = new Object();

    obj.triggerOnce 
    = function(fn) { //控制让函数只触发一次
        return function() {
            
    try {
                fn.apply(
    this, arguments);
            }
            
    catch (e) {
                
    var txt = "There was an error on this page.\n\n";
                txt 
    += "Error message: " + e.message + "\n\n";
                txt 
    += "Error name: " + e.name + "\n\n";
                
    //alert(txt);//正式平台上可能需要注释掉该行
            }
            
    finally {
                fn 
    = null;
            }
        }
    }

    调用形式:


    function showMsg(arg){
       alert(arg);
    }

    var fn=obj.triggerOnce(showMsg);
    fn(
    1);//只执行一次
    fn(2);//没有调用fn

     最后,关于javascript的apply方法,您可以简单参考这篇旧文。

     
    外一篇】用javascript取得querystring的值
    在常见的网站中,经常碰到有“XXXX.aspx?username=jeffwong&address=北京” 这种形式的url,通过asp.net的Request对象获取键值轻而易举,通过js也不是很难,用下面的函数就可以搞定了:

    代码
    var urlStrs = location.search; //QueryString
    var Request = {};
    Request.Count 
    = 0;

    Request.Add 
    = function(name, value) {
        
    if (Request.hasOwnProperty(name) == false) {
            Request.Count
    ++//如果不存在,计数添加1
        }
        Request[name] 
    = value;
        
    return true;
    }

    Request.QueryString 
    = function(name) {//取对应的键值
        var key = name.toString().toLocaleLowerCase(); //不区分大小写
        var result = null;
        
    try {
            
    // if (Request.hasOwnProperty(key)) {
            result = Request[key];
            
    // }
        }
        
    catch (e) {
            
    //alert(e.message);
        }
        
    return result;
    }

    Request.Init 
    = function(urlQueryString) {
        
    if (urlQueryString.indexOf("?"!= -1) {
            
    var url = urlQueryString.substr(1)
            
    var strArr = url.split("&");
            
    for (var i = 0; i < strArr.length; i++) {
                
    var strChildArr = strArr[i].split("=");
                
    var name = String(strChildArr[0]).toLowerCase();
                
    var value = unescape(strChildArr[1]); //unescape解码
                this.Add(name, value); //添加
            }
        }
    }
    测试函数如下:
    代码
    //测试函数
    function test() {
        Request.Init(urlStrs); 
    //初始化request
        alert(Request.Count);
        
    var name = "username";
        
    var value = Request.QueryString(name);
        alert(Request[name]);
        alert(Request.QueryString(name));

        name 
    = "address"
        alert(Request[name]);
        alert(Request.QueryString(name));

        name 
    = "age";
        alert(Request[name]);
        alert(Request.QueryString(name));
    }

    需要说明的是,url里的参数通常都会有编码,本文采用的是比较常用的unescape进行解码,实际上,关于url参数编码,通常有escape,encodeURIComponent和encodeURI这三种编码函数,escape是window对象的内置函数,而另外两种则是javascript内置函数,它们解码的函数也是一一对应的关系(您可以参考这一篇),各自对应的反转函数分别是unescape,decodeURIComponent和decodeURI。

  • 相关阅读:
    【DSP开发技术】影响高性能DSP功耗的因素及其优化方法
    【DSP开发】帮您快速入门 TI 的 Codec Engine
    【DSP开发】帮您快速入门 TI 的 Codec Engine
    【DSP开发】德州仪器达芬奇五年之路七宗罪,嵌入式处理器架构之争决战2012
    【DSP开发】德州仪器达芬奇五年之路七宗罪,嵌入式处理器架构之争决战2012
    【DSP开发】DSP COFF 与 ELF文件
    【DSP开发】DSP COFF 与 ELF文件
    【DSP开发】CCS数据格式 load
    【DSP开发】CCS数据格式 load
    【DSP开发】CMD文件
  • 原文地址:https://www.cnblogs.com/jeffwongishandsome/p/1671585.html
Copyright © 2011-2022 走看看