Ajax-goahead局部刷新页面

软件开发最常用的方法是:C/S,B/S。如果嵌入式设备中使用Ajax,那么既可以使用C/S方式,也可以使用B/S开发上位机。最近公司的一个项目需要异步获取后台数据,使用form更新数据时会有空白卡顿不会很流畅,需要重新加载整个页面。在网上搜了一些资料,发现没有封装好的函数(本来想偷懒呢),都是简单介绍了一下用法。下面是自己封装的goahead-2-5中Ajax 的函数,可以直接使用的;可以在go-ahead 中使用cJson 对上通信。嵌入式设备中cJson/xml/html 三种数据格式,cjson 的代码只有 1000+ 行, 而且只是简单的几个函数的调用,相对于其他两种更节省资源,更易使用;

  goahead-2-5中Ajax 方法的封装类似于form,Asp的封装,用法相对于前两种更简单

  1
  2  /********************************** Description *******************************/
  3
  4  /*
  5   *    This module implements the /ajax handler. It emulates CGI processing
  6   *    but performs this in-process and not as an external process. This enables
  7   *    a very high performance implementation with easy parsing and decoding
  8   *    of query strings and posted data.
  9   */
 10
 11  /*********************************** Includes *********************************/
 12
 13  #include    "wsIntrn.h"
 14
 15  /************************************ Locals **********************************/
 16
 17  static sym_fd_t    ajaxSymtab = -1;            /* Symbol table for ajax handlers */
 18
 19
 20  /************************************* Code ***********************************/
 21  static int websAjaxHandlerDone(webs_t wp);
 22  static void websAjaxHeader(webs_t wp);
 23  /************************************* globle ***********************************/
 24  /*
 25   *    Process a ajax request. Returns 1 always to indicate it handled the URL
 26   */
 27  int websAjaxHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg,
 28      char_t *url, char_t *path, char_t *query)
 29  {
 30      sym_t        *sp;
 31      char_t        ajaxBuf[FNAMESIZE];
 32      char_t        *cp, *ajaxName;
 33      int            (*fn)(void *sock, char_t *path, char_t *args);
 34
 35      a_assert(websValid(wp));
 36      a_assert(url && *url);
 37      a_assert(path && *path == ‘/‘);
 38
 39  /*
 40   *    Extract the ajax name
 41   */
 42      gstrncpy(ajaxBuf, path, TSZ(ajaxBuf));
 43      if ((ajaxName = gstrchr(&ajaxBuf[1], ‘/‘)) == NULL) {
 44          websError(wp, 200, T("Missing ajax name"));
 45          return 1;
 46      }
 47      ajaxName++;
 48      if ((cp = gstrchr(ajaxName, ‘/‘)) != NULL) {
 49          *cp = ‘\0‘;
 50      }
 51
 52  /*
 53   *    Lookup the C ajax function first and then try tcl (no javascript support
 54   *    yet).
 55   */
 56      sp = symLookup(ajaxSymtab, ajaxName);
 57      if (sp == NULL) {
 58          websError(wp, 404, T("Ajax %s is not defined"), ajaxName);
 59      } else {
 60          fn = (int (*)(void *, char_t *, char_t *)) sp->content.value.integer;
 61          a_assert(fn);
 62          if (fn) {
 63  /*
 64   *            For good practice, ajaxs must call websDone()
 65   */
 66              websAjaxHeader(wp);
 67              (*fn)((void*) wp, ajaxName, query); //调用实现函数
 68              websAjaxHandlerDone(wp);
 69
 70  /*
 71   *            Remove the test to force websDone, since this prevents
 72   *            the server "push" from a ajax>
 73   */
 74  #if 0 /* push */
 75              if (websValid(wp)) {
 76                  websError(wp, 200, T("Ajax didn‘t call websDone"));
 77              }
 78  #endif /* push */
 79          }
 80      }
 81      return 1;
 82  }
 83  /******************************************************************************/
 84  /*
 85   *    Define a ajax function in the "ajax" map space.
 86   */
 87
 88  int websAjaxDefine(char_t *name, void (*fn)(webs_t wp, char_t *path,
 89      char_t *query))
 90  {
 91      a_assert(name && *name);
 92      a_assert(fn);
 93
 94      if (fn == NULL) {
 95          return -1;
 96      }
 97
 98      symEnter(ajaxSymtab, name, valueInteger((int) fn), (int) NULL);
 99      return 0;
100  }
101
102  /******************************************************************************/
103
104  /*
105   *    Open the symbol table for ajaxs.
106   */
107
108  void websAjaxOpen()
109  {
110      ajaxSymtab = symOpen(WEBS_SYM_INIT*2);
111  }
112
113  /******************************************************************************/
114  /*
115   *    Close the symbol table for ajaxs.
116   */
117
118  void websAjaxClose()
119  {
120      if (ajaxSymtab != -1) {
121          symClose(ajaxSymtab);
122          ajaxSymtab = -1;
123      }
124  }
125  /**********************************Local********************************************/
126  /*
127   *    Write a webs header. This is a convenience routine to write a common
128   *    header for a Ajax back to the browser.
129   */
130
131  static void websAjaxHeader(webs_t wp)
132  {
133      a_assert(websValid(wp));
134      websWrite(wp, T("HTTP/1.0 200 OK\n"));
135  /*
136   *    By license terms the following line of code must not be modified
137   */
138      websWrite(wp, T("Server: %s\r\n"), WEBS_NAME);
139
140      websWrite(wp, T("Pragma: no-cache\n"));
141      websWrite(wp, T("Cache-control: no-cache\n"));
142      websWrite(wp, T("Content-Type: text/html\n"));
143      websWrite(wp, T("\n"));
144
145  }
146  /******************************************************************************/
147  /*
148   * ajax respone ok
149   */
150  static int websAjaxHandlerDone(webs_t wp)
151  {
152      websDone(wp,200);
153  }

用法:1. 进程初始化时调用 websAjaxOpen();  进程退出时调用  websAjaxClose();2. 服务器端实现XMLHttpRequest应答:   注册Ajax handle函数:  websUrlHandlerDefine(T("/ajax"), NULL, 0, websAjaxHandler, 0);  注册实现方法:   websAjaxDefine("AjaxTest",AjaxTest);3.实现方法:  int AjaxTest(char_t *name, void (*fn)(webs_t wp, char_t *path,     char_t *query))  {    printf("data:%s\n",query); //接收到的数据    websWrite("AjaxTest");      //发送的数据  }web端调用:可以自己实现xmlhttprequest方法,也可以使用jq中的Ajax方法,本人使用的是jq中的方法:
 1    function HttpPostData(data){
 2          //显示等待提示img
 3                $("#loadgif").show();  5                 $.ajax({
 4                    type: "POST",
 5                    contentType: "application/json",
 6                    url: "/ajax/AjaxTest",
 7                    data: data,
 8                    beforeSend:function() {
 9                        document.getElementById("Before").innerHTML = "正在更新数据请稍后......";   //等待提示字样
10                    },
11                    complete: function () {
12              //接收完成
13                        $("#loadgif").hide();
14                                    },
15                    error: function(){
16                           document.getElementById("result").innerHTML = "数据更新失败,稍后更新";
17                          $("#loadgif").hide();
18                                        },
19                    success: function(result) {
20               //接收数据
21                        document.getElementById("result").innerHTML=result;
22                    }
23                });
24    }
25
26 //jq中Ajax使用的是utf-8编码格式,gbk方式会出现乱码,故goahead发送中文时需要进行转码;
27 //后面会更新C#中http的相关例程
希望各位博友多多指教 mail:[email protected]
时间: 2024-10-10 19:59:45

Ajax-goahead局部刷新页面的相关文章

Ajax实时局部刷新

//Ajax实现局部刷新      <script type="text/javascript">    var xmlhttp;    function getData()    {      //获取用户填写的名称      var city=document.getElementById("txt").value;      //创建异步调用对象      xmlhttp=new ActiveXObject("Microsoft.XMLH

Ajax 异步局部刷新

Ajax 异步局部刷新 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 实现json 字符串与 JavaScrip 对象得相互转换 JSON.parse()和 JSON.stringify() 1.序列化(将JavaScrip 转换为 json)使用 JSON.st

ionic局部刷新页面与刷新整个页面

1.全局刷新,禁用缓存: 在app.js中设置cach:false,如下: .state('material', { url: '/material', cache:false, templateUrl: 'templates/commonusefunction/material.html', resolve: load([ 'js/controllers/commonusefunction/materialController.js', ]) }) 2.局部刷新页面,加载一部分数据的情况: 在

jQuery实现局部刷新页面数据绑定

今天遇到了一个问题:怎么样才能做到只刷新页面中的Repeater控件中的数据,在不用UploadPannel的情况下? 试了好多方法,无意间在看jquery文件时发现,使用load()方法即可解决此问题. 代码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title>当前页(WebForm1.a

vue删除表格内的数据后局部刷新页面

遇到的问题:如标题. https://www.cnblogs.com/Yachne/p/11864523.html 上面博客,第一眼没看太懂,所以打算整理一下 解决思路:把调用api,加载数据做成一个方法(onSeach),用created初始化,再在删除/添加方法里重新加载该方法(onSeach),这样就实现了页面局部刷新页面. 另有两个方法会刷新整个页面,造成短暂空白,不太建议用. location.reload() this.$router.go(0) 把加载页面数据的请求做成一个方法 这

ASP.NET使用ajax实现分页局部刷新页面

listview列表实现分页是非常容易的.ListView分页是非常简单的,加上一个DataPager控件,把ListView的ID赋予就可以了.最开始我就是这么写的.(网上有人说这样是伪分页?) <asp:ListView ID="newBlogItems" runat="server" DataSourceID="AccessDataSource1" ViewStateMode="Disabled"> <

利用ajax实现与php数据交互,并局部刷新页面

本文主要有以下几个要点: ajax的基本语法结构 jQuery基本语法 json数组基本结构 ajax回调函数中的json数组解析及局部刷新 php基本语法 ajax与php的对接 php中post数据提交方式与接收 ajax基本语法$.ajax({ type: "post", //数据提交方式(post/get) url: "demo.php", //提交到的url data: {username:username,password:password},//提交的

解决Ajax.BeginForm还是刷新页面的问题

在.net mvc中用Ajax.BeginForm来实现异步提交,在Ajax.BeginForm里面还是可以用submit按钮,一般来说 submit按钮是提交整个页面的数据.但是在Ajax.BeginForm里面使用submit,提交的也只是当前Ajax.BeginForm里面的数据.不过在使用这个东西的时候遇到个问题,就是点击submit按钮,也还是刷新页面了,这时突然感觉Ajax.BeginForm就是个没用的东西.后来想想,不对啊,既然能叫Ajax.BeginForm,那么肯定能够局部刷

JSF中使用f:ajax标签无刷新页面改变数据

ajax本是用在前端的一种异步请求数据的操作,广泛用于js中,一般的js框架如jq都有被封装好的方法,用于发起异步请求操作.异步操作可以增强用户体验和操作,越来越多的程序都在使用ajax.JSF的facelets内置了一个ajax标签,可用于简单的ajax操作. f:ajax 有几个常用属性,分别是:event.listener.render. 1.event:event 对应一个js事件名,该事件名省略了开头的”on“字符,例如点击事件是onclick,那么只需要填入click即可.类似事件还

ajax实现自动刷新页面实例

html部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ajax实现自动刷新</title> </head> <body onLoad="Autofresh()"> <p>现在的时间是:<span id="currenttim