zoukankan      html  css  js  c++  java
  • 网站右下角弹出通知效果的制作

    很多网站都有通知和消息的弹出窗口,一般都是在右下角部分,而且可以随着页面的滚动始终保持在右下角,且浮动于最上层,也就是说你不会因为点击了当前页面而使得通知窗口隐藏了。重要的一点是,该窗口中的内容是实时从数据库或其他远程部分中取来,不是简单的一个登陆欢迎通知。这当然就是Ajax的强项了。如果这个窗口的CSS做的再漂亮点的话,那效果就更好了。这里,我就说说如何制作这样的弹出窗口。

    首先,要明确我们做的不是简单的通知一次即可的弹出窗口。是需要动态去服务器或其他远程部分如webservice取来数据,这就要求最起码得知道页面的加载和工作流程。应该是这样的:

    1、请求页面Page;

    2、加载Page中的元素;

    3、将Page返回客户端;

    4、执行Page中的JavaScript方法;

    5、在其中一个JavaScript方法中定时调用与服务器交互的方法;

    6、后台执行该方法,返回处理结果(数据库中查询到满足条件的信息,如有新的新闻或邮件);

    7、服务器将结果发送给客户端的JavaScript回调方法;

    8、处理该结果,需要显示时动态生成DIV或者将已存在的DIV样式的display设为block;

    9、关闭通知窗口时销毁该DIV或将其display设为none

    从头写Ajax的东西比较麻烦,这里就用Devexpress的控件代替,可以节约很多开发量的。

    首先,在当前页面Page放一个ASPxCallback组件,设置各项属性如下:

    <dxcb:ASPxCallback ID="ASPxCallback1" runat="server" ClientInstanceName="Callback1"
    OnCallback="ASPxCallback1_Callback">
    <ClientSideEvents CallbackComplete="function(s, e) {
    if(!docEle('newDiv'))
    	openNewDiv('newDiv',e.result);			
         }" />
    </dxcb:ASPxCallback>

    其中ASPxCallback1_CallBack是cs文件对应的回调方法;cs文件中就需要有这个名字的方法:

    protected void ASPxCallback1_Callback(object source, CallbackEventArgs e)
        {
            string strSQL = "you sql here";
            string strResult = "";
            DataSet DS = Exeute(strSQL);
            if (DS.Tables[0].Rows[0][0].ToString()!="0")
            {
                strResult = "<a href='News.aspx' hidefocus=true id='btCommand'><FONT color=#ff0000>here is what you need information</FONT></a>";
            }
            e.Result = strResult;
        }

    返回的就是带有HTML标记的信息内容,之所以在后台处理为带有HTML标记的信息,是为了更好的控制显示消息的格式。

    待服务端返回查询结果后,就可以执行上面ASPxCallBack中的funtion(s,e){}方法了。首先检测通知层newDiv是否以弹出(是否存在),若已弹出则不再弹出新窗口,否则弹出一个通知窗口,位置在右下角。

    具体弹出通知窗口的方法使用JavaScript来实现的:

    <script type="text/javascript">
        function applicationInitHandler() 
    	{
    		window.setInterval("ShowDetails()", 5000);
    	}
    	function ShowDetails() 
    	{
          Callback1.SendCallback();
        }
    </script>
     
    <script language="javascript">
    	var docEle = function() 
    	{
    	    return document.getElementById(arguments[0]) || false;
    	}
    	function openNewDiv(_id,message) 
    	{
    	    if (docEle(_id)) document.body.removeChild(docEle(_id));
    
    	    var newDiv = document.createElement("div");
    		var str = "<table width='100%' cellSpacing=0 cellPadding=0><tr><td align='right' valign='top'>"
    			str+="<SPAN title='your title' style='FONT-WEIGHT: bold; FONT-SIZE: 12px; CURSOR: hand; COLOR: red; MARGIN-RIGHT: 4px' id='btSysClose' >close btn</SPAN>"
    			str+="</td></tr>"  
    			str += "<tr><td>"+message+"</td></tr>" 
    			str+="</table>"
    	    newDiv.id = _id;
    	    newDiv.style.position = "absolute";
    	    newDiv.style.zIndex = "9999";
    	    newDivWidth = 200;
    	    newDivHeight =120;
    	    newDiv.style.width = newDivWidth + "px";
    	    newDiv.style.height = newDivHeight + "px";
    	    newDiv.style.top = (document.body.scrollTop+document.body.clientHeight - newDivHeight) + "px";
    	    newDiv.style.left = (document.body.scrollLeft+document.body.clientWidth - newDivWidth) + "px";
    	    newDiv.style.background = "#EFEFEF";
    	    newDiv.style.border = "1px solid #860001";
    	    newDiv.style.padding = "5px";
    	    newDiv.innerHTML = str ;
    	    document.body.appendChild(newDiv);
    		
    	    var btClose = document.getElementById("btSysClose");  
    	    btClose.onclick = function()
    		{  
    	        if(document.all)
    	        {
    	            window.detachEvent("onscroll",newDivPosition);
    	        }
    	        else
    	        {
    	            window.removeEventListener('scroll',newDivPosition,false);
    	        }
    	        document.body.removeChild(docEle(_id));
    	    }  
    	    function newDivPosition()
    	    {
    			newDiv.style.top = (document.body.scrollTop+document.body.clientHeight - newDivHeight) + "px";
    			newDiv.style.left = (document.body.scrollLeft+document.body.clientWidth - newDivWidth) + "px";
    	    }
    	    if(document.all)
    	    {
    	        window.attachEvent("onscroll",newDivPosition);
    	    }
    	    else
    	    {
    	        window.addEventListener('scroll',newDivPosition,false);
    	    }
    	}    
    </script>
    其中newDivPosition()用来调整通知窗口始终在网页的右下角。document.body.scrollTop表示页面超出浏览器顶端的部分的长度。
    同理document.body.scrollLeft表示超出左边的部分。window.attachEvent("onscroll",newDivPosition); 设置一个关联事件,
    当浏览器页面滚动时,调整弹出窗口的位置。
    这里值得注意的就是window.setInterval("ShowDetails()", 5000); 每隔5秒去服务器端检测有没有新的需要显示的消息。这样才能实现动态
    通知和提醒。
    最后要说的就是,还有种通过JavaScript方法window.createPopup()来创建一个弹出窗口,这个方式有个很大缺陷就是,新弹出的
    通知窗口始终是焦点获得者,致使页面正文无法通过鼠标滚动轴操作和选择文字,除非关掉弹出的窗口,我认为非常不方便。
    这里用层来实现,简单也容易修改样式,就写到这,祝大家好运!
  • 相关阅读:
    搭建consul cluster(三节点)
    php设计模式之:装饰者模式
    php设计模式之:中介者模式
    PECL 和 PEAR
    firefox汉化(利用中文插件)
    数据结构之最小树生成(用php描述)
    php设计模式之:观察者模式
    Ubuntu安装Microsoft Windows Fonts微软字体库
    mysql事物处理
    php数字转中文
  • 原文地址:https://www.cnblogs.com/tristinjet/p/1452109.html
Copyright © 2011-2022 走看看