PHP入门(18)PHP与Ajax

1.什么是Ajax?

是一种创建灵活,交互性强的Web技术,利用其可以实现响应迅速,无刷新的Web应用。Ajax是JavaScript,XML,CSS,DOM等多种技术的组合,Ajax是客户端技术,其编译和执行由浏览器执行。Ajax可以实现在不需要刷新页面的情况下与服务器进行通信,从而减少用户等待的时间,是一种通过javascript可以调用后台服务器获得数据的客户端技术。

Ajax可以把一部分由服务器负担的工作转移到客户端,利用客户端的资源进行处理,减轻服务器负担。

2.Ajax技术组成。

Ajax的最核心的技术是XMLHttpRequest对象,它是一个具有应用程序接口的javascript对象,可以使用http协议连接服务器,通过XMLHttpRequest,Ajax可以像桌面应用程序一样,只向服务器进行数据层面的交换,而不用刷新整个页面。

XMLHttpRequest对象在发送请求和处理请求之前,必须要初始化该对象。由于XMLHttpRequest不是一个W3C标准,对于不同服务器有不同的初始化方法。根据浏览器的不同,可以分为两种(IE与非IE)。为了实现程序的兼容性,可以使用下面的代码初始化XMLHttpRequest对象。

<script language="JavaScript">
    var http_request;
    if(window.XMLHttpRequest){
        http_request = new XMLHttpRequest();
    }else if(window.ActiveXObject){
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        }catch(e){
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
</script>

XMLHttpRequest对象的常用方法

(1)open(method,url,asynFlag)

该方法向指定的url发送请求。

method请求类型 POST或者GET

URL 请求的地址

aysnFlag 请求的方式,同步为true,异步则为false 默认是true

(2)send(content)

该方法向服务器发送请求,如果声明为异步,则该方法立即返回,否则将等待接收到响应为止。

content用于指定发送的数据。

(3)setRequestHeader(label,value) 设置HTTP头设置值,必须在open()方法之后才能调用

(4)abort() 停止当前异步请求

(5)getAllResponseHeaders()

以字符串的形式返回完整的HTTP头信息

XMLHttpRequest对象常用的属性值

onreadystateChange 每次状态改变都会触发这个事件处理器,通常会调用一个javascript函数

readyState(请求的状态 可以取五个值 0未初始化,1正在加载,2已加载,3交互中,4完成)

responseText 服务器的响应,表示为字符串

responseXML 服务器的响应,表示为XML

status(返回服务器的状态码,200成功,202请求被接受,400错误的请求,404文件未被找到,500内部服务器错误)

statusText(返回HTTP状态码对应的文本)

XMLHttpRequest对象与服务器交互一般经历以下三个步骤

  1. 初始化XMLHttpRequest对象
  2. 设置请求状态和返回处理函数
  3. 发送HTTP请求

下面通过一个小例子来说明以下,我们通过XMLHttpRequest对象来请求一个html文件的内容。

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script language="javascript">
        var xmlhttp;
        function createXMLhttp() {
            if (window.XMLHttpRequest) {
                xmlhttp = new XMLHttpRequest();
            } else if (window.ActiveXObject) {
                try {
                    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                }
            }
            if(xmlhttp){
                //alert("xmlhttp created");
            }else{
                xmlhttp = false;
                //alert("xmlhttp not created");
            }
            return xmlhttp;
        }
        function ReqHtml(){
            createXMLhttp();
            xmlhttp.onreadystatechange = StatHandler;
            xmlhttp.open("GET","text.html",true);
            xmlhttp.send(null);
        }
        function StatHandler(){
            if(xmlhttp.readyState == 0 ){
                //alert("1");
            }
            if(xmlhttp.readyState == 1 ){
                //alert("2");
            }
            if(xmlhttp.readyState == 3){
               //alert("3");
            }
            if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
                //alert(xmlhttp.status);
                document.getElementById("webpage").innerHTML = xmlhttp.responseText;
            }
        }
    </script>
</head>
<body>
<a href="#" onclick="ReqHtml();">通过XMLHttpRequest对象请求html文件</a>
<div id="webpage"></div>
</body>

html文件的内容很简单 只有一个字符串 hello world这里不再给出,当点击超链接的时候,出现hello world

3.Ajax如何与PHP交互

主要有两种方式 get 和 post

(1)get

当向url传递参数的时候,应该直接加在open方法的url的后面。

例如

xmlhttp.open("GET","searchrst.php?cont="+cont,true);

下面我们通过XMLHttpRequest对象向后台服务器请求数据并且显示出来。关键代码如下

/*conn.php*/
<?php
$mysqli = new mysqli("localhost","root","123456","mydb") or die("数据库连接失败!".$mysqli->errno);
/*index.html*/
function showresult(){
    createXMLhttp();//初始化XMLHttpRequest对象
    var cont = document.getElementById("searchtxt").value;//获取表单的值
    xmlhttp.onreadystatechange = StatHandler;//设置回调函数
    xmlhttp.open("GET","searchrst.php?cont="+cont,true);//通过get方法向传参数
    xmlhttp.send(null);
}
function StatHandler(){
    if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
        document.getElementById("webpage").innerHTML = xmlhttp.responseText;
    }
}
/*表单部分*/
<form name="searchform" id="searchform" method="get" action="#">
    <label for="searchtxt">请输入关键字</label>
    <input name="searchtxt" id="searchtxt" type="text">
    <input type="button" value="查询" onclick="showresult()">
</form>
<div id="webpage"></div>  <!-- 这里会显示向数据库查询的结果-->
/*searchtxt.php*/
<?php
header("Content-type:text/html;charset=utf-8");
include_once("conn/conn.php");
$cont = $_GET["cont"];
$res = $mysqli->query("select * from mytb where id=".$cont);
if($row = $res->fetch_assoc()){
    echo $row["name"];/*reponseText的值*/
}

(2)post

当向url传递参数的时候,应该使用XMLHttpRequest的send()方法。

例如传递username为tom ,password为123456应该使用

var post_method = "username="+username+"&password"+password;
xmlhttp.open("POST","searchtxt.php",true);
xmlhttp.onreadystatechange=StatHandler;
xmlhttp.send(post_method);/*传递的参数*/

实现上面同样功能的代码如下

/index.html/
function showresult(){
    createXMLhttp();
    var cont = document.getElementById("searchtxt").value;
    //alert(cont);
    var value = "cont=" + cont; //注意 javascript使用加号连接字符串的,一开始用的.,调了很久
    //alert(value);
    xmlhttp.onreadystatechange = StatHandler;//下面两行代码不能丢 如果使用post传递数据的话,
    //设置content-type的值为application/x-www-form-urlencoded
    xmlhttp.open("POST","searchrst.php",true);
    xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
    xmlhttp.send(value);//发送url参数
}
function StatHandler(){
    if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
        alert("ok");
        document.getElementById("webpage").innerHTML = xmlhttp.responseText;
    }
}
<form name="searchform" id="searchform" method="post" action="#"><!--这里需要改-->
    <label for="searchtxt">请输入关键字</label>
    <input name="searchtxt" id="searchtxt" type="text">
    <input type="button" value="查询" onclick="showresult()"><!--这里是button,不是submit-->
</form>
<div id="webpage"></div>
/*searchtxt.php*/
<?php
header("Content-type:text/html;charset=utf-8");
include_once("conn/conn.php");
$cont = $_POST["cont"]; /*由于使用post方法进行交互,这里需要改为$_POST*/
$res = $mysqli->query("select * from mytb where id=".$cont);
if($row = $res->fetch_assoc()){
    echo $row["name"];//reponseText
}

4.Ajax的缺点

由于Ajax主要依赖于XMLHttpRequest对象,由于XMLHttpRequest对象的实例在处理完事件之后就会被销毁,如果不进行封装处理,下次需要使用该对象时还需要重新构建,每次调用都要写一大段代码,使用起来很不方便。

解决办法:可以使用开源的Ajax框架,很多开源Ajax框架都对XMLHttpRequest对象进行了封装,比如JQuery。使用JQuery可以使用简单的几行代码实现非常复杂的交互。关于JQuery的使用方法,可以自行查找资料学习。这里不再赘述。

时间: 2024-12-07 07:57:25

PHP入门(18)PHP与Ajax的相关文章

ASP.NET MVC 入门11、使用AJAX

asp.net mvc 支持微软自身Ajax 和 JQuery框架 asp.net mvc View视图可以理解为 一个包含"<%%>"变量引和的模板. Script与HTML优雅分离参见: http://www.cnblogs.com/QLeelulu/archive/2008/10/22/1317214.html ASP.NET MVC 入门11.使用AJAX

Ajax入门介绍以及用Ajax写helloworld

1:  Ajax被认为是(Asynchronous  JavaScript and XML的缩写).现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax. Ajax:一种不用刷新整个页面便可与服务器通讯的办法 2:用ajax编写一个helloworld的小程序,在超链接中弹出文本框中的内容. <script type="text/javascript"> window.onload=function(){ //1:获取a节点,并对其添加onclick()相应

Flask快速入门(18) — 信号

Flask快速入门(18) - 信号 作用:Flask框架中的信号基于blinker,其主要就是让开发者可以在flask请求过程中定制一些用户行为 安装:pip install blinker 内置信号: request_started = _signals.signal('request-started') # 请求到来前执行 request_finished = _signals.signal('request-finished') # 请求结束后执行 before_render_templ

Dojo入门:增强的Ajax功能

随着Web技术的发展,RIA似乎已经成了主流,Ajax也随之成了不可或缺的部分.Ajax是异步的javascript和Xml,虽然现在很多交互的数据格式都不再严格的采用XML,但这种异步的操作却越来越流行了.目前主流的JS工具包都包含了Ajax的功能,dojo也有自己的Ajax框架XHR. XHR框架 XHR框架是dojo对ajax支持的一组方法,允许想服务器端发出get.post.put.delete请求,这些方法包括: xhrGet xhrPost xhrPut xhrDelete 所有这些

[转]ASP.NET MVC 入门11、使用AJAX

在ASP.NET MVC beta发布之前,M$就宣布支持开源的JS框架jQuery,然后ASP.NET MVC beta发布后,你建立一个ASP.NET MVC beta的项目后,你可以在项目的scripts目录下找到ASP.NET AJAX和jQuery的JS.反正我是比较喜欢jQuery的,所以对于M$此举还是挺欣慰的. 废话不多说,我们使用AJAX来实现发表评论的功能吧.先来看看怎样使用M$的JS框架来进行异步AJAX请求. 首先,当然是要引入M$的AJAX框架的JS: <script 

Selenium入门18 断言

自动化测试需对比实际结果与预期结果,给出测试结论. 1 条件判断 if ...else... 2 assert ... #coding:utf-8 #断言 from selenium import webdriver dr = webdriver.Firefox() dr.get("http://www.baidu.com") #if判断 if '百度' in dr.title: print("test pass") else: print("test f

python入门18 继承和多态

继承:子类继承父类的属性和方法  class 子类名(父类1,父类2) 多态:子类重写父类的方法 判断对象是否是某个类的实例:  isinstance(object,class) 父类-汽车类 #coding:utf-8 #/usr/bin/python """ 2018-11-18 dinghanhua 继承 多态 """ '''定义一个父类-汽车类 无参构造函数,私有属性speed,方法start,speedup(每次速度+10),speed

Java Ajax入门

接下来整理一下Ajax相关的内容,AJAX(asynchronous js and xml),即异步的JavaScript和xml,它的主要作用就是让页面不必等待服务器返回整个页面信息,而可以通过异步的方式给服务器发送数据和获取数据,对页面进行局部刷新,是一种提高用户体验的技术. 同步和异步 同步和异步的主要区别如下: (1)同步:一个响应结束后才能发送下一个请求,页面在请求期间不能做其他事情. (2)异步:不必等待一个响应结束,可以异步的给服务器发送请求,页面在异步请求期间可以继续操作,可以对

ASP.NET MVC4入门到精通系列目录汇总(转)

序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,Web开发依旧停留在拖控件的水平,最最基本的算 法,递归.排序(我不要求快速排序,你会冒泡就行了)都不会,数据库方面,很基础的SQL都写不出,分组过滤也不会,更别提性能了,问下数据优化经验,除 了回答加索引基本就没下文了.当然,一些过去N年都是做ASP.NET WebForm开发的,不熟悉MVC,那也没

JFreeChart与AJAX+JSON+ECharts两种处理方式生成热词统计可视化图表

本篇的思想:对HDFS获取的数据进行两种不同的可视化图表处理方式.第一种JFreeChar可视化处理生成图片文件查看.第二种AJAX+JSON+ECharts实现可视化图表,并呈现于浏览器上.   对此,给出代码示例,通过网络爬虫技术,将上传到HDFS的新浪网新闻信息实现热词统计功能,通过图表的柱状图来显示出来. ------> 目录: 1.JFreeChart可视化处理(生成本地图片) [1]HDFS文件读取 [2]JDFreeChart库应用 2.AJAX+JSON+EChart生成可视化图