AJAX 高级(一)
2020-02-10 21:24

该实例通过ThinkPHP结合Ajax与mysql实现了客户端的通信功能,具体如下:

AJAX 请求实例

我们已看到 AJAX 可被用来创建更多交互性的应用程序。

1、使用js的ajax局部刷新功能,每次刷新将数据库中读取出的新记录插入到页面的显示区域,代码如下:

AJAX Suggest实例

在下面的 AJAX 例子中,我们会演示当用户向一个标准的 HTML 表单中输入数据时网页如何与 web 服务器进行通信。

window.onload =setInterval(showWords1000);//加载完成之后开始执行刷新功能

在文本框中输入名字......

function showWords()//刷新时被调用函数,实现ajax请求   {    xmlHttp=GetXmlHttpObject();//从自定义的函数中获取请求对象。    if (xmlHttp==null)    {     alert ("Browser does not support HTTP Request")     return;    }    var url="index.php?g=Ksks&m=Comments&a=refresh";//要请求的路径使用shuipfcms框架,所以g是分组,m是action控制器,a是模板    url=url+"&data_id="+$("#data_id").val();//接上,data_id传的参数,用于查询数据库的id    url=url+"&lasttime="+$("i").last().siblings('input').val();//lasttime是页面显示数据的最后一个记录的时间戳,查找时根据大于这个时间戳的条件查找    xmlHttp.onreadystatechange=stateChanged;//响应状态改变时调用的函数    xmlHttp.open("GET",url,true);//使用get方法提交    xmlHttp.send();//上面传参之后,这句可要可不要   }   function stateChanged() //实现向页面插入数据功能   {   var str ="";    if(xmlHttp.readyState==4 || xmlHttp.readyState=="complete")    {     eval("var arrs="+xmlHttp.responseText);//获取由action响应输出的数据,因为数据室php数组格式,需用eval或json转化成js数组格式     var chdiv=$("#conversation_history");//通信聊天记录框     for(var j=0;j<arrs.length;j++){//循环插入数据        var obj=$("<tr><td><h3></h3></td><td></td></tr>");//定义页面当中记录框的html格式代码    var i=$("<i>  "+arrs[j].times+"</i><input type='hidden' value='"+arrs[j].times+"'>");//i标签i为thinkphp定义的直接将时间输出到input隐藏并且存储得到数据里面的聊天发送时间    var p=$("<p></p>");    p.html(arrs[j].content);//聊天内容    p.append(i);    var h3value=arrs[j].name;//发送的作者    obj.find("h3").html(h3value+":");    if(h3value=="主持人")    {obj.find("h3").addClass("presenter");}//主持人会特别显示    obj.find("td:last").append(p);        chdiv.append(obj);//追加到table里面     }     chdiv.parent().scrollTop(chdiv.parent()[0].scrollHeight+0);//滚动到底部    }   }

例子解释 - HTML表单

表单的 HTML 代码:

<form> 
First Name:<input type="text" id="txt1" onkeyup="showHint(this.value)" />
</form>

<p>Suggestions: <span id="txtHint"></span></p> 

 

正如您看到的,这是一个简单的带有名为 "txt1" 输入域的 HTML 表单。输入域的事件属性定义了一个由 onkeyup 事件触发的函数。

表单下面的段落包含了一个名为 "txtHint" 的 span,这个 span 充当了由 web 服务器所取回的数据的位置占位符。

当用户输入数据时,名为 "showHint()" 的函数就会被执行。函数的执行是由 "onkeyup" 事件触发的。另外需要说明的是,当用户在文本域中输入数据时把手指从键盘按键上移开时,函数 showHint 就会被调用。

function GetXmlHttpObject()//定义ajax请求对象   {    var xmlHttp=null;    try    {     // Firefox, Opera 8.0+, Safari     xmlHttp=new XMLHttpRequest();    }    catch (e)    {     //Internet Explorer     try     {      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");     }     catch (e)     {      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");     }    }    return xmlHttp;   }

例子解释 - showHint() 函数

showHint() 函数是一个位于 HTML 页面 head 部分的很简单的 JavaScript 函数。

此函数包含以下代码:

function showHint(str)
{

  if (str.length==0)
    { 
    document.getElementById("txtHint").innerHTML="";
    return;
    }

  xmlHttp=GetXmlHttpObject()
  
  if (xmlHttp==null)
    {
    alert ("您的浏览器不支持AJAX!");
    return;
    }

var url="gethint.asp";
url=url+"?q="+str;
url=url+"&sid="+Math.random();
xmlHttp.onreadystatechange=stateChanged;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}

 

每当有字符输入文本框时,此函数就会执行。

假如文本域中存在某些输入,函数就会执行:

  • 定义回传数据的服务器的 url(文件名)
  • 使用文本框的内容向 url 添加参数(q)
  • 添加一个随机的数字,以防止服务器使用某个已缓存的文件
  • 创建一个 XMLHTTP 对象,并告知此对象当某个改变被触发时执行名为 stateChanged 的函数
  • 向服务器发送一个 HTTP 请求
  • 如果输入域为空,此函数仅仅会清空 txtHint 占位符的内容

2、action控制器,代码如下:

例子解释 - GetXmlHttpObject() 函数

上面的例子可调用名为 GetXmlHttpObject() 的函数。

此函数的作用是解决为不同浏览器创建不同的 XMLHTTP 对象的问题。

这是此函数的代码:

function GetXmlHttpObject()
{
  var xmlHttp=null;
  try
    {
    // Firefox, Opera 8.0+, Safari
    xmlHttp=new XMLHttpRequest();
    }
  catch (e)
    {
    // Internet Explorer
    try
      {
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
      }
    catch (e)
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    }
  return xmlHttp;
}

 

function refresh(){
   $data_id = I('get.data_id');//获得嘉宾id
   $lasttime = I('get.lasttime');
   //print_r(date("Y-m-d H:i:s",$lasttime));
   if(!$data_id)
    $this->error("该访谈不存在!"); 
   $data = M("ksks_words_memoir");
   
   //print_r(date('Y-m-d H:i:s',$lasttime));
   if(!$data)
    $this->error("初始化数据失败!");
   //$words = $data->where(array('dataid' => $data_id))->order('time asc')->select();
   //print_r($data->where(array('time' => $lasttime))->select());
   $where['time'] = array('gt',$lasttime);
   $count = $data->where($where)->count();
   //print_r(date("Y-m-d H:i:s",$lasttime));
   $words = $data->where($where)->select();
   $datas = array();//要返回的数组
   $i = 0;
   foreach($words as $word)
   {
    $datas[$i]['name'] = $word['name'];
    $datas[$i]['content'] = $word['content'];
    $datas[$i]['times'] = date('Y-m-d H:i:s',$word['time']);
    $lasttime = $word['time'];
    $i = $i+1;
   }
   setCookie('lasttime',$lasttime);
   $datas = json_encode($datas);
   //$this->cache();
   echo $datas;
 }

例子解释 - stateChanged() 函数

stateChanged() 函数包含下面的代码:

function stateChanged() 

  if (xmlHttp.readyState==4)
  { 
  document.getElementById("txtHint").innerHTML=xmlHttp.responseText;
  }
}

 

每当 XMLHTTP 对象的状态发生改变时,stateChanged() 函数就会执行。

当状态变更为 4(“完成”)时,txtHint 占位符的内容就被响应文本来填充。

3、聊天页面,代码如下:

AJAX 请求 源代码

<volist name="words" id="vo">
<tr>
<td><h3 <if condition="$vo['name']=='主持人'">class="presenter"</if>>{$vo.name}:</h3></td>
<td>
<div>{$vo.content}<i>  {$vo.time|date="Y-m-d H:i:s",###}</i>
       <input type="hidden" name="time" value="{$vo.time}">
</div>
</td>
</tr>
</volist>

AJAX Suggest 源代码的实例

下面的源代码属于上一节的 AJAX 实例。

您可以拷贝粘贴这些代码,然后亲自测试一下。

AJAX HTML 页面

这是 HTML 页面。它包含了一个简单的 HTML 表单,以及一个指向 JavaScript 的链接。

<html>
<head>
<script src="clienthint.js"></script> 
</head>

<body>

<form> 
First Name:<input type="text" id="txt1" onkeyup="showHint(this.value)" />
</form>

<p>Suggestions: <span id="txtHint"></span></p> 

</body>
</html>

 

下面列出了 JavaScript 代码。

 

上一篇:ThinkPHP实现事务回滚示例代码 下一篇:没有了