js 重写系统confirm方法,不改变使用方式。

无法阻断线程,进入方法后,自定义方法就执行完毕了。点击确定无法拿到true。无法执行后续方法。... 无法阻断线程,进入方法后,自定义方法就执行完毕了。点击确定 无法拿到 true。无法执行后续方法。 展开
 我来答
pieryon
推荐于2017-10-15 · 知道合伙人数码行家
pieryon
知道合伙人数码行家
采纳数:14410 获赞数:166869
获取软件设计师高级职称 万达金融最佳创新奖

向TA提问 私信TA
展开全部
1、confirm属于特殊的模态窗口,执行这些语句会阻塞浏览器 Javascript 代码的运行。也就是说,在这句中

var a = confirm( "OK?" ) ;
执行了 confirm( "OK?" ) 弹出一个确认框后,javascript 就不再执行,等到点完按钮、返回一个值后,才能完成赋值语句的执行。

想要模拟这个功能,除非能弹出另外一个模态窗口,否则只用 普通的蒙版和 div 层是做不到阻塞 Javascript 的执行的。
修改方法改成:

function Confirm(msg,callback_OK,callback_CANCEL) {
btnok.onclick = function(){
if(callback_OK && typeof callback_OK == "function")
callback_OK( true );
close();//你应该有这个功能吧?
}
btncancel.onclick = function(){
if(callback_CANCEL && typeof callback_CANCEL== "function")
callback_CANCEL( false );
close();//你应该有这个功能吧?
}
}

这样的话,如果想执行类似这样的功能:
if(confirm( "OK?" )){
okHandlerCode();
}else{
cancelHandlerCode();
}
Confirm( "OK?" , okHandlerCode , cancelHandlerCode );

利用这种方式,就解决了确认对话框的返回值接收的问题:
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zeta_func
2014-09-22 · TA获得超过228个赞
知道答主
回答量:201
采纳率:0%
帮助的人:124万
展开全部
这是当然的了。纯粹使用JS实现,不想改变使用方式是不可能的。JS执行环境是单线程的,除了alert、confirm以及prompt,你根本没办法阻塞脚本执行线程!不论你如何重写confirm,调用了confirm,等窗口弹出来时,confirm下面所有语句就马上运行了,根本不可能等到你按确定后再执行。这样你只能通过回调函数的方式实现。当然你可以用ActiveX实现,不过肯定不通用。

另外,重写原生的JS对象和方法,是一件极其危险的事情,特别是当你使用了其他库的时候。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式