js和css重写Confirm提示窗口,支持服务器控件调用。
2018-03-30 14:18
357 查看
js和css重写Alert和Confirm提示窗口,支持服务器控件调用。
js自带的Alert和Confirm窗口样貌丑陋,且每个浏览器的实现方式都不一样(弹出位置等),而且还不支持自己输入样式和自定义返回函数等。在一次.NET的web开发过程中,为用户提供一个删除功能时,在用户删除前弹出提示框,这做起来方法很多。
1. 可以前台写个按钮(input,button)或者连接(a)标签,又或者随便一个标签,然后加个click事件,在click事件中用ajax来调用服务器代码,进行更新数据。如果你要改的代码或者新写的代码是这样的,那恭喜你,你造福了你自己和你的后来者。
2. 使用.net自带的服务器控件来做。如果你是在改代码,而且时间不允许你重新构建整个表格区域,又或者是你不想改前辈们的劳动成果,那么你很有可能就直接添加了一个服务器控件,然后添加一个onClientClick事件,直接return confirm(“xxxx”)来简单实现一个提示窗口。
但是作为一个很有责任感的开发人员,作为一个追求完美的开发者,在这前端越来越让人眼花缭乱的前端开发世界里,仍旧使用原生的Confirm实在是让人心里发麻,很不爽。所以花了点时间研究如何自定义新的弹窗来做替换。多说无益,真枪实弹才是真,直接上代码。
前台HTML文件代码和调用方法:
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>模拟alert和confirm提示框</title> <script src="../js/jquery-1.12.4.js"></script> <script src="../js/confirm.js"></script> </head> <body> 4000 <input id="add" type="button" value="添加" onclick="AlertDemo()"/> <input id="update" type="button" value="修改" onclick="ConfirmDemo()" /> <script> //非服务器控件调用Alert function AlertDemo(){ PlusAlert("模拟Alert弹窗", "模拟Alert成功!"); } //非服务器控件调用Confirm function ConfirmDemo(){ PlusConfirm("模拟Confirm弹窗", "模拟Confirm成功!", 340, function (r) { if (r) { PlusAlert("模拟Alert弹窗", "你单击了确定"); } else { PlusAlert("模拟Alert弹窗", "你单击了取消"); } }); } </script> </body> </html>
生成弹窗的js代码:
$(function () { //css样式 var strStyle = "<style type='text/css'>"; strStyle += ".confirmPop a{text-decoration: none;}"; strStyle += ".confirmPop{width:350px; border:#64a64b solid 1px; position:absolute;background:#fff;z-index: 9999;left: 40%;top: 40%;font-family:Microsoft Yahei;}"; strStyle += ".confirmTitle{ background-color:#69ae4e; position:relative;}"; strStyle += ".confirmTitle span{line-height: 30px;margin-left: 5px;font-size: 15px;color: white;}"; strStyle += ".confirmText{ margin:20px 0;text-align: center;}.confirmText span{ font-size: 15px;}"; strStyle += ".confirmBtnBox{ text-align:center; margin:10px 0;}"; strStyle += ".confirmBtnBox .btn{ display:inline-block; padding:0 28px; height:30px; line-height:30px; color:#fff; background-color: #64a64b;margin: 0 10px;}"; strStyle += ".confirmBtnBox .btn:hover{ background-color:#509236;}"; strStyle += ".confirmGlobal{display: block; position: fixed; clear: both; z-index: 9999; left: 0px; top: 0px; bottom: 0px;border: 0px solid rgb(255, 255, 255); width: 100%; height: 100%; opacity: 0.5; background: rgb(255, 255, 255);}"; strStyle += "</style>"; $("head").append(strStyle) //js事件 $.alerts = { alert: function (title, message, width, callback) { if (title == null) title = 'Alert'; $.alerts._show(title, message, width, 'alert', callback); }, confirm: function (title, message, width, callback) { if (title == null) { title = 'Confirm'; } return $.alerts._show(title, message, width, 'confirm', callback); }, _show: function (title, msg, width, type, callback) { renderHtml(title, msg, width, type); switch (type) { case 'alert': $("#confirmBtnSure").click(function () { $.alerts._hide(); if (callback) { callback(true); } }); $("#confirmBtnSure").focus().keypress(function (e) { if (e.keyCode == 13 || e.keyCode == 27) { $("#confirmBtnSure").trigger('click'); } }); break; case 'confirm': $("#confirmBtnSure").click(function () { $.alerts._hide(); if (callback) { return callback(true); } }); $("#confirmBtnCancel").click(function () { $.alerts._hide(); if (callback) { return callback(false); } }); $("#confirmBtnCancel").focus(); $("#confirmBtnSure, #confirmBtnCancel").keypress(function (e) { if (e.keyCode == 13) {//回车 $("#confirmBtnSure").trigger('click'); } if (e.keyCode == 27) {//ESC $("#confirmBtnCancel").trigger('click'); } }); break; } }, _hide: function () { $("#confirmId,#confirmGlobal").remove(); } } //修改Alert弹层提示框 //标题-title,提示信息-altInfo,确认按钮函数-callback,宽度-width PlusAlert = function (title, message, width, callback) { $.alerts.alert(title, message, width, callback); } //修改Confirm弹层提示框 PlusConfirm = function (title, message, width, callback) { $.alerts.confirm(title, message, width, callback); }; }) //生成html并渲染样式 function renderHtml(title, msg, width, type) { if (width) { strPrompt = "<div id='confirmId' style='width: " + width + "px'>"; } else { strPrompt = "<div id='confirmId'>"; } strPrompt += "<div id='confirmTitleDiv'><span id='confirmTitle'>" + title + "</span></div><div id='confirmTextDiv'><span id='confirmInfo'>"; strPrompt += msg + "</span></div><div id='confirmBtnBox'>"; strPrompt += "<a class='btn' href='javascript:void(0)' id='confirmBtnSure'>确认</a>"; if (type == "confirm") { strPrompt += "<a class='btn' href='javascript:void(0)' id='confirmBtnCancel'>取消</a>"; } strPrompt += "</div></div>"; $("body").append(strPrompt) //遮罩层 $("#confirm bd8d Id").before("<div id='confirmGlobal'></div>") //手动渲染样式 $("#confirmId").attr("class", "confirmPop"); $("#confirmTitleDiv").attr("class", "confirmTitle"); $("#confirmTextDiv").attr("class", "confirmText"); $("#confirmBtnBox").attr("class", "confirmBtnBox"); $("#confirmBtnSure").attr("class", "btn"); $("#confirmBtnCancel").attr("class", "btn"); $("#confirmGlobal").attr("class", "confirmGlobal"); }
弹窗的css样式已经写在了js文件中,这样就不用再引用一次css文件,只需要引用一个js文件即可。当然将css写到另外的文件,自己修改样式时会更方便。
通过以上的代码,对非服务器控件,你完全可以实现一个自定义的alert和confirm窗口,里面的所有东西你都可以修改,样式完全可以根据自己的需求自定义。
对于服务器控件,通过添加onclientclick事件,调用renturn PlusConfirm()来实现一个提示时,你会发现他的返回值永远是true,还没等你点击确定或者取消,页面已经被提交到后台执行了。
实现一个自定义的提示窗口,然后自定义返回函数这些都简单,半小时一小时就能实现,烦人的是对于服务器控件,在调用了自定义窗口完成后,并不会阻塞程序,等待用户的下一步操作指示再进行是否提交到后台执行。
我尝试用了while循环,结果失败,因为while执行的过程中你无法操作;用Timeout来做,还是失败,延时0微妙,你还是不能操作界面,大于0秒,程序会还没等你跑Timeout方法就已经提交到后台执行;那就只能阻塞js的进程咯,然后找半天的结果和上面两种差不多的结果。
经过不懈的努力,我想到了实现方法。其实上面的while和Timeout的尝试中我已经无限接近这个答案了。
服务器控件调用自定义提示窗口的代码:
//后台控件调用自定义confirm窗口时,需要单击控件后先返回false,当点击确定时,再次模拟点击控件。 var IsOk = false; function bgControlConfirm() { if (IsOk) { return true; } PlusConfirm("模拟Confirm弹窗", "模拟服务器控件调用Confirm弹窗", 340, function (r) { if (r) { IsOk = true; document.getElementById('SignInGrid_ctl02_btnDelete').click(); } else { IsOk = false; } }); return false; }
还有一个小的提示点,在调用服务器控件的click事件时,用jquery的$(“id”).click()事件无法将页面提交到后台,只有用原生的js,document.getElementById(‘id’).click()的方式才会触发后台事件。至于为什么,下回见分晓。
相关文章推荐
- Js + Css的msn式的popup提示窗口的实现 (转自:月牙儿)
- eclipse完全支持jsp页面下HTML/JS/CSS智能提示
- 在jsp页面下, 让eclipse完全支持HTML/JS/CSS智能提示
- 自定义服务器控件开发之4:重写的支持多验证TextBox控件 续1
- showModalDialog 访问父窗口,向父窗口返回值及undefined类型判断,js触发服务器控件事件
- 让eclipse完全支持HTML/JS/CSS智能提示
- js 重写 bootstrap 样式 alert/confirm 消息窗口
- 在jsp页面下, 让eclipse完全支持HTML/JS/CSS智能提示
- 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示
- js调用.net后台事件、后台调用前台以及js调用服务器控件
- 在jsp页面下, 让eclipse完全支持HTML/JS/CSS智能提示
- 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示
- 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示
- JS调用ATL DLL 以及 去掉ActiveX 控件安全提示
- Js + Css的msn式的popup提示窗口的实现
- js 重写 bootstrap 样式 alert/confirm 消息窗口 - cnhxz
- 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示。
- 在jsp页面下, 让eclipse完全支持HTML/JS/CSS智能提示
- Js + Css的msn式的popup提示窗口的实现 (转自:月牙儿)
- 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示。