巧用apply让javascript函数仅执行一次

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

ExpandedBlockStart.gif 代码
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也不是很难,用下面的函数就可以搞定了:

ExpandedBlockStart.gif 代码
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);  // 添加
        }
    }
}
测试函数如下:
ExpandedBlockStart.gif 代码
// 测试函数
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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值