欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

原生node.js案例--前后台交互

程序员文章站 2023-11-05 21:17:34
本案例包含4部分:(1)html部分;(2)ajax部分;(3)javascript部分;(4)node服务器部分。另外,因为牵涉到服务器,所以这里没法“效果预览”。 执...

本案例包含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!");
});

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!