逻辑上模拟整个与服务器通信的过程。
在没有真正与服务器通信的时候,如何写这样的ajax请求。

先根据页面结构创建一个静态数据(JSON)

var arrival_address_data={"code":0,"message":"success","data":[
{"id":0,"current":0,"name":"SHINYA NAKAHATA","type":1,"company":"5050 INTERNATIONAL
CO.,LTD.","city":"HONG KONG","state":"CAUSEWAY BAY","postcode":" ","address_line_0":" 2/F, ETON TOWER, 8HYSAN
AVENUE","address_line_1":" ","address_line_2":" ","country":"CHINA","phone":"+852 (2910) 7769"},
{"id":1,"current":1,"name":"SHINYA NAKAHATA","type":1,"company":"5050 INTERNATIONAL
CO.,LTD.","city":"HONG KONG","state":"CAUSEWAY BAY","postcode":" ","address_line_0":" 2/F, ETON TOWER, 8HYSAN
AVENUE","address_line_1":" ","address_line_2":" ","country":"CHINA","phone":"+852 (2910) 7769"},
{"id":2,"current":0,"name":"SHINYA NAKAHATA","type":1,"company":"5050 INTERNATIONAL
CO.,LTD.","city":"HONG KONG","state":"CAUSEWAY BAY","postcode":" ","address_line_0":" 2/F, ETON TOWER, 8HYSAN
AVENUE","address_line_1":" ","address_line_2":" ","country":"CHINA","phone":"+852 (2910) 7769"},
{"id":3,"current":0,"name":"SHINYA NAKAHATA","type":1,"company":"5050
INTERNATIONAL CO.,LTD.","city":"HONG KONG","state":"CAUSEWAY BAY","postcode":" ","address_line_0":" 2/F, ETON
TOWER, 8HYSAN AVENUE","address_line_1":" ","address_line_2":" ","country":"CHINA","phone":"+852 (2910)
7769"},
{"id":4,"current":0,"name":"SHINYA NAKAHATA","type":1,"company":"5050
INTERNATIONAL CO.,LTD.","city":"HONG KONG","state":"CAUSEWAY BAY","postcode":" ","address_line_0":" 2/F, ETON
TOWER, 8HYSAN AVENUE","address_line_1":" ","address_line_2":" ","country":"CHINA","phone":"+852 (2910) 7769"}
]};

data

整个数据将被传入回调函数,回调函数做出ajax请求完成与否的判断,执行数据创建的方法。
当然,也可以从回调函数直接执行要执行的方法,再进去数据创建方法内部去判断code:0还是code:1。

ajax方法形如:

function setAddAjax(){
new RequestAjax("",null,arrfun_address_box,null,arrival_address_data,'GET');
}

这些静态数据和请求方法(接口)通常写在公用的public.js内。
而回调函数就在执行的js中。

回调函数形如:

function arrfun_address_box(data){
if(data.code==0){
creatAdd.setData(data);
}else{
alert(data.message);
}
}

可见请求方法(接口)中的第三个参数即是回调函数,
倒数第二即是静态数据,与服务器连同并获取动态数据以后,该位置上的参数可以置为null。

creatAdd.setData是一个实例化的类var creatAdd = 类
中的setData方法。
它的作用是循环遍历传入的数据data,也就是上面的arrival_address_data。
将要用的数据解析出来。

该类就是一个自创建HTML结构的封装。

在其构造函数内,
可以设一个数组,因为想要创建多个区块,那么还是把他们整齐的排列好以备后用:

this._itemArr=[];

一个表示当今写入的父级div的标识变量:

this._content=document.createElement("div");

当然该div参数将作为构造函数参数传入。
后面自然有构造函数下属方法的初始化,譬如:

this.createsingleBox;

还有最后一句将整个内容加入父级div的appendChild语句。

document.getElementById(div).appendChild(this._content);

剩下的就是用prototype丰满该构造函数的羽翼。

构造函数后面紧接着的是数据解析方法:
他必定有一个循环结构

for(var i=0;i<data.data.length;i++){
var singleBox=this.createsingleBox(data.data[i]);
}

它的主要职能就是把data[i]的数据传入到singleBox对象中,也就是creatsingleBox方法。
当然这个循环中还可以做更多的事情,比如
将每个创建好的singleBox循环加入父级,

this._content.appendChild(singleBox);

给singleBox对象设定css样式,

singleBox.style.marginBottom="20px";

存储它的某个属性值

singleBox.id="add_"+data.data[i].id;

把创建好的盒子存储起来,

this._itemArr.push(singleBox);

显然数组是有序排列的,序号和i相对相应了,其他功能就用得到。

在整个创建结构方法的末尾,

CreatAddressBox.prototype.createsingleBox=function (data){
... ...
return singleBox;
}

将这个创建好的对象返回,否则它怎么才能有序的被存储起来呢。

经过以上的过程,动态的结构已经被创建,并且是经过了ajax请求的过程。
但所谓动态,不光被创建,还要被删除。

删除也要走ajax请求这条路,同步删除服务器上的数据。

数据还是一样的数据。

请求方法需要有一个id作为参数。

//arrival_info.html---address delete 更改code的值测试删除失败与成功,id即是后台也成功删除了的id
var arrival_address_delete_data={"code":0,"message":"success","id":0};
function setAddDeleteAjax(id){
var obj={"id":id};
new RequestAjax("",obj,arrfun_address_box_delete_complete,null,arrival_address_delete_data,'POST');
}

回调函数来执行删除自己的方法。

该方法需要传入数据data。

//回调函数接收需要删除的那个数据的data
function arrfun_address_box_delete_complete(data){
creatAdd.deleteSelf(data);
}

此处没有作判断,那么在类的内部肯定还是要判断ajax请求成功与否。

类内部,整个需要被删除的数据被传入到实例化后的creatAdd对象内,供其方法进行分析。
首先经过getDeleteItemId对比,然后deleteSelf调用getDeleteItemId方法时,才能继续执行下去。

//delete self
CreatAddressBox.prototype.deleteSelf=function (data){ var deleteId=this.getDeleteItemId(data.id);
if(data.code==0){
this._content.removeChild(this._itemArr[deleteId]);
this._itemArr[deleteId]=null;
}else{
alert("删除失败");
}
CreatAddressBox.prototype.getDeleteItemId=function (id){
for(var i=0;i<this._itemArr.length;i++){
if(id==this._itemArr[i].value){
return i;
}
}
return -1;
}

前提是setData方法内部必须已经将singleBox的id传出

singleBox.value=data.data[i].id;

那么getDeleteItemId方法将正确对比ajax删除请求返回的id,在本地找到要删除的id,将它传给deleteSelf方法。

在innerHTML或者创建的删除按钮上绑定事件,事件指向的是执行方法,同时将按钮所在的数据id传出。

onclick='deleteAddbox("+data.id+");'

执行方法将调用ajax请求方法(接口)

function deleteAddbox(id){
setAddDeleteAjax(id);
}

习惯而已,也仅仅是留出一个位置,在执行方法里可以做更多事情。整个逻辑就这样。

删除按钮按下去的时候可以加一些提示信息,
比如一个滚动的ajax loading图标,它将被创建在singleBox中,

contentDeleteLoading.src="data:images/member/arrival/ajax-loader1.gif";

在进入回调函数的时候即可以让它显示出来,而执行到下一步(成功或者失败)的时候隐藏。

一段提示删除失败的文字。

contentDeleteFialText.innerHTML="删除失败!";

在请求失败时(data.code==1){

$(a).find('.failed').css({display:'block'});
}

如此,ajax逻辑基本完成。

Ajax页面逻辑的更多相关文章

  1. Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面

    摘要:介绍了使用Scrapy处理JSON API和AJAX页面的方法 有时候,你会发现你要爬取的页面并不存在HTML源码,譬如,在浏览器打开http://localhost:9312/static/, ...

  2. 使用服务器端控制AJAX页面缓存

    你知道 response.setHeader("Cache-Control","no-cache"); 这条语句是干什么的吗? 这是用来防止浏览器缓存动态内容生 ...

  3. C#抓取AJAX页面的内容

    原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面 ...

  4. 微信小程序教学第三章(含视频):小程序中级实战教程:列表-页面逻辑处理

    § 页面逻辑处理 本文配套视频地址: https://v.qq.com/x/page/n0554dndrez.html 开始前请把 ch3-2 分支中的 code/ 目录导入微信开发工具 修改 ind ...

  5. ajax 页面无刷新

    <!-- 使用原生Ajax 和 $.ajax 实现局部刷新的过程 --><!-- 封装通用XMLHttpRequest对象 --><!DOCTYPE html>&l ...

  6. pushState、replaceState、onpopstate 实现Ajax页面的前进后退刷新

    使用Ajax可以异步获取数据,可以更高效地渲染页面. 但也存在这一些问题: 再刷新页面,页面就会变成初始的状态 浏览器的前进后退功能无效 对搜索引擎的爬虫抓取不友好 1. 早前会使用浏览器的 hash ...

  7. AJAX 页面数据传递

    $.ajax({ //一个Ajax过程 type: "post", //以post方式与后台沟通 url: "personstockajax.php", //与 ...

  8. 用C#抓取AJAX页面的内容

    现在的网页有相当一部分是采用了AJAX技术,不管是采用C#中的WebClient还是HttpRequest都得不到正确的结果,因为这些脚本是在服务器发送完毕后才执行的! 但我们用IE浏览页面时是正常的 ...

  9. ajax页面排序的序号问题

    文章是从我的个人博客上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com 目前使用的ajax排序是这样的. 每个table , 都要这样声明 ( table 中必须有2个属性: ...

随机推荐

  1. android 27 ListView

    效果: 上图中ArrarAdapter是数组的适配器,CursorAdapter是游标适配器,用于操作数据库的数据. ListView是垂直列表,数据源是集合或者数组,这些View都是安卓里的Adap ...

  2. 动态添加子视图 UIView 的正确方法

    很多时候哥比较喜欢用代码添加视图,特别是要同时加很多UIView时,而且跟 xib 比起来代码更容易管理,在多人的项目中代码不容易 conflict. 但小牛哥最近发现很多新人都不太清楚正确的使用方法 ...

  3. Java基础知识强化之集合框架笔记30:集合之泛型的引入

    1. 泛型的引入: (1)首先我们看看下面这一段代码,如下: package cn.itcast_01; import java.util.ArrayList; import java.util.It ...

  4. Android(java)学习笔记206:利用开源SmartImageView优化网易新闻RSS客户端

    1.我们自己编写的SmartImageView会有很多漏洞,但是我们幸运的可以在网上利用开源项目的,开源项目中有很多成熟的代码,比如SmartImageView都编写的很成熟的 国内我们经常用到htt ...

  5. oracle数组定义与使用

    定义固定长度的一维数组 type type_array is varray(10) of varchar2(20); 1.varray(10)表示定义长度为10的数组 2.varchar2(20)表示 ...

  6. CSS3伪类nth-child结合transiton动画实现文字若影若现

    css3伪类nth-child结合transiton动画实现文字若影若现收先创建一个div盒子,然后包裹在div中的有10个span标签每个span标签填上内容一次为A,B,C,D,E,F,G,H,I ...

  7. DataReader反射泛型对象

    昨天听同学说,要把DataReader对象转成实体对象,要写一个通用的方法.想了下用反射应该可以做到.项目中一般都是用第三方组件来做数据访问层,如,Nhibernate.ef等.于是自己想写个简单例子 ...

  8. 【SSMS增强工具】SQL Sharper 2014介绍

    产品介绍 SQL Sharper是一款SQL Server Management Studio插件,用于数据库对象快速查询.表结构查询.优化查询结果导出.代码生成等方面. 适用人群:T-SQL开发者. ...

  9. mysql locktables

    SELECT      r.trx_id waiting_trx_id,      r.trx_mysql_thread_id waiting_thread,      TIMESTAMPDIFF(  ...

  10. 动软代码生成器三层用于winform

    DBUtility项目中的DbHelperSQL.cs (找自己对应的数据库类型) 修改前20行中的数据库连接字符串获取方式为: //数据库连接字符串(web.config来配置),多数据库可使用Db ...