以前项目上用的那个虽然也是自己写的,但是是基于JQ的,前不久看到人人网出的JS有道考题和这个很像,所以就用原生JS重写了一遍:

JS

(function(win){var tips = {'title':'信物宝提示','enter':'确定','cancel':'取消','close':'关闭'},isIE6 = !window.XMLHttpRequest,cssLoaded = false,isOpen = false,loadCss = function(){if(cssLoaded) return;var cssHref = 'dialog.css';var style = document.createElement('link');style.type = 'text/css';style.rel = 'stylesheet';style.href = cssHref;document.getElementsByTagName('head')[0].appendChild(style);cssLoaded = true;};/*************************************对外提供的接口****************************************************/var dialog = function(opts){return new dialog.prototype.init(opts);};dialog.prototype = {constructor:dialog,init:function(opts){loadCss();},alert:function(opts){var _this = this;var set = extend({width:400,height:100},opts||{});if(isOpen) this.close();isOpen = true;this.doms = createElements(set);this.doms.contentBox.appendChild(document.createTextNode(opts.content));setCenter(this.doms);this.doms.btnEnter.onclick = function(){_this.close();opts.callback && opts.callback(true);};this.doms.contentTitle.onmousedown = function(e){var mousePos= getMousePos(e),pos = getElementPos(_this.doms.contentOuter);var _move = move(mousePos,_this.doms.contentOuter,pos.y,pos.x);addEvent(document,'mousemove',_move);addEvent(document,'mouseup',function(){removeEvent(document,'mousemove',_move)});};this.doms.contentTitle.ondragstart = function(){ return false;};this.doms.close.onclick = function(){_this.close();};addEvent(window,'resize',function(){setCenter(_this.doms);})},confirm:function(opts){var _this = this;this.alert(opts);this.doms.btnBox.appendChild(this.doms.btnCancel);this.doms.btnCancel.onclick = function(){_this.close();opts.callback && opts.callback(false);}},prompt:function(opts){var _this = this,input;this.alert(opts);input = createEl('<input type="text" name="" value="'+opts.defaultValue+'" id="diaglo_prompt_input"/>',this.doms.contentBox);input.select();this.doms.btnBox.appendChild(this.doms.btnCancel);this.doms.btnEnter.onclick = function(){_this.close();opts.callback && opts.callback(input.value);};this.doms.btnCancel.onclick = function(){_this.close();opts.callback && opts.callback(null);};this.doms.close.onclick = function(){_this.close();};},load:function(opts){var _this = this;this.alert(opts);this.doms.contentOuter.removeChild(this.doms.btnBox);this.doms.btnEnter.onclick = null;ajax({url:opts.content,success:function(data){_this.doms.contentBox.innerHTML = data;opts.callback && opts.callback(data);}})},loadIframe:function(opts){var _this = this,iframe = document.createElement('iframe');this.alert(opts);this.doms.contentOuter.removeChild(this.doms.btnBox);this.doms.btnEnter.onclick = null;iframe.src = opts.content;iframe.style.width = '100%';iframe.style.height = '100%';iframe.frameborder = '0'_this.doms.contentBox.innerHTML = '';_this.doms.contentBox.appendChild(iframe);iframe.attachEvent ? (iframe.attachEvent = _load) : (iframe.onload = _load);function _load(){opts.callback && opts.callback(iframe);};},close:function(){var db = document.body;db.removeChild(this.doms.overlayer);db.removeChild(this.doms.contentOuter);isIE6 && db.removeChild(this.doms.overlayIframe);this.doms.btnEnter.onclick = this.doms.btnCancel.onclick = this.doms.close.onclick = this.doms.contentTitle.onmousedown = null;this.doms = null;isOpen = false;}};dialog.prototype.init.prototype = dialog.prototype;win.regMethod = function(scope,handler){return scope[handler]= dialog();};/**********************************私有方法*******************************************************/function extend(subClass,superClass){for(var key in superClass) subClass[key] = superClass[key];return subClass;};function createElements(opts){var db = document.body,h = Math.max(document.documentElement.clientHeight,document.body.offsetHeight);var width = opts.width,height = opts.height;var overlayer = createEl('<div id="dialog_overlayer" style="position:absolute;top:0;left:0;width:100%;height:'+h+'px;background:#000;opacity:.5;filter: Alpha(Opacity=50);"></div>',db),overlayIframe = isIE6 && createEl('<iframe marginwidth="0" marginheight="0" align="top" scrolling="no" frameborder="0" class="dialog_HideSelect" src="" style="position:absolute;top:0;left:0;width:100%;height:'+h+'px;filter: Alpha(Opacity=0);"></iframe>',db),contentOuter = createEl('<div id="dialog_window" style="position:fixed;_position:absolute;top:50%;left:50%;width:'+width+'px;"></div>',db),contentTitle = createEl('<div id="dialog_title"><h3>'+ (opts.title || tips.title) +'</h3></div>',contentOuter),close = createEl('<a href="#" id="dialog_btn_close" >'+ tips.close +'</a>',contentTitle),contentBox = createEl('<div id="dialog_Content" style="height:'+height+'px;"></div>',contentOuter),btnBox = createEl('<div id="dialog_btnBox"></div>',contentOuter),btnEnter = createEl('<button type="button" id="dialog_btn_enter">'+ (opts.enter||tips.enter) +'</button>',btnBox),btnCancel = createEl('<button type="button" id="dialog_btn_cancel">'+(opts.cancel|| tips.cancel) +'</button>')return {overlayer:overlayer,overlayIframe:overlayIframe,contentOuter:contentOuter,contentTitle:contentTitle,close:close,contentBox:contentBox,btnBox:btnBox,btnEnter:btnEnter,btnCancel:btnCancel};};function createEl(str,parent){var div = document.createElement('div'),el;div.innerHTML = str;el = div.firstChild;return parent ? parent.appendChild(el) : el;};function setCenter(doms){var T = doms.contentOuter,w = T.offsetWidth,h = T.offsetHeight,timer = null;var dd = document.documentElement,W = dd.clientWidth,H = dd.clientHeight; T.style.top = (H-h)/2+'px';T.style.left = (W-w)/2+'px';if(isIE6){window.onscroll = function(){if(timer) clearTimeout(timer);timer = setTimeout(function(){var t = Math.max(document.body.scrollTop,document.documentElement.scrollTop);T.style.top = (t+H-h)/2+'px';},100);}}};function getMousePos(e){e = e || window.event;if(e.pageX || e.pageY) return { left:e.pageX,top:e.pageY};return {left:e.clientX + document.documentElement.scrollLeft - document.body.clientLeft,top:e.clientY + document.documentElement.scrollTop - document.body.clientTop};};function addEvent(el,type,fn){if(el.addEventListener != undefined){el.addEventListener(type,fn,false);}else if(el.attachEvent != undefined){el.attachEvent('on'+type,fn)}else{el['on'+type] = fn;};};function removeEvent(el,type,fn){if(el.removeEventListener != undefined){el.removeEventListener(type,fn,false);}else if(el.detachEvent != undefined){el.detachEvent('on'+type,fn);}else{el['on'+type] = function(){};};};function move(oldPos,target,t,l){return function(e){var newPos = getMousePos(e);target.style.top = t + (newPos.top - oldPos.top) + 'px';target.style.left = l + (newPos.left - oldPos.left) + 'px';};};function getElementPos(el){var x = 0,y=0;if(el.getBoundingClientRect){var pos = el.getBoundingClientRect();var d_root = document.documentElement,db = document.body;x = pos.left + Math.max(d_root.scrollLeft,db.scrollLeft) - d_root.clientLeft;y = pos.top + Math.max(d_root.scrollTop,db.scrollTop) - d_root.clientTop;}else{while(el != db){x += el.offsetLeft;y += el.offsetTop;el = el.offsetParent;};};return {x:x,y:y};};function ajax(opts){var xhr = null;var set = extend({type:'GET',url:''},opts||{});if(typeof window.XMLHttpRequest != 'undefined'){xhr = new window.XMLHttpRequest();}else{xhr = new ActiveXObject('MSXML2.XmlHttp.6.0');};xhr.open(set.type,set.url);xhr.onreadystatechange = function(){if(xhr.readyState == 4){if(xhr.status >= 200 && xhr.status <= 304 ){set.success && set.success(xhr.responseText);}else{set.failure && set.failure(xhr.status);};};};xhr.send(null);}
})(window);

HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><title></title>
</head>
<body style="height:2000px;"><input type="button" name="" value="alert" id="btn_alert" /><input type="button" name="" value="confirm" id="btn_confirm" /><input type="button" name="" value="prompt" id="btn_prompt" /><input type="button" name="" value="load" id="btn_load" /><input type="button" name="" value="loadIframe" id="btn_loadIframe" /><select><option name="" value="1">test</option><option name="" value="1">test</option><option name="" value="1">test</option></select><script type="text/javascript" src="dialog.js"></script><script type="text/javascript">var btn_alert = document.getElementById('btn_alert'),btn_confirm = document.getElementById('btn_confirm'),btn_prompt = document.getElementById('btn_prompt'),btn_load = document.getElementById('btn_load'),btn_loadIframe = document.getElementById('btn_loadIframe');regMethod(window,'sbi');btn_alert.onclick = function(){sbi.alert({'content':'你现在测试的是alert!'})};btn_confirm.onclick = function(){sbi.confirm({'content':'你现在测试的是confirm!','callback':function(v){alert(v)}})};btn_prompt.onclick = function(){sbi.prompt({'content':'你现在测试的是prompt!','defaultValue':"说点什么吧,亲!",'callback':function(v){alert(v)}})};btn_load.onclick = function(){sbi.load({'content':'loadTest.html','callback':function(v){alert('内容加载完成!')}})};btn_loadIframe.onclick = function(){sbi.loadIframe({'content':'http://www.baidu.com','height':300,'width':500,'callback':function(v){alert('iframe内容加载完成!')}})};</script>
</body>
</html>

CSS:

* {padding: 0;margin: 0;}
body {font-family: ;font-size: 12px;}
#dialog_window{ background: #fff; width: 400px;border: 2px solid #999;}
#dialog_title {background: #f8f8f8; padding: 0 10px; height: 36px; line-height: 36px; text-align: right; cursor: move;}
#dialog_title h3 {font-size: 12px; color: #333; float: left;}
a#dialog_btn_close { color: #333; text-decoration: none;}
#dialog_Content { padding: 10px; clear: both;}
#dialog_btnBox {padding: 5px 0; background: #f8f8f8; text-align: center;}
#dialog_btn_enter, #dialog_btn_cancel { display: inline-block; *display: inline; *zoom:1; padding: 5px 15px; background: blue; color: #fff;margin-right: 10px;border: 0;}
#diaglo_prompt_input { display:block; border: 1px solid #ddd; padding: 5px; width:90%; margin: 8px 0;}

说明:对外提供了alert,confirm,prompt,load,loadIframe,close 6个方法,前三种不需要解释了吧,load方法就是用ajax加载一个HTML代码片断,loadIframe就是加载一个iframe了,close则是关闭当前显示的弹窗。

注意:为了避免命名冲突,我这里写了一个注册命名空间的函数regMethod,比如你取个名字为fuck,那么在调用alert等方法之前要调用 regMethod(window,'fuck');这样就可以这样调用fuck.alert(),fuck.confirm(),又比如你有自己的JS库,有自己的对象,你也可以直接把它注册到你的对象上var xx00 = {}, regMethod(window,xx00['dialog']);这样就可以通过xxoo.dialog.alert(),xxoo.dialog.confirm()来调用了。

转载于:https://www.cnblogs.com/sky000/archive/2013/02/05/2892953.html

模拟alert,confirm,prompt相关推荐

  1. Python+Selenium UI自动化 - alert/confirm/prompt窗口处理方法

    WebDriver中处理原生JS的alert.confirm以及prompt非常方便,三种弹出窗口均无法直接通过页面元素定位,不关闭窗口无法在页面上做其他操作 语法:         text:返回a ...

  2. jQuery Alert Dialogs (Alert, Confirm, Prompt Replacements)(翻译)

    前不久在官方网站是看见这个插件,所以今天趁有空就看了一下,随便给大家共享一下.也许你早已知道了 ,如果是这样那请跳过,不要拍砖. 这个Jquery插件的目的是替代JavaScript的标准函数aler ...

  3. Coolite(二)服务器端Alert,Confirm,Prompt

    一:Alert      Alert组件最简单的用法就是直接弹出一个消息提示框: protected void Button_Click(object sender, AjaxEventArgs e) ...

  4. JS的三种消息提示框alert confirm prompt

    首先来看看alert的效果: 代码为: $(function(){$("#quit").click(quit); })function quit(){alert("消息提 ...

  5. html对话框跳转页面,html页面的简单对话框(alert, confirm, prompt)

    html页面简单的三种对话框如下: 1.alert(),最简单的提示框: alert("你好!"); 2.confirm(),有确认和取消两个按钮: if(confirm(&quo ...

  6. JavaScript弹出对话框的三种方式-alert()-confirm()-prompt()

    一.alert()警告框(确定) alert()方法是显示一条弹出提示消息和确认按钮的警告框. 需要注意的是 : alert()是一个阻塞的函数,如果不点确认按钮,后面的内容就不会加载出来. 使用方式 ...

  7. cefsharp重写默认js弹窗(alert/confirm/prompt)

    1.设置js弹窗控制器 webView.JsDialogHandler = this;  //js弹窗控制 this表示本类对象,所以本类要实现IJsDialogHandler接口 2.实现IJsDi ...

  8. jquery.alerts.js模拟js的alert,confirm的插件

    为什么80%的码农都做不了架构师?>>>    在http://www.aceona.com/网站发现的模拟alert confirm的插件. http://labs.abeauti ...

  9. 给Jquery添加alert,prompt方法,类似系统的Alert,Prompt,可以响应键盘,支持拖动...

    我们在调用系统的Alert,prompt的弹出提示时,不同的系统会有不同的提示框,视觉效果不统一,而且不好看,功能单一,现在我们通过Jquery模拟Alert,prompt,现实统一视觉效果,而且内容 ...

最新文章

  1. Nat. Mach. Intell. | 深度神经网络中的捷径学习
  2. SharePoint 数据迁移解决方案
  3. C# 修改项目文件夹名称完全版
  4. Oracle用rowid删除同一张表的重复记录
  5. Python机器学习:线型回归法007多元线性回归和正规方程的解
  6. 战网下载CDN重定向失败_卧槽,又开源一个下载神器,利用各种平台下载任意文件...
  7. 杭电5253连接的管道
  8. 前台 时不时报 could not proxy request_长春中考成绩不理想可以报的高中
  9. 南京中山陵环卫工和游客当众互殴(图)
  10. 清华大学梁宸计算机系,2015年自主招生--五大联赛银牌争夺战
  11. python版本AES CBC 模式ECA加密逻辑
  12. wifi连接一段时间才能上网_Win7系统下连接wifi一段时间就自动断线怎么办【图文】...
  13. C语言串口通信R8T8,K60-串口通信
  14. ISO22000认证|企业申请ISO22000认证资料自查
  15. IBM将自愿离职变常态 柳传志教你优雅回应裁员
  16. 软件测试相关简要记录
  17. mysql给定一段日期,获取日期范围内的每一天
  18. luffcc项目-13-积分抵扣、发起支付、
  19. matplotlib工具栏源码探析四(自定义工具项图标)
  20. MOS管驱动电路详解

热门文章

  1. [模仿微软Live.cn]JavaScript输入邮箱自动提示
  2. VB高效导入Excel2003和Excel2007文件到MSHFlexGrid控件显示
  3. Unity3D学习笔记(二) 一些常用的空间函数
  4. Leetcode Permutation Sequence
  5. Delphi编码及注释规范
  6. python中间是什么意思_中间代码说明
  7. mysql 主键 uniqo_项目总结,彻底掌握NodeJS中如何使用Sequelize
  8. 验证Linux主机是否支持RDMA
  9. java vertx http_佛系学习Vert.x之创建你的HttpServer
  10. leetcode算法题--剪绳子 II