巧用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。

转载于:https://www.cnblogs.com/jeffwongishandsome/archive/2010/06/15/1671585.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言输出去掉最后一行回车,新人提问:如何将输出时每行最后一个空格删除...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼如何将每行最后一个空格删除&#xff0c;使矩阵只有数字间有空格&#xff0c;没有多余空格&#xff1f;#include#includeint main(){int i,j,k,m,n,x,h,y;int a[15][15]{0};while(scanf("%d",&i)){k1;for(n1;n<i;…

评论时间戳格式化

如图&#xff1a; 注意&#xff0c;评论时间戳的格式&#xff0c;刚才&#xff0c;几小时之前&#xff0c;几天之前..... 实现需要一个时间格式的工具类&#xff0c;如果用java.util.Date当然也可以实现&#xff0c;这里说的是更方便的joda-time。 maven地址&#xff1a;http:/…

在.net3.5中使用ListView控件和DataPager控件笔记

演练&#xff1a;使用 ListView Web 服务器控件修改数据 演练&#xff1a;使用 ListView Web 服务器控件对数据进行显示、分页和排序 DataPager 控件 注意DataPager控件只能和ListView控件使用,不能和其他数据绑定控件使用! 以下ListView 里面的代码都是按照上面链接里面说的步…

android lint工作机制,Android架构

MVCmvc model view controller 模式视图控制器M: 业务逻辑处理V&#xff1a;处理数据显示的部分C&#xff1a;Activity处理用户交互的问题&#xff0c;中间桥梁的作用&#xff0c;解耦的作用。特点&#xff1a;耦合性低扩展性好&#xff0c;利于维护模块职责划分明确Model层&am…

ComboBox 强制转换为大写的方法

最近遇到如何将输入在组合框&#xff08;ComboBox&#xff09;中的英文字符转换为大写的问题。 在TextBox中&#xff0c;有CharacterCasing属性&#xff0c;直接设置为Upper即可。但是在ComboBox中没有此属性&#xff0c;所以要另找其他方法。 直觉告诉我&#xff0c;一定是在K…

opendds开发指南中文版_最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文...

想必大家都知道&#xff0c;学习路线图是学习一门新技术的入门指南&#xff0c;让我们对技术有一个大概的了解&#xff0c;并且在学习感到困惑时被指导。所谓不求最好&#xff0c;但求最全。今天在在就给大家带来了一个国外大牛开源的项目 — 「developer-roadmap」&#xff0c…

数据的交换输出【杭电-2016】 附题

/* 数据的交换输出 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 54495 Accepted Submission(s): 20688 Problem Description 输入n(n<100)个数。找出当中最小的数&#xff0c;将它与最前面的数交换后输出…

进程速查手册

进程速查手册 什么是系统进程&#xff1f;它能做什么&#xff1f; 进程是程序在计算机上的一次执行活动。当你运行一个程序&#xff0c;你就启动了一个进程。显然&#xff0c;程序是死的(静态的)&#xff0c;进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成…

android画布一闪一闪的,解决Android SurfaceView绘制触摸轨迹闪烁问题的方法

本文分享了解决SurfaceView触摸轨迹闪烁问题的方法&#xff0c;供大家参考&#xff0c;具体内容如下第一种解决SurfaceView触摸轨迹闪烁问题的方法&#xff1a;由于SurfaceView使用双缓存机制&#xff0c;两张画布轮流显示到屏幕上。那么&#xff0c;要存储触摸轨迹并避免两张画…

iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)

iOS应用&#xff08;包括移动应用&#xff09;的网络分析&#xff0c;一般采用将移动设备上的流量导入到PC机上&#xff0c;利用PC上成熟的数据包分析工具例如wireshark等来进行分析的方法。 总的来说&#xff0c;有以下三种方法&#xff1a;一、在PC上设置网络共享&#xff0c…

开端2(三)

选择行数, if (efGridResult.EFChoiceCount < 1)设为选中,,this.efGridResult[this.efGridResult.Rows.Count - 1, "check_option"] true;取数据, inInfo.SetBlockVal(this.efGridResult);弹出菜单 this.efGridResult.EFAllowMenuNew false;新增一空行 th…

利用DBMS_ADVISOR.TUNE_MVIEW包生成物化视图创建语句

不少人大概和我一样在创建物化视图的时候会犯头痛&#xff0c;怎样合理的改写SQL语句以及添加物化视图日志需要经过慎重精密的考虑。有了DBMS_ADVISOR.TUNE_MVIEW存储过程这个帮手后&#xff0c;极大地方便了DBA或应用设计人员创建和优化物化视图。该TUNE_MVIEW存储过程可以做到…

oracle批量update数据_东方国信大数据面试真题

东方国信学长1Hadoop工程师笔试题&#xff08;金融事业部&#xff09;1&#xff09;技术基础题&#xff08;共十题&#xff0c;每题5分&#xff09;&#xff08;1&#xff09;列举在Linux系统下可以在看系统各项性能的工具&#xff08;区分CPU、内存、硬盘、网络等&#xff09;…

android 搜狗地图包名,搜狗地图(免费语音导航)

权限信息 读取您的USB存储设备中的内容 android.permission.REQUEST_INSTALL_PACKAComGES android.permission.RECEIVE_USER_PRESENT 完全的网络访问权限 android.permission.ACCESS_BACKGROUND_LOCATION 大致位置(基于网络) 精确位置(基于GPS和网络) 查看网络连接 修改或删除您…

eclipse定制化配置调优、初始化配置指南、可以解决启动慢等问题

配置eclipse的jvm参数 打开eclipse根目录下的eclipse.ini在最后面加上如下的jvm参数 -Xms400m -Xmx1400m -XX:NewSize128m -XX:MaxNewSize512m -XX:PermSize96m -XX:MaxPermSize128m -server -XX:CompileThreshold100 -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:CMSInitiatin…

SEC SOC Test Board 在WIN 7下的安装

首先找到“设备和打印机”点击打开 如果你插上了USB线&#xff0c;会看到&#xff0c;安装不成功时会有个“&#xff01;” 双击它&#xff0c;出现 点击“属性”&#xff0c;出现 点击“改变设置”&#xff0c;出现 点击“更新驱动程序”&#xff0c;出现 点击进去&#xff0c…

ora-00054:resource busy and acquire with nowait specified解决方法

当某个数据库用户在数据库中插入、更新、删除一个表的数据&#xff0c;或者增加一个表的主键时或者表的索引时&#xff0c;常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。主要是因为有事务正在执行&#xff08;或者事务已经被锁&#xff09…

吴枫 python小课怎么样_编程中,有哪些好的习惯从一开始就值得坚持?

电影《喜剧之王》里&#xff0c;周星驰饰演的尹天仇&#xff0c;是一个渴望成为真正的演员&#xff0c;却不断沦为落魄跑龙套的小人物。即便如此&#xff0c;他对演戏的态度始终认真而可敬。他每天不但锲而不舍寻找演戏机会&#xff0c;还在街坊福利社开了个戏剧训练班&#xf…

android常用控件实验报告,ui设计实验报告.doc

ui设计实验报告ui设计实验报告篇一&#xff1a;UI设计实验报告实验项目四&#xff1a;UI设计一、 实验目的和要求1、熟练运用Eclipse软件中的swing设计。2、掌握UI编写的软件。3、能都熟练的进行操作&#xff0c;理解每个按钮的含义并懂得修改参数。4、理解其幕后的Java代码。二…

星期三,今天早上上了四节JS课程,下午听健康讲座,晚上装系统

星期三&#xff0c;今天早上上了四节JS课程&#xff0c;下午听健康讲座&#xff0c;晚上装系统。我想说装系统是最浪费时间的&#xff0c;以前大一的时候&#xff0c;有一段时间喜欢上装系统&#xff0c;我去有时候一个系统装了两三天&#xff0c;因为有很多问题。 ~ 后面就不研…