AJAX的原理是什么?

实际上就是发起HTTP请求,既然就是发起HTTP请求,那只要我们能够实现发起HTTP请求就可以在不使用AJAX的情况下实现相同的效果。

在前端有好多方式可以发起HTTP请求,比如script标签的src以及图片的src,css背景图片,等等。

案例1:通过HTTP状态码204实现页面无刷新

下面来一个小案例,实现一个页面无刷新的投票功能。

html:

<div id="box">
  <h1>周杰伦</h1>
  <p>0</p>
  <a href="http://127.0.0.1:3000">投票</a>
</div>

nodejs

var http = require('http');
http.createServer(function(req, res){
  res.writeHead(204);
}).listen(3000);

当我们点击投票的时候发出了一条HTTP请求,但是页面并没有跳转,主要是利用HTTP204状态码实现的。

204:意思是我已经接收到了,但是我没有数据要返回给你,请你不用刷新页面.也不要跳转到新的页面。

案例2:利用图片src实现

html:

<div id="box">
  <h1>周杰伦</h1>
  <p>0</p>
  <a href="javascript:getHttp();">投票</a>
</div>

<script>
  function getHttp(){
    var img = new Image();
    img.src = 'http://127.0.0.1:3000';
  }
</script>

nodejs:

var http = require('http');
http.createServer(function(req, res){
  res.writeHead(200,{'Content-type':'text/html'});
  res.end('ok');
}).listen(3000);

如果需要发送数据我们可以在src的后面加上参数,和AJAX的GET方式一模一样。

通过script标签和css来实现,和这里的图片实现方式大同小异这里就不再演示了。

但是以上的几种方式都有一个特点就是,只能发送数据给服务器,但是客户端不能接收服务器返回的数据,并且不能使用POST方式,因此以前方式虽然可以实现,但使用的场景比较小。

下面介绍另外一种方式,它可以解决上面的问题。

利用iframe标签实现页面无刷新。

html:

<div id="box">
  <h1>周杰伦</h1>
  <p>0</p>
  <a href="http://127.0.0.1:3000" target="tou">投票</a>
</div>
<iframe name="tou" frameborder="0"></iframe>

nodejs:

var http = require('http');
http.createServer(function(req, res){
  res.writeHead(200,{'Content-type':'text/html'});
  res.end('ok');
}).listen(3000);

实际上这种方式是有刷新的,不过刷新的是iframe这个框架里面的内容,所有我们就有了利用它的机会,我们只需要把iframe的宽高边框设置成0就好了。

可能你会问虽然现在可以返回数据了,但是怎么操作它呢,其实可以通过返回一段js代码来操作dom。

html:

<div id="box">
  <h1>周杰伦</h1>
  <p id="content">0</p>
  <a href="http://127.0.0.1:3000/1" target="tou">投票</a>
</div>
<iframe name="tou" frameborder="0"></iframe>

nodejs:

var http = require('http');
var fs = require("fs");

var count = 0;
http.createServer(function(req, res){
  if(req.url==="/favicon.ico")return;
  if(req.url==='/index.html'){
    res.writeHead(200,{'Content-type':'text/html'});
    res.end((fs.readFileSync('index.html')).toString());
  }else{

    count++;
    res.writeHead(200,{'Content-type':'text/html'});

    var jsCode = '<script>';
    jsCode += 'parent.document.getElementById("content").innerHTML =' + count;
    jsCode += '</script>';
    res.end(jsCode);
  }

}).listen(3000);

核心代码是加粗的那一段,也就是返回一段js代码,通过parent来操作iframe的上一程。

接着我们再通过iframe + form 来实现POST提交。

html:

<form id="form" action="/1" target="reg">
  姓名:<input type="text">
  年龄:<input type="text">
  <input type="submit" value="提交">
</form>
<iframe name="reg" frameborder="0"></iframe>

nodejs:

var http = require('http');
var fs = require("fs");

http.createServer(function(req, res){
  if(req.url==="/favicon.ico")return;
  if(req.url==='/index.html'){
    res.writeHead(200,{'Content-type':'text/html'});
    res.end((fs.readFileSync('index.html')).toString());
  }else{

    res.writeHead(200,{'Content-type':'text/html'});

    var jsCode = '<script>';
    jsCode += 'parent.document.body.removeChild(parent.document.getElementById("form"));parent.document.body.innerHTML="注册成功!";';
    jsCode += '</script>';
    res.end(jsCode);
}

}).listen(3000);

ok,案例就到这了。

从这些案例上可以看出,所谓的ajax就是发起一个http请求,当然以上方式和ajax多少还是有差别的,ajax内部还是做了一些其他的事情,比如我们接收数据,客户端是没有刷新的,而我们模拟的ajax实际上都是有刷新的(除了利用src以外),不过是使用了一些小伎俩而已。所以在实际开发过程中,还是用ajax比较好,因为客户端和服务器在内部还是做了很多事的,而这些我们是无法模拟出来的。

HTTP与AJAX深入揭秘,不使用AJAX实现页面无刷新的更多相关文章

  1. 浅谈页面无刷新技术ajax

    现在一般网站都是用ajax来实现页面无刷新操作的. 什么是无刷新:ajax可以实现页面与后台的数据交互,用户完全感觉不出页面有任何的刷新,这就是AJAX的无刷新. ajax方法实现: 可以对ajax进 ...

  2. Ajax下载文件(页面无刷新)

    说明:Ajax是无法实现文件传输的,本文只是模拟了Ajax不刷新页面就可以请求并返回数据的效果.实质上还是通过提交form表单来返回文件流的输出. 分步实现逻辑: ajax请求服务器,访问数据库,根据 ...

  3. 基于jQuery的ajax系列之用FormData实现页面无刷新上传

    接着上一篇ajax系列之用jQuery的ajax方法向服务器发出get和post请求写,这篇主要写如何利用ajax和FormData实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方 ...

  4. 让页面无刷新的AJAX、ASP.NET核心知识(9)

    AJAX简介 1.如果没有AJAX 普通的ASP.Net每次执行服务端方法的时候都要刷新当前页面,如果没有ajax,在youku看视频的过程中,就没法提交评论,页面会刷新,视频会被打断. 2.说说AJ ...

  5. ajax 页面无刷新

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

  6. ajax分页2:jquery.pagination +JSON 动态无刷新分页

    静态页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  7. Ajax技术实现页面无刷新跳转

    Ajax实现无刷新显示新的页面 <!DOCTYPE html> <html> <head> <script src="/jquery/jquery- ...

  8. repeater绑定dropdownlist,jquery+ajax页面无刷新,修改dropdownlist默认值

    html代码: <td>                        <asp:HiddenField ID="hiddenchuli" Value='< ...

  9. 浅谈AJAX的基本原理和原生AJAX的基础用法

    一.什么是AJAX? AJAX,即"Asynchronous Javascript And XML",翻译为异步的JavaScript和XML,是一种创建交互式网页应用的网页开发技 ...

随机推荐

  1. [UCSD白板题] Longest Common Subsequence of Three Sequences

    Problem Introduction In this problem, your goal is to compute the length of a longest common subsequ ...

  2. C#的对象赋值

    例如 Class A {       int x = 0;       int y = 0; }   public void test() {       A test1 = new A( );   ...

  3. Android ImageView高度根据图片比例自适应

    设置adjustViewBounds // 是否保持宽高比 <ImageView android:id="@+id/iv_test" android:layout_width ...

  4. idea中maven报错:无效的目标发行版: 1.8

    1.project.pom中修改版本 <maven.compiler.source>1.7</maven.compiler.source><maven.compiler. ...

  5. Android学习笔记之消息机制

    Android的消息机制主要是指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程.   1.为什么要使用Handler? Android规定访问UI只 ...

  6. 团队spring会议1

    一.我们在近期进行了第一次计划会议,会议过程大致如下: 1.确定所做项目的方向: 2.将调查问卷的结果进行统计,做了需求分析,大致了解了用户的想法: 3.确定了团队计划backlog: 4.将任务进行 ...

  7. Knockoutjs 实践入门 (3) 绑定数组

    <form id="form1" runat="server">        <div>            <!--text ...

  8. Java语法糖4:内部类

    内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功 ...

  9. 《你必须知道的.NET》读书笔记二:小OO有大原则

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...

  10. 作业三:代码规范、代码复审、PSP

    一.代码规范 我认为我们编写的代码都需要进行规范的操作,因为如果为了图省事情或者为了减少时间去完成这个编程.在最后检验的时候就会出现一些警告,导致你这次编程的代码出现问题,当出现问题的时候你在回头去检 ...