`
tof.j
  • 浏览: 135419 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类

一套通用的Ajax框架

阅读更多
在这套Ajax代码库中,实现了如下的功能:
1、Ajax远程调用数据
2、通过Ajax异步提交Form表单
3、返回数据后,能够将数据绑定到页面的相关控件内(如:div、select、ul、span等等)
4、让Ajax程序支持浏览器的前进、后退按钮
一、什么是Ajax,他都能做什么?
AJAX全称为“Asynchronous JavaScript and XML”(非同步JavaScript和XML),是一种创建互动式网页应用的网页开发技术。
使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
Ajax不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。就像DHTML应用程序那样,Ajax应用程序必须在众多不同的浏览器和平台上经过严格的测试。随着Ajax的成熟,一些简化Ajax使用方法的程序库也相继问世。同样,也出现了另一种辅助程序设计的技术,为那些不支持JavaScript的用户提供替代功能。
二、核心代码
所谓核心代码就是提供一个能够跨浏览器的Ajax调用代码,这部分代码是后面扩展代码的必备部分,在这部分代码中我们提供了一个创建XMLHttpRequest对象并能够与Web服务器进行异步数据交换。
 
在我写的这些代码中,自定义了两个相关的函数,一个是通用的获取HTML对象函数,还有一个就是自动过滤字符串开头结尾的空格,代码如下:
function $( elementId ) {
  return document.getElementById(elementId);
}

function trim(str){    //删除左右两端的空格
  return str.replace(/(^\s*)|(\s*$)/g, "");
}
 
Ajax的核心代码如下:
 
/*
*  根据不同的浏览器,获取Ajax对象
*/

function getAjaxObject() {
        var xmlHttpRequest;
        //  判断是否把XMLHttpRequest实现为一个本地javascript对象
        if(window.XMLHttpRequest){
        xmlHttpRequest = new XMLHttpRequest();
        }else if(window.ActiveXObject){  //  判断是否支持ActiveX控件
        try{
          //  通过实例化ActiveXObject的一个新实例来创建XMLHttpRequest对象
            xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");  //  msxml3以上版本
        }catch(e){
            try{
              //  通过实例化ActiveXObject的一个新实例来创建XMLHttpRequest对象
              xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");  //  msxml3以下版本
              }catch(e){}
        }
        }
        if ( !xmlHttpRequest ) {
          alert("创建Ajax对象失败,您将无法正常浏览网页");
        }
        return xmlHttpRequest;
}
/*
*  异步方式提交请求
*/

function sendRequestByAjax(method, url, data, dataHandler) {
  //  获取Ajax对象
  request = getAjaxObject();
  //  设置回调函数
  if( !IE4 ){
    request.onload = dataHandler;
  } else {
    request.onreadystatechange = dataHandler;
  }
  request.open(method, url, true);  //  true代表使用异步方式 false代表使用同步方式
  //  处理提交方式
  if ( "get" == method.toLowerCase() ) {
    //  使用GET方式提交数据
    var urls = url.split("?");
    if ( urls[1] == "" || typeof(urls[1]) == "undefined" ) {
      url = urls[0] + "?" + data;
    } else {
      url = urls[0] + "?" + urls[1] + "&" + data;
    }
    data = null;  //   for GET method,request必须为空
     
  } else if ( "post" == method.toLowerCase() ){
    //  使用POST方式提交数据
          request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
      }
  request.send(data);
}
 
三、回调函数以及数据解析
根据Ajax提出者Jesse James Garrett建议,Ajax使用XHTML+CSS来表示信息,使用JavaScript操作DOM(Document Object Model)进行动态显示及交互,使用XML和XSLT进行数据交换及相关操作,由于Opera浏览器不支持XSLT格式对象,也不支持XSLT,所以现在一般情况下都是使用XML进行数据传递。
 
在回调函数中,会出现request的一些相关属性,其代表值如下:
readyState:提供当前 HTML 的就绪状态。
0:请求未初始化
1:请求已经建立,但是还没有发送(还没有调用 send())
2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)
3:请求在处理中,通常响应中已有部分数据可用了
4:响应已完成
status:提供当前HTML的状态码
401:未经授权
403:禁止访问
404:没找到访问页
200:正常
 
回调函数如下所示:
/*
*  返回数据格式为XML的回调函数
*/

function xmlCallBack() {
  //  数据接收完成
  if( request.readyState == 4 ){
    //  数据正常接收
    if( request.status == 200 ){ 
      //  调用XML文件解析函数
      parseXMLMessage();
    } else {
      //  显示错误信息
      alert("Not able to retrieve description"+request.statusText);
    }
  }
}
/*
*  XML文件解析函数
*/

function parseXMLMessage() {
  //  获取返回的XML文件
  var xmlDoc=request.responseXML.documentElement;
  //  解析XML文件
  parseXML("elementId", xmlDoc);
}
/*
*  解析XML文件
*  @param  elementId  要将数据绑定的对象Id
*  @param  xmlDoc    要解析的XML文件
*/

function parseXML(elementId, xmlDoc) {
  //  这里XML文件的格式根据你的自定义,自行修改
  var xmlRoot = xmlDoc.getElementsByTagName("items");
  var dataType = xmlRoot[0].getAttribute("dataType");
  var items = xmlDoc.getElementsByTagName('item');
  switch ( dataType.toLowerCase() ) {
    case "array" :
      //  返回对象为结果集
      bindItems(elementId, items);
      break;
    case "string" :
      //  返回对象为字符串
      bindText(elementId, items[0].childNodes[0].firstChild.nodeValue);
  }
}
 
如果Ajax调用后返回的是一个HTML页面,则可以使用下面的这个回调函数:
/*
*  HTML文件解析函数
*/

function htmlCallBack() {
  if( request.readyState == 4 ){
    if( request.status == 200 ){ 
      parseHTMLMessage();
    } else {
      alert("Not able to retrieve description"+request.statusText);
    }
  }
}
/*
*  解析HTML文件
*/

function parseHTMLMessage() {
  //  获取返回的HTML代码
  var htmlCode = request.responseText;
  //  绑定HTML代码
  bindText("elementId", htmlCode);
}
 
四、数据绑定
数据绑定根据不同的控件类型,可以使用以下两个数据绑定函数,能够实现绑定select控件、ul无序列表、插入HTML代码等:
/*
*  绑定结果集
*/

function bindItems(elementId, items) {
  var elem = $(elementId);
  //  判断要绑定的对象,类型是否匹配
  if ( elem.tagName.toLowerCase() != "select" && elem.tagName.toLowerCase() != "ul" ) {
    alert("数据类型不匹配,无法进行数据绑定");
    return;
  }
  //  绑定select
  if ( elem.tagName.toLowerCase() == "select" ) {
    while ( elem.childNodes.length > 0 ) {
      //  清除现有数据
      elem.removeChild(elem.childNodes[0]);
    }
    // 绑定数据
    for ( var i = 0; i < items.length; i++ ) {
      var option = document.createElement("OPTION");
      var Data = items[i];
        
      option.value = Data.childNodes[0].firstChild.nodeValue;
      option.text = Data.childNodes[1].firstChild.nodeValue;
        
      elem.options.add(option);
    }
  } else if ( elem.tagName.toLowerCase() == "ul" ) {
    //  绑定ul列表
    elem.innerHTML = "";
    // bind data
    for ( var i = 0; i < items.length; i++ ) {
      var Data = items[i];
      var urlAddress = Data.childNodes[0].firstChild.nodeValue;
      var showText = Data.childNodes[1].firstChild.nodeValue;
      var innerCode = "<li><a href=\"" + urlAddress + "\" title=\"" + showText + "\">" + showText + "</a></li>";
      elem.innerHTML += innerCode;
    }
  }
}
/*
*  绑定字符串,也可以实现绑定HTML代码
*/

function bindText(elementId, value) {
  var elem = $(elementId);
  //  分析绑定对象类型
  switch ( elem.tagName.toLowerCase() ) {
  case "div":
  case "span":
  case "textarea":
    elem.innerHTML = value;
    break;
  case "input":
    elem.value = value;
    break;
    default:
      alert("数据类型不匹配,无法进行数据绑定");
      return;
  }
  saveHistory(elementId);     //  保存历史记录用于实现浏览器的前进、后退按钮
}
五、进阶功能——实现Ajax提交Form表单
通过Ajax提交Form有以下两个非常重要的地方:
1、需要解析所有Form中的控件,将控件拼成类似于“?param1=value1&param2=value2......”这样的字符串,然后通过“POST”模式异步提交,将上面拼成的字符串通过request.send(data)发送到服务器。
2、关于文件上传,由于我没有这方面的需求,没有写出一个测试后的代码,但通过查阅相关资料,看到可以通过隐藏IFrame来实现这一功能。
 
通过Ajax异步提交表单的代码如下:
/*
*  通过Ajax异步提交表单
*/

function submitFormByAjax(formId) { 
  sendRequestByAjax($(formId).method, $(formId).getAttributeNode("action").value, encodeFormData($(formId)), htmlCallBack);
}
 
解析Form内控件,并拼成字符串的函数如下:
/*
*  分析Form表单数据
*  @param  formElement  Form对象
*/

function encodeFormData(formElement) {
  var whereClause = "";
  var and = "";
  for ( i = 0 ; i < formElement.length ; i++ ) {
    var element = formElement[i];
    if ( element.name != "" ) {
      if (element.type=='select-one') {
        element_value = element.options[element.selectedIndex].value;
      } else if ( element.type == 'checkbox' || element.type == 'radio' ) {
        if ( element.checked == false ) {
          break;    
        }
        element_value = trim(element.value);
      } else {
        element_value = trim(element.value);
      }
      whereClause += and + trim(element.name) + '=' + element_value.replace(/\&/g,"%26");
      and = "&"
    }
  }
  return whereClause;
}
六、进阶功能——实现浏览器的前进、后退按钮
很多人在使用了Ajax技术后会发现,浏览器的前进、后退按钮无效了,大大降低了用户体验,曾经这一点也被作为Ajax技术的弊端而大范围讨论,后来经过不断的尝试,终于实现了这一功能,听起来很简答,就是通过一个隐藏的IFrame,使用JavaScript改变IFrame的src属性而激活浏览器的前进、后退按钮。再通过一个特殊的JavaScript函数,实现更新页面数据。
 
具体的代码如下:
var historyValue = new Array(10); //    保存记录的最大次数
var historyCount = 0;

/*
*  保存历史记录
*  @param  elementId  要保存的区域ID
*/

function saveHistory(elementId) {
  //  "historyFrame"隐藏的IFrame的ID属性值
  var iframeDocument = $("historyFrame");
  if ( iframeDocument != null ) {
    if ( historyCount == 9 ) {
      historyCount = 0;
    } else {
      historyCount++;
    }
    historyValue[historyCount] = new Array(2);
    historyValue[historyCount][0] = elementId;
    var element = $(elementId);
    historyValue[historyCount][1] = element.innerHTML;
    iframeDocument.src = "/history.jsp?" + historyCount;
  }
}
/*
*  获取历史记录
*  @param  historyIndex  历史记录索引号
*/

function getHistory(historyIndex) {
  if ( historyIndex != historyCount ) {
    if ( historyValue[historyIndex] ) {
      historyCount = historyIndex;
    }
    var element = $(historyValue[historyCount][0]);
    element.innerHTML = historyValue[historyCount][1];
  }
}
 
history.jsp页面中的代码很简单,只有以下代码:
<script>
var url=window.location.href;
if(url.indexOf('?')>-1)
{
     parent.getHistory(url.substr(url.indexOf('?')+1));
     document.write(window.location.search.substr(1));
}

</script>
 
在页面最下端记得写上下面的代码:
<iframe id="historyFrame" name="historyFrame" src="/history.jsp?0" height="0px" frameborder="no"></iframe>

    下面是java中生成xml的方法:

        PrintWriter out = response.getWriter();
        StringBuffer buffer = new StringBuffer();
        out.println("<?xml version=\"1.0\" encoding=\"gbk\"?>");
        for (int i = 0; i < 10; i++) {
            buffer.append("\n\t<children>");
            buffer.append("\n\t\t<id>").append(1)
                   .append("</id>");
            buffer.append("\n\t\t<name>").append(2)
                   .append("</name>");
            buffer.append("\n\t</children>");
        }
        out.println(buffer.toString());

 

分享到:
评论
2 楼 bestwishes 2010-04-16  
1 楼 qintao1203 2008-12-01  
解析json比解析xml简单!

相关推荐

    ASP.NET Ajax框架与组件

    ### ASP.NET Ajax框架与组件详解 #### 一、引言 随着互联网技术的快速发展,用户对于Web应用的体验有了更高的要求。传统的Web应用程序通常需要在每次用户交互时重新加载整个页面,这种做法不仅效率低下,而且用户...

    一套开源的基于纯JS实现的的AJAX框架源码及程序例子

    本资源提供了一套开源的基于纯 JavaScript 实现的 AJAX 框架源码和程序实例,有助于开发者深入理解 AJAX 的工作原理和实践应用。 ### 1. AJAX 基础 - **异步通信**:AJAX 的核心在于异步性,允许在不打断用户交互...

    ajax框架swato官方文档

    ### AJAX框架Swato知识点解析 #### 一、前言 Swato是一款开源的Ajax框架,旨在简化Web应用程序的开发过程,提升用户体验。该框架通过一套集成良好的Java/JavaScript库为开发者提供了一种更加简便的方式来利用AJAX...

    ASP.NET-[其他类别]流风通用管理框架源码.zip

    "流风通用管理框架"是针对ASP.NET平台的一个开源项目,它旨在提供一套通用的、可复用的解决方案,帮助开发者快速搭建企业级应用的后台管理系统。 该框架可能包含了以下关键知识点: 1. **MVC架构**:ASP.NET MVC...

    NET通用权限管理框架_ui_database

    设计结构采用标准三层设计,是一套非常成熟的框架程序,可直接用于大型系统基础框架快速开发,及程序员学习。 1、菜单导航管理 2、操作按钮 3、角色管理 4、部门管理 5、用户管理(用户权限) 6、用户组管理(设置...

    ASPnet+Extjs+网站通用后台框架

    ASP.NET + ExtJS + 网站通用后台框架是一个基于微软的ASP.NET技术和Sencha的ExtJS前端框架构建的高效、可复用的网站开发解决方案。这个框架集合了后端的C#编程语言、ASP.NET Web应用程序框架以及SQL数据库管理,为...

    通用WEB框架 Webx.zip

    总的来说,Webx框架通过提供一套完整的开发工具和组件,简化了Java Web应用的开发流程,使得开发者能够更加专注于业务逻辑,而不是基础架构。同时,其良好的扩展性和灵活性使得Webx能够适应不断变化的开发需求,是...

    ASP.net + Extjs 网站通用后台框架

    ASP.NET + ExtJS 网站通用后台框架是一款利用ASP.NET技术和ExtJS 2.2版本构建的高效、灵活的管理界面模板。该框架旨在提供一个标准的后台管理平台,适用于各种类型的Web应用程序,帮助开发者快速搭建功能丰富的管理...

    基于hibernate 通用查询框架,包含查询、分页列表 功能

    1.XML格式数据输出,保证了ajax用户也可以使用Awake框架(基本完成) 2.支持二级缓存(近期完成) 3.关联属性列表展现(近期完成) 4.动态列表生成功能,用户通过界面自行配置想要输出的列表(构思中) 5.动态统计,...

    通用框架S2SH+DWZ

    标题中的“通用框架S2SH+DWZ”指的是一个基于Java的Web开发框架组合,它融合了Struts、Spring和Hibernate三个主要组件,再加上DWZ(UI框架)的使用,为开发者提供了一套完整的后端和前端解决方案。下面将详细阐述...

    dojo-0.4.2-ajax.rar

    Dojo 0.4.2还提供了`dojo.io.bind`,这是一个更为通用的Ajax函数,能够处理更复杂的请求场景,如上传文件或使用流式传输。 在Dojo中,`dojo.data`模块则用于数据存储和检索,它与Ajax结合,可以方便地从服务器获取...

    一套基于ASP.NET+XML+JS实现的通用查询类库源码

    在本项目中,"一套基于ASP.NET+XML+JS实现的通用查询类库源码"使用了ASP.NET作为主要的开发平台,通过VS2005(Visual Studio 2005)进行开发。 【XML的应用】 XML(eXtensible Markup Language)是一种用于标记...

    ajax js和java封装好的工具

    标题中的“ajax js和java封装好的工具”指的是一个已经整合了AJAX、JavaScript以及Java的工具包,方便开发者在基于Struts2框架的应用中快速实现异步数据交互功能。Struts2是一个流行的Java web框架,它允许开发人员...

    通用后台管理界面框架.rar

    可能使用了Bootstrap或其他CSS框架,提供了一套预定义的样式和组件,简化了开发过程。CSS3的引入,如媒体查询、过渡效果和动画,使得界面更加生动和响应式,适应不同设备的显示需求。 五、具体文件解析: 1. "css" ...

    C# 后台框架HTML

    该框架的核心设计理念是提供一套可复用、可扩展的组件和模板,帮助开发者快速搭建企业级的后台应用。 在C#后台框架HTML中,"HADMIN"是一个关键的组成部分,它可能是指一个特定的框架或库,专门设计用于创建后台管理...

    Pentaho_AJAX_Guide_1.2.0.pdf

    3. **动态HTML**:尽管“动态HTML”未包含在“AJAX”这一缩写中,但它在AJAX框架下扮演着至关重要的角色。动态HTML使得网页能够根据用户的操作实时更新内容,无需重新加载整个页面,极大地增强了网页的动态性和响应...

    .netmvc框架

    总的来说,.NET MVC框架提供了一套完整的解决方案,包括了Web开发所需的各种组件和工具,为C#开发者提供了高效、模块化的开发环境,使得构建B/S应用程序变得更加便捷和高效。无论是在小规模项目还是大型企业级应用中...

    通用系统管理模块

    综上所述,通用系统管理模块通过整合SpringMVC、MyBatis、Spring和ExtJS等技术,构建出一套高效、灵活且易于维护的管理平台。对于开发人员来说,理解和掌握这些关键技术有助于提高开发效率,对于企业来说,这样的...

    一套基于flask+layui开发的前后端源码

    在 layui 中,可以利用表格组件实现这些操作的用户界面,通过 AJAX 发送请求至 Flask 后端执行相应的 CRUD 操作。 **文件结构分析** 压缩包中的 "wangye" 文件名可能是项目根目录,里面可能包含以下结构: 1. `...

Global site tag (gtag.js) - Google Analytics