扩展DIV实现嵌套读取AJAX页面

使用<div id="DIV的标识" type="数字" ajaxurl="地址"></div>

 XML格式大体如下:

<? xml version="1.0" encoding="utf-8"  ?>
< root >
    
< styletype  id ="0"  imgsrc ="images/loading/loading.gif" > 读取中....... </ styletype >
     < styletype  id ="1" > <![CDATA[ 读取中....<br><img src='images/loading/loadingbar2.gif' /> ]]> </ styletype >
</ root >

即使用XML定义的id=对应数字的样式来嵌套读取AJAX。

比如a.htm :

<div id="da" type="0" ajaxurl="b.htm"></div>

b.htm :

<div id="db" type="1" ajaxurl="c.htm"></div>
<div id="dc" type="1" ajaxurl="d.htm"></div>

c.htm :

rtrtrtrtrtrtrt

d.htm:

aaaaaaaaaaaa

打开a.htm在DIV da中读取b.htm,然后da中即拥有db,dc两层,然后程序在db,dc中分别读取c.htm和d.htm

直到嵌套结束

代码如下: 

var  ajax  =   {
        
// 是不是第一次
        firstTime : true,
        
//同步检测队列数组
        arr: new $A(),
        that: 
false,
        init : 
function() {
            
// 首先, 查看浏览器是否能执行此脚本(有些浏览器不能用getElementsByTagName)
            if (!document.getElementsByTagName) {
                
return;
            }


            
this.that = this;
            
this.run();
            
        }
,
        
/**
        *  遍历document中的所有div,如果有属性ajaxurl,则应用此脚本
        *
        *
*/

        run : 
function() {
            
// 获取所有DIV层
            var divs = document.getElementsByTagName("div");
            
// 获取所有SPAN层
            var spans = document.getElementsByTagName("span");
            
// divs转化成数组并加入所有DIV层
            divs = new $A(divs);
            
// divs加入所有SPAN层
            for(var u=0;u < spans.length; u++{
                divs.push(spans[u]);
            }

            
// 首次装载: 把所有层加入队列arr
            if(this.arr.length == 0 && this.firstTime) {
                
this.firstTime = false;
                
for (var i=0; i < divs.length; i++{
                    
this.arr = this.arr.concat(divs[i].id);
                }

            }

            
// 非首次: 现有层与执行完的队列做差集,得出未处理的新层
            else {
                
for(var j=0;j < divs.length; j++{
                    
for (var i=0; i < this.arr.length; i++{                    
                        
if(divs[j].id == this.arr[i]) {
                            divs.splice(j,
1);
                        }

                    }
                    
                }

            }

            
// 对未处理层进行循环,然后执行AJAX操作
            for (var i=0; i < divs.length; i++{
                
var thisDiv = divs[i];
                
                
if (thisDiv.getAttribute('ajaxurl')!=null{
                    
this.makeAjax(thisDiv);
                    
// 处理完成后加入队列
                    this.arr = this.arr.concat(thisDiv.id);
                }

            }

            
        }
,
        
// 执行AJAX前先应用样式
        makeAjax : function(theDiv) {
            
var url = theDiv.getAttribute('ajaxurl');
            
var typeval = theDiv.getAttribute('type');

            
if(json.result.length == null)
                theDiv.innerHTML 
= "<div align=center style='position:relative;'><img src='" + json.result.styletype.imgsrc + "'/> " + json.result.styletype.content + "</div>";
            
else                
                theDiv.innerHTML 
= "<div align=center style='position:relative;'>" + json.result[parseInt(typeval)].styletype.content + "</div>";
            
// 执行AJAX

            setTimeout(
"doAjax('" + theDiv.id + "','" + url +"')",1000);
        }
,
        
// 将"读取中"的过场效果提供给其他程序引用
        runAjax : function(theDiv) {
            
// var url = theDiv.getAttribute('ajaxurl');
            var typeval = theDiv.getAttribute('type');
            
if(typeval==null)
                typeval
="0";
            
if(json.result.length == null)
                theDiv.innerHTML 
= "<div align=center style='position:relative;top:50%;height:100%'><img src='" + json.result.styletype.imgsrc + "'/> " + json.result.styletype.content + "</div>";
            
else                
                theDiv.innerHTML 
= "<div align=center style='position:relative;top:50%;height:100%'>" + json.result[parseInt(typeval)].styletype.content + "</div>";        
        }

        

}

//  初始化
function  ajaxInit()  {
// 通过URL读取JSON来获得样式
    new Ajax.Request('Controller/GetJSon.ashx?name=ajaxdiv',{onComplete: continuerun});
    
}

//  应用JSON样式,然后继续级联处理
function  continuerun(e)  {
    eval(e.responseText);    
    ajax.init();
}

//  处理完AJAX后的回调
function  doAfter(e)  {
    ajax.run();
}


//  具体的AJAX操作
function  doAjax (id,url,pars)  {
    
new Ajax.Updater(id,'Controller/GetHtmlPage.ashx?page='+url,{parameters: pars,evalScripts: true,onComplete: doAfter});
}



//  observe模式在window onload时加入ajax级联功能
Event.observe(window,  ' load ' , ajaxInit,  false );

 

使用方法:

    代码依赖 prototype.js 使用时须下载 prototype1.4以上版本

    其中// 通过URL读取JSON来获得样式
       new Ajax.Request('Controller/GetJSon.ashx?name=ajaxdiv',{onComplete: continuerun});

GetJSon.ashx内容为,读取XML,并把它转换为JSON形式:,XML格式定义如下:

<? xml version="1.0" encoding="utf-8"  ?>
< root >
    
< styletype  id ="0"  imgsrc ="images/loading/loading.gif" > 读取中....... </ styletype >
     < styletype  id ="1" > <![CDATA[ 读取中....<br><img src='images/loading/loadingbar2.gif' /> ]]> </ styletype >
</ root >

该XML为AJAX读取页面前所显示的样式的定义,例如id=0时,则为图片+读取中......;

id=1时为读取中.....+<br>+长条图片

关于XML转化JSON,请参考《.NET中利用Ebay的XSLT模板转换XML到JSON

// 具体的AJAX操作

Controller/GetHtmlPage.ashx?page='+url  为简单代理页,它为ajax提供了预处理,包括字符集,缓存等: 

public   void  ProcessRequest(HttpContext context)
        
{
            
lock(this)
            
{
                
// 取得系统相对路径
                string path = ConfigurationSettings.AppSettings["serverrelpath"];
                
// 设置头信息
                context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
                context.Response.CacheControl 
= "no-cache";
                
// 获取固定参数
                string page = context.Request.Params["page"];
                
// 获取其他参数
                string[] querys = context.Request.QueryString.AllKeys;
                
string querystring = null;
                
// 组装其他参数
                if(querys.Length != 1
                
{
                    
foreach(string query in querys) 
                    
{
                        
if(!query.Equals("page"))
                            querystring 
+= "&"+query+"=" + context.Request.Params[query];
                    }

                    
// 有参跳转
                    context.Response.Redirect(path + page + querystring);
                }

                
// 无参跳转
                context.Response.Redirect(path + page);
            }

        }


        
public   bool  IsReusable
        
{
            
get
            
{
                
// TODO:  添加 GetHtmlPage.IsReusable getter 实现
                return true;
            }

        }


        
#endregion
    }

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值