js回调函数传参

最近需要自己写一个confirm的对话框,需要和用户交互。即:弹出对话框,等待用户点击确认或者返回之后,取到点击结果才继续做处理。

举例:var a = window.confirm("确认删除?"); 难题就在这里,confirm执行后所有的js都堵塞了,就在这里等待a的结果。

本来绞尽脑汁定时器,绑定事件,偶然看到回调函数,即 function a执行完,在执行function b。有解了。

首先感谢:http://www.cnblogs.com/yhql/archive/2011/08/08/2131420.html

这位大神说的很明白。然后我这里为了满足需求,说明一下自己传参。

 

 

正题:

先问一个问题:

<script>  
function a(){
	//执行一系列操作
}
function b(){
	alert("b执行了");
}

function test(){
	a();
	b();
}
</script>

试问,执行test()方法,一定会a执行完,才执行b吗?

答案是否定的,a假如有复杂的运算 比如后台有ajax交互,a或许还没有执行完,b就执行完了。假如你在b中又要等a的结果。那么b拿到的值会不会是null 、"" 呢?回调函数就可以解决这个问题,a执行完了以后,b才继续执行。

什么是回掉函数?

a执行完了,回来执行b。就完成了a调用b。其实b就是a的一个参数。

依然借用上面大神的例子:

        你给女朋友说,你到家给我一个信息。女朋友到家了,果然给你了一条信息,老公,我到家了,别担心。

        女朋友回家就是函数a,发信息就是函数b。

听不明白的话,就看例子啦

js代码

<script type="text/javascript">
function a(callback){
	alert("回家路上。。。。。。。。end");
	callback();//回家以后,发信息
}
function b(){
	alert("我到家了");
}

function test(){
	a(b);
}

</script>

 

测试按钮

<input type="button" value="记得给我回信息" onclick="test()">

 

分析一下:首先执行function a,回家。回家执行完了,执行function b,到家了。最好可以用Firefox加断点跟踪一下,看下执行顺序更清晰。

 

传参数:

上面的alert或许并不是想要的,比如confirm对话框,想要的true或者false。在函数a中判断b的结果。继续看代码

js代码:

<script type="text/javascript">
function a(callback){
	alert("回家路上。。。。。。。。end");
	//callback();//回家以后,发信息
	callback("到家结果");
}
function test(){
	//a(b);//执行a的时候,用一个匿名function接收  function a的回调函数的参数
	a(function (result){
		alert(result);
	});
}

</script>


 

 

这里不同的是原来的b换成了function,a中的callback传了一个是否到家的参数。

 

对话框demo:

下面给一个对话框的模拟,或许更明白。界面很丑陋,这里主要是callback的demo,关键的是,可以自己控制confir的样式,随意修改。加上弹出层插件的结合,才是自己想要的。

js代码

<script type="text/javascript">

function showButton(){//让确认,取消显示出来
	$("input[name='yesButton']").css('display','block');
	$("input[name='noButton']").css('display','block');
}
function hidenButton(){//确认按钮隐藏起来,并取消绑定的click事件
	$("input[name='yesButton']").css('display','none');
	$("input[name='noButton']").css('display','none');
	
	$("input[name='yesButton']").unbind();
	$("input[name='noButton']").unbind();
}

function a(callback){
	showButton();
	$("input[name='yesButton']").bind("click",function (){
		 callback(true);//点击以后,把结果传回去。没有点击就不执行callback
		 hidenButton();
	 });
	 $("input[name='noButton']").bind("click",function (){
		 callback(false);
		 hidenButton();
	 }); 
}
function test(){
	//a(b);
	a(function (result){
		//alert(result);
		if(result){
			alert(result+"点击了确定。执行删除等操作");
		}else{
			alert(result+"点击了取消。不做操作");
		}
		
	});
}

</script>

这里可以只看function a,和function test
分析一下:function a的参数是 函数callback,点击确认或者取消按钮以后,再执行callback(true)、callback(false)。
这里就是重点,必须点击执行完了,继续执行传出结果,否则就不执行。相当于在等待点击的结果。

测试按钮

<input type="button" value="确认对话框" onclick="test()">

<input style="display: none" type="button" value="yes" name="yesButton" id="yesButton">
<input style="display: none" type="button" value="no" name="noButton" id="noButton">

 

哪里写的不明白、不正确,希望可以指正
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值