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

JavaScript013

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

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 )利用这种方式,就解决了确认对话框的返回值接收的问题:js 重写系统confirm方法,不改变使用方式。

$.confirm = function(msg,func1,func2,w,h) { Confirm(msg,func1,func2,w,h)}

function Confirm(msg,func1,func2,w,h){

var opts = {css:{width:w?w:300,height:h?h:120}}

//这里还可以判断msg的长度进行排版,并调整弹出框的大小

install(window.top, opts)

$.DialogData.dialogDiv.find("div[id^='_DialogButtons_']").css('text-align','center')

var win = topWin.$.DialogData.iframeObj.attr('contentWindow')

var doc = win.document

doc.open()

doc.write("<body></body>")

var arr = []

arr.push("<div><table height='100%' border='0' align='center' cellpadding='10' cellspacing='0'>")

arr.push("<tr><td align='center'><img id='Icon' src='../images/icon_query.gif' width='34' height='34' align='absmiddle'></td>")

arr.push("<td align='left' id='Message' style='font-size:9pt'>"+msg+"</td></tr></table></div>")

var div = $(arr.join(''),doc.body)

$(doc.body).append(div)

doc.close()

//设置响应函数

//如果传递响应函数则执行,否则仅关闭窗口

$.DialogData.dialogDiv.find("input[id^='_ButtonOK_']").bind("click", function() {

$.unfunkyUI()

if(func1){

func1()

}

})

$.DialogData.dialogDiv.find("input[id^='_ButtonCancel_']").bind("click", function() {

if(func2){

func2()

}

})

}

})(jQuery)

原生的confirm是通过线程阻塞达到这种目的,而在js里面无法达到这种效果,请弄清楚“同步”“异步”的概念。因此你这个思路是走不通的,函数调用完毕之时,你自定义的弹出框仅仅刚显示出来。但是你采用回掉的思路是正确的。

myCovered.style.display = "block"之后追加以下代码

document.getElementById("_c_true").onclick = okCallBack

document.getElementById("_c_false").onclick = cancelCallBack

就可以实现确认和取消的回调。