`
weick
  • 浏览: 68981 次
  • 性别: Icon_minigender_1
  • 来自: 天堂的隔壁
社区版块
存档分类
最新评论

模拟弹出消息框

    博客分类:
  • js
阅读更多

模拟一个弹出消息框,有模式。核心接口是open,即弹出消息框,此方法有三个参数,分别代表消息框的标题,需要显示的内容,客户端提供的其他参数(参数间用分号隔开)。

以下是代码,附件是Demo。

 

 

/**
 * 用层来模拟的消息框,有模式
 */
function DivAlert(){
    
    var _jpanel=new Panel();
    var _panelNode=_jpanel.getNode();
    var _bShow=false; //显示提示框的标志
    var _bInModel=false;  //当前是否处于模式状态
    var _model=null;  // 产出模式的层
    var _dragIns=null; //拖动类对象
    var _params=null;  //客户端提供的参数
    var _modelDom=null; //模式层对象
    var _table="<table cellpadding=3 cellspacing=0 style='border-width:1px;border-style:solid;border-color:#eeeeee;background-color:white;width:400px;height:auto;border:1px;background-image:url('bg.gif');background-repeat:repeat-x;'><tr><td style='background-color:#F8F8FF'></td><td style='background-color:#F8F8FF' align='right'><img style='cursor:hand' src='clo.jpg' title='关闭'></td></tr><tr><td style='padding-top:5px' colSpan=2><TABLE cellspacing=0 cellpadding=3><tr><td style='padding-left:3px;'><img align='absmiddle' src='warn.jpg' border=0></td><td noWrap=true></td></tr><tr><td>&nbsp;</td></tr></TABLE></td></tr><tr><td align=center style='padding-bottom:10px'><button>确定</button>&nbsp;<button>取消</button></td></tr></table>"
    _panelNode.innerHTML=_table;
    
    var _domBar=_panelNode.children[0].rows[0] ; //标题栏
    var _domTableContainer=_panelNode.children[0].rows[1].cells[0].children[0];
    var _domContent=_domTableContainer.rows[0].cells[1]; //需要显示的内容
    var _domBtn=_panelNode.children[0].rows[2].cells[0].children[0]; //确定按钮
    var _domClose=_domBar.cells[1].children[0];  //关闭按钮
    var _domCancel=_panelNode.children[0].rows[2].cells[0].children[1]; //取消按钮
     _domClose.onclick=close; //关闭层
     _domBtn.onclick=click;  //确定按钮事件
     _domCancel.onclick=close; //取消按钮事件

   function click(){
       _jpanel.setVis(false);
       if(_bInModel){
           if(_modelDom!=null){
               _modelDom.style.display="none";
           }
       }
       //执行自定义的确定动作,由客户端提供
       if(typeof(window.confirmFct)!="undefined"){
           window.confirmFct();
       }
       _bInModel=false;
   }



    //打开提示框
    this.open=function open($title,$content,$params){
        _params=parseParams($params);
         _panelNode.style.left=document.body.clientWidth/2-120;
         _panelNode.style.top=document.body.clientHeight/2-150;
        _domTableContainer.style.height="auto";
        _domTableContainer.style.width="200px";
        setTitle($title);
        setModel(); //设置模式
        _panelNode.style.zIndex=_modelDom.style.zIndex+1;
        _jpanel.setVis(true);
        setContent($content);
        _domBar.style.cursor="hand";
        try{
               //在这里增加拖动
              //_dragIns = new 拖动类();  TODO
        }catch(e){
            alert(e.description);
        }
        _bShow=true;
    };
    //关闭提示框
    this.close=function close(){
        _jpanel.setVis(false);
        if(_bInModel){
            if(_modelDom!=null){
                _modelDom.style.display="none";
            }
        }
        _bInModel=false;
    };
    //设置提示框的标题
    this.setTitle=function setTitle($title){
        _domBar.cells[0].style.fontSize="12px";
        _domBar.cells[0].style.fontWeight="bold";
        _domBar.cells[0].innerText=$title;
    }
    //设置提示框需要显示的内容
    this.setContent=function setContent($content){
        if(_params['nowrap']!=null){  //提供的内容要求换行
            var reg = new RegExp(";","g");
            $content=$content.replace(reg,"<br>");
        }
        _domContent.innerText=$content;
    }
    //判断提示框是否打开
    this.isOpen=function(){
        return _panelNode.style.visiblity=="visible";
    }
    this.getNode=function(){
        return _panelNode;
    }
    //为body设置模式
    this.setModel=function setModel(){
        if(_model==null){
            _model="<div style='background-color:#ddd;z-index:1000;display:none;position:absolute;filter:Alpha(opacity:50);top:0;left:0;float:left;' id='bodyModel'></div>";
        }
        document.body.insertAdjacentHTML("beforeEnd",_model);
        if(_modelDom==null){
            _modelDom=document.getElementById("bodyModel");
        }
        fixModelLayer();
        _modelDom.style.display="";
        _bInModel=true;
    }
    this.getModelDom=function(){
        if(_modelDom!=null){
            return _modelDom;
        }
    }

    //修正层的大小
    this.fixModelLayer=function fixModelLayer(){
        if(_modelDom==null){
            return;
        }
        if(document.body.scrollLeft>0){
           _modelDom.style.width=window.screen.availWidth + document.body.scrollLeft+ "px";
        }else{
            _modelDom.style.width=document.body.clientWidth+ "px";
        }
        if(document.body.scrollTop>0){
            _modelDom.style.height=window.screen.availHeight + document.body.scrollTop+ "px";
        }else{
            _modelDom.style.height=document.body.clientHeight+ "px";
        }
    }
    //层移动时同时改变模式的大小
    this.changeModelPos=function changeModelPos(){
        if(_modelDom==null){
            return;
        }
        var st=document.body.scrollTop;
        var sw=document.body.scrollLeft;
        if(st!=0){
            _modelDom.style.height=document.body.clientHeight + st + "px";
        }else{
             _modelDom.style.height=document.body.clientHeight + "px";
        }
        
        if(sw!=0){
            _modelDom.style.width=document.body.clientWidth + sw + "px";
        }else{
            _modelDom.style.height=document.body.clientWidth + "px";
        }
    }
}
var _divAlert = new DivAlert();
//拖动提示框的同时调整模式层的大小
function withDrag(){ 
    _divAlert.changeModelPos();
}

//产生一个外围面板
function Panel(){
var _sHtml = "<div style='position:absolute; left:2px; top:2px;z-index:199;color:black;visibility:hidden'></div>";
  var _node = createSpanHTML(_sHtml);

  document.body.insertAdjacentElement("beforeEnd", _node);
 
  //get insert node
  this.getNode = function() {
    return _node;
  };
 // show or hide the layer
 this.setVis = function($bType) {
    _node.style.visibility = $bType?"visible":"hidden";
    _node.style.display = $bType?"":"none";
  };
}

function createSpanHTML($html){
  var node = document.createElement("SPAN");
  node.innerHTML = $html;
  return node.children[0];
}

//解析由分号分隔的参数,格式如nowrap=true;height=100;width=100
function parseParams($params){
  var reg = /([^\=\;]*)\=([^\;]*)/gi;
  var rt = [];
  if ($params==null)
    return rt;
  var ar = $params.match(reg);
  var t = null;
  for (var i=0; i<ar.length; i++) {
    t = ar[i].split("=");
    if (t[1].toUpperCase()=="TRUE") {
      rt[t[0]] = true;
    }else {
      rt[t[0]] = t[1];
    }
  }
  return rt;
}

 

 程序中拖动层的方法还没提供。用IE调试通过,没试过其他浏览器。

必须注意的一点是,在Demo中,调用接口open的代码必须在</body>之后,否则会有document.body不是对象的bug,不知道是不是IE的问题,我调试用IE7。

另外,创建模式的层的大小必须随着提示框的位置而变化(如果提示框被拉出当前窗口之外,即出现垂直或者水平滚动条),这里解决这个问题的思路是,在拖动层的onmouseup的事件函数中同时调用一个函数(以上提供了原型withDrag),这个函数会同时改变模式层的大小。

分享到:
评论
1 楼 weick 2011-01-07  
"在Demo中,调用接口open的代码必须在</body>之后,否则会有document.body不是对象的bug":
最近才知道这不是IE的问题,解决方法见:
http://dean.edwards.name/weblog/2005/09/busted/
http://dean.edwards.name/weblog/2006/06/again/
http://www.thefutureoftheweb.com/blog/adddomloadevent

相关推荐

    Div模拟winows弹出窗口

    Div模拟winows弹出窗口,类似于js中alert消息框!漂亮美化的界面

    ymprompt消息提示组件4.0【js插件弹出框美化版】

    winPos:弹出窗口的位置,支持8种内置位置(c,l,t,r,b,lt,rt,lb,rb)及自定义窗口坐标,默认为c。 各参数意义:c:页面中间,l:页面左侧,t:页面顶部,r:页面右侧,b:页面顶部,lt:左上角,rt:右上角,lb:左下角,rb:右下角 ...

    jQuery模拟JS警告、确认、提示弹出对话框效果.rar

    jQuery模拟JS警告、确认、提示弹出对话框效果.rarjQuery模拟JS警告、确认、提示弹出对话框效果.rarjQuery模拟JS警告、确认、提示弹出对话框效果.rar

    模拟qq右下角信息弹出框

    做一个类似qq登陆成功后右下角的消息弹出框,我保证使用很简单的哦

    ymPrompt弹出框

    在web开发中,对于浏览器默认的消息提示框(如alert,confirm等)外观无法控制,同时我们经常...为了实现更好的界面效果和控制,于是模拟系统的消息提示框及弹出窗口实现了该组件。在外观上可以通过css进行完全的控制。

    ymPrompt.js 消息提示弹出窗口插件.rar

    绝对够味的Js弹出窗口插件,ymPrompt.js 消息提示插件,界面样式绝对漂亮,它可以被定义成弹出消息提示、询问确认框、错误提示、加载网页框架页等功能,相信你会喜欢的。开发背景:在web开发中,对于浏览器默认的...

    漂亮的消息提示框 消息提示组件 Javascript写的

    5、弹出消息框时屏蔽页面其它元素的操作,自动隐藏页面select及iframe下select(无限级select隐藏),并遮罩iframe等元素。 6、页面select控件状态还原时保持原状态,即如果原来select就是隐藏的,则消息框弹出并...

    js实现仿qq消息的弹出窗效果

    这里我们就用js模拟一下qq消息一样的弹出窗,分享给大家供大家参考,具体内容如下 运行效果截图: 直接贴代码: &lt;html&gt; &lt;head&gt; &lt;meta http-equiv=Content-Type content=text/html; charset=gbk /&...

    msnpopup51

    delphi下模拟MSN弹出消息框的控件。

    拓智QQ系统消息广告插件生成器V2.0

    主要功能:能模拟QQ软件弹出与QQ一摸一样的系统消息框,消息内容由使用者自定义。 1.采用高级语言delphi编写,运行效率高。效果逼真,体积小,压缩后仅有0.24MB左右。 2.自动读取本机已经登录QQ的号码,头像,昵称等...

    好看好用的alert提示框

    5、弹出消息框时屏蔽页面其它元素的操作,自动隐藏页面select及iframe下select(无限级select隐藏),并遮罩iframe等元素。 6、页面select控件状态还原时保持原状态,即如果原来select就是隐藏的,则消息框弹出并...

    ymPrompt消息提示组件

    web开发中,对于浏览器默认的消息提示框(如alert,confirm等)外观无法控制,同时我们经常...为了实现更好的界面效果和控制,于是模拟系统的消息提示框及弹出窗口实现了该组件。在外观上可以通过css进行完全的控制。

    ymPrompt消息提示组件 4.0

    在web开发中,对于浏览器默认的消息提示框(如alert,confirm等)外观无法控制,同时我们经常...为了实现更好的界面效果和控制,于是模拟系统的消息提示框及弹出窗口实现了该组件。在外观上可以通过css进行完全的控制。

    JS模拟弹框提示美化插件

    JS模拟弹框提示美化插件是一款纯js编写弹出框、提示框美化插件,支持自定义样式、支持扩展二开。

    C#开发的 《驾考一次过》v2010.5.0 (无需.net框架) part2

    软件简介:  2010公安部最新题库,全国通用版本,功能全面强大,有:练习、模拟考试、进步情况、专题...7.去掉了一个弹出消息框的BUG。 8.去掉了在启动“专题”功能中找不到文件的BUG。 9.取消使用时间和次数的限制。

    C#开发的 《驾考一次过》v2010.5.0 (无需.net框架) part1

    软件简介:  2010公安部最新题库,全国通用版本,功能全面强大,有:练习、模拟考试、进步情况、专题...7.去掉了一个弹出消息框的BUG。 8.去掉了在启动“专题”功能中找不到文件的BUG。 9.取消使用时间和次数的限制。

    aui-artDialog

    功能: 支持锁定屏幕(遮罩)、模拟alert和confirm、多窗口弹出、静止定位、支持Ese键关闭对话框、定时关闭、自定义位置、拖动、鼠标调节窗口大小、换肤…… 优点 兼容主流浏览器: 支持IE6和IE6+, Firefox, chrome, ...

    python PyAutoGUI 模拟鼠标键盘操作和截屏功能

    一款跨平台/无依赖的自动化测试工具,目测只能控制鼠标/键盘/获取屏幕尺寸/弹出消息框/截屏。这篇文章主要介绍了python PyAutoGUI 模拟鼠标键盘操作和截屏功能,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics