本案例包含4部分:(1)HTML部分;(2)ajax部分;(3)JavaScript部分;(4)node服务器部分。另外,因为牵涉到服务器,所以这里没法“效果预览”。

执行过程为:
(1)在浏览器地址栏输入网址,向node服务器发送HTML请求;服务器接到请求后,返回一个HTML文件给客户端;
(2)客户端浏览器对HTML进行渲染,遇到<script>标签后,再次向服务器请求,服务器响应一个JavaScript文件给客户端,
(3)客户端浏览器对JavaScript文件进行渲染,渲染过程中,如果遇到ajax请求,客户端还会向服务器进行请求,服务器仍然会响应浏览器。
(4)最后,浏览器把渲染好的网页呈现在浏览者面前。
1、HTML部分:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>客户管理系统</title>
</head>
<body>
<div class="box">
<a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="link">NEW CUSTOMER</a>
<h2>
<span class="fir">ID</span>
<span>NAME</span>
<span class="fir">AGE</span>
<span>PHONE</span>
<span>ADDRESS</span>
<span>CONTROL</span>
</h2>
<ul id="conList">
<li>
<span class="fir">1</span>
<span>钱成</span>
<span class="fir">25</span>
<span>13044086186</span>
<span>Bei Jing</span>
<span class="control">
<a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" >修改</a>
<a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" >删除</a>
</span>
</li>
</ul>
</div>
<script charset="utf-8" type="text/javascript" src="js/ajax.js"></script>
<script charset="utf-8" type="text/javascript" src="js/index.js"></script>
</body>
</html>
2、ajax部分:
~function () {
//->createXHR:创建AJAX对象,兼容所有的浏览器
function createXHR() {
var xhr = null,
flag = false,
ary = [
function () {
return new XMLHttpRequest;
},
function () {
return new ActiveXObject("Microsoft.XMLHTTP");
},
function () {
return new ActiveXObject("Msxml2.XMLHTTP");
},
function () {
return new ActiveXObject("Msxml3.XMLHTTP");
}
];
for (var i = 0, len = ary.length; i < len; i++) {
var curFn = ary[i];
try {
xhr = curFn();
createXHR = curFn;
flag = true;
break;
} catch (e) {
}
}
if (!flag) {
throw new Error("your browser is not support ajax,please change your browser,try again!");
}
return xhr;
}
//->ajax:实现AJAX请求的公共方法;
function ajax(options) {
var _default = {
url: "",
type: "get",
dataType: "json",
async: true,
data: null,
getHead: null,
success: null
};
for (var key in options) {
if (options.hasOwnProperty(key)) {
_default[key] = options[key];
}
}
if (_default.type === "get") {
_default.url.indexOf("?") >= 0 ? _default.url += "&" : _default.url += "?";
_default.url += "_=" + Math.random();
}
//->SEND AJAX
var xhr = createXHR();
xhr.open(_default.type, _default.url, _default.async);
xhr.onreadystatechange = function () {
if (/^2\d{2}$/.test(xhr.status)) {
if (xhr.readyState === 2) {
if (typeof _default.getHead === "function") {
_default.getHead.call(xhr);
}
}
if (xhr.readyState === 4) {
var val = xhr.responseText;
if (_default.dataType === "json") {
val = "JSON" in window ? JSON.parse(val) : eval("(" + val + ")");
}
_default.success && _default.success.call(xhr, val);
}
}
};
xhr.send(_default.data);
}
window.ajax = ajax;
}();
3、JavaScript部分:
var customer = (function () {
var conList = document.getElementById('conList');
function bindEvent() {
conList.onclick = function (ev) {
ev = ev || window.event;
var tar = ev.target || ev.srcElement,
tarTag = tar.tagName.toUpperCase(),
tarInn = tar.innerHTML;
if (tarTag === 'A' && tarInn === '删除') {
//->ALERT、CONFIRM、PROMPT
var cusId = tar.getAttribute('data-id'),
flag = window.confirm('确定要删除编号为 [ ' + cusId + ' ] 的客户吗?');
if (flag) {//->点击的是确定按钮:调取对应的API接口实现删除即可
ajax({
url: '/removeInfo?id=' + cusId,
cache: false,
success: function (result) {
if (result && result.code == 0) {
//->删除成功后在HTML结构中移除对应的LI标签
conList.removeChild(tar.parentNode.parentNode);
}
}
});
}
}
}
}
function bindHTML(data) {
var str = '';
for (var i = 0; i < data.length; i++) {
var cur = data[i];
str += '<li>';
str += '<span class="fir">' + cur.id + '</span>';
str += '<span>' + cur.name + '</span>';
str += '<span class="fir">' + cur.age + '</span>';
str += '<span>' + cur.phone + '</span>';
str += '<span>' + cur.address + '</span>';
str += '<span class="control">';
str += '<a href="add.html?id=' + cur.id + '" rel="external nofollow" >修改</a>';
str += '<a href="javascript:;" rel="external nofollow" data-id="' + cur.id + '">删除</a>';
str += '</span>';
str += '</li>';
}
conList.innerHTML = str;
}
return {
init: function () {
ajax({
url: '/getAllList',
type: 'GET',
dataType: 'JSON',
cache: false,
success: function (result) {
if (result && result.code == 0) {
bindHTML(result.data);
bindEvent();
}
}
});
}
}
})();
customer.init();
4、node服务器部分:
var http = require("http");
var url = require("url");
var fs = require("fs");
var server1 = http.createServer(function (request, response) {
var urlObj = url.parse(request.url, true);
var pathname = urlObj.pathname;
var query = urlObj.query;
var reg = /\.(HTML|CSS|JS|ICO)/i;
if (reg.test(pathname)) {
var suffix = reg.exec(pathname)[1].toUpperCase();
var suffixMIME = suffix === 'HTML' ? 'text/html' : (suffix === 'CSS' ? 'text/css' : 'text/javascript');
try {
var conFile = fs.readFileSync('.' + pathname, 'utf-8');
response.writeHead(200, {'content-type': suffixMIME + ';charset=utf-8;'});
response.end(conFile);
//以conFile结束向客户端的响应,即给客户端返回./index.html的全部代码,供客户端渲染成页面。
} catch (e) {
response.writeHead(404, {'content-type': 'text/plain;charset=utf-8;'});
response.end('request file is not found!');
}
return;
}
//->数据API请求处理:客户端的JS代码中我们通过AJAX向服务器发送的请求,服务器接收到请求并且
// 获取客户端传递的数据,把需要的数据内容准备好,然后在返回给客户端,客户端在AJAX的READY
// STATE等于4的时候获取返回的内容(都是按照API的规范文档来处理)
var customData = fs.readFileSync('./json/custom.json', 'utf-8');
customData.length === 0 ? customData = '[]' : null;
customData = JSON.parse(customData);
var result = {
code: 1,
msg: '失败',
data: null
};
var customId = null;
//1)获取所有的客户信息
if (pathname === '/getAllList') {
if (customData.length > 0) {
result = {
code: 0,
msg: '成功',
data: customData
};
}
response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});
response.end(JSON.stringify(result));
return;
}
//2)获取指定的客户信息
if (pathname === '/getInfo') {
customId = query['id'];
customData.forEach(function (item, index) {
if (item['id'] == customId) {
result = {
code: 0,
msg: '成功',
data: item
};
}
});
response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});
response.end(JSON.stringify(result));
return;
}
//3)增加客户信息
if (pathname === '/addInfo') {
var str = '';
request.on('data', function (chunk) {
str += chunk;
});
request.on('end', function () {
var data = JSON.parse(str);
data['id'] = customData.length === 0 ? 1 : parseFloat(customData[customData.length - 1]['id']) + 1;
customData.push(data);
fs.writeFileSync('./json/custom.json', JSON.stringify(customData), 'utf-8');
result = {
code: 0,
msg: '成功'
};
response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});
response.end(JSON.stringify(result));
});
return;
}
//4)修改客户信息
if (pathname === '/updateInfo') {
str = '';
request.on('data', function (chunk) {
str += chunk;
});
request.on('end', function () {
var data = JSON.parse(str),
flag = false;
for (var i = 0; i < customData.length; i++) {
if (data['id'] == customData[i]['id']) {
customData[i] = data;
flag = true;
break;
}
}
if (flag) {
fs.writeFileSync('./json/custom.json', JSON.stringify(customData), 'utf-8');
result = {
code: 0,
msg: '成功'
};
}
response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});
response.end(JSON.stringify(result));
});
return;
}
//5)删除客户信息
if (pathname === '/removeInfo') {
customId = query['id'];
var flag = false;
customData.forEach(function (item, index) {
if (item['id'] == customId) {
customData.splice(index, 1);
flag = true;
}
});
if (flag) {
fs.writeFileSync('./json/custom.json', JSON.stringify(customData), 'utf-8');
result = {
code: 0,
msg: '成功'
};
}
response.writeHead(200, {'content-type': 'application/json;charset=utf-8;'});
response.end(JSON.stringify(result));
return;
}
response.writeHead(404, {'content-type': 'text/plain;charset=utf-8;'});
response.end('request url is not found!');
});
server1.listen(80, function () {
console.log("server is success,listening on 80 port!");
});
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# node.js
# 交互
# SpringMVC前端和后端数据交互总结
# Spring MVC前端与后端5种ajax交互方法【总结】
# jQuery Ajax前后端使用JSON进行交互示例
# SpringMVC实现前端后台交互传递数据
# 利用Node.js+Koa框架实现前后端交互的方法
# JavaEE实现前后台交互的文件上传与下载
# 实现前后端数据交互方法汇总
# 前后台交互过程中json格式如何解析以及如何生成
# Silverlight融合ajax实现前后台数据交互
# 前端ajax的各种与后端交互的姿势
# 客户端
# 的是
# 都是
# 会向
# 移除
# 呈现在
# 过程中
# 客户管理系统
# 面前
# 文档
# control
# ary
# false
# flag
# return
# XMLHTTP
# Jing
# XMLHttpRequest
# ActiveXObject
# Microsoft
相关文章:
如何通过山东自助建站平台快速注册域名?
北京网站制作的公司有哪些,北京白云观官方网站?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何快速启动建站代理加盟业务?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
网站制作员失业,怎样查看自己网站的注册者?
建站之星安装后如何自定义网站颜色与字体?
如何选择可靠的免备案建站服务器?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
企业微网站怎么做,公司网站和公众号有什么区别?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
如何将凡科建站内容保存为本地文件?
网站设计制作企业有哪些,抖音官网主页怎么设置?
建站之星客服服务时间及联系方式如何?
清除minerd进程的简单方法
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何选择高效稳定的ISP建站解决方案?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
大同网页,大同瑞慈医院官网?
再谈Python中的字符串与字符编码(推荐)
如何在云主机快速搭建网站站点?
免费网站制作appp,免费制作app哪个平台好?
网站按钮制作软件,如何实现网页中按钮的自动点击?
建站之星图片链接生成指南:自助建站与智能设计教程
C++中引用和指针有什么区别?(代码说明)
建站OpenVZ教程与优化策略:配置指南与性能提升
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
香港服务器租用费用高吗?如何避免常见误区?
制作网站外包平台,自动化接单网站有哪些?
完全自定义免费建站平台:主题模板在线生成一站式服务
如何在阿里云部署织梦网站?
广州商城建站系统开发成本与周期如何控制?
个人网站制作流程图片大全,个人网站如何注销?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
建站主机服务器选型指南与性能优化方案解析
建站VPS选购需注意哪些关键参数?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
高端网站建设与定制开发一站式解决方案 中企动力
如何用PHP快速搭建CMS系统?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
模具网站制作流程,如何找模具客户?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
制作门户网站的参考文献在哪,小说网站怎么建立?
C#怎么使用委托和事件 C# delegate与event编程方法
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
建站之星如何助力企业快速打造五合一网站?
如何快速搭建高效可靠的建站解决方案?
*请认真填写需求信息,我们会在24小时内与您取得联系。