<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[AJAX在PHP中的简单使用]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[代码编程]]></category>
<pubDate>Wed, 27 Sep 2006 01:10:13 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	AJAX无疑是2005年炒的最热的Web开发技术之一，当然，这个功劳离不开Google。我只是一个普通开发者，使用AJAX的地方不是特别多，我就简单的把我使用的心得说一下。（本文假设用户已经具有JavaScript、HTML、CSS等基本的Web开发能力）<br/><br/>　　[AJAX介绍]<br/><br/>　　Ajax是使用客户端脚本与Web服务器交换数据的Web应用开发方法。Web页面不用打断交互流程进行重新加裁，就可以动态地更新。使用Ajax，用户可以创建接近本地桌面应用的直接、高可用、更丰富、更动态的Web用户界面。 <br/><br/>　　异步JavaScript和XML（AJAX）不是什么新技术，而是使用几种现有技术——包括级联样式表（CSS）、JavaScript、XHTML、XML和可扩展样式语言转换（XSLT），开发外观及操作类似桌面软件的Web应用软件。 <br/><br/>　　[AJAX执行原理]<br/><br/>　　一个Ajax交互从一个称为XMLHttpRequest的JavaScript对象开始。如同名字所暗示的，它允许一个客户端脚本来执行HTTP请求，并且将会解析一个XML格式的服务器响应。Ajax处理过程中的第一步是创建一个XMLHttpRequest实例。使用HTTP方法（GET或POST）来处理请求，并将目标URL设置到XMLHttpRequest对象上。<br/><br/>　　当你发送HTTP请求，你不希望浏览器挂起并等待服务器的响应，取而代之的是，你希望通过页面继续响应用户的界面交互，并在服务器响应真正到达后处理它们。要完成它，你可以向XMLHttpRequest注册一个回调函数，并异步地派发XMLHttpRequest请求。控制权马上就被返回到浏览器，当服务器响应到达时，回调函数将会被调用。<br/><br/>　　[AJAX实际应用]<br/><br/>　　1. 初始化Ajax<br/><br/>　　Ajax实际上就是调用了XMLHttpRequest对象，那么首先我们的就必须调用这个对象，我们构建一个初始化Ajax的函数：<br/><br/><div class="code">/**<br/>* 初始化一个xmlhttp对象<br/>*/<br/>function InitAjax()<br/>&#123;<br/>　var ajax=false; <br/>　try &#123; <br/>　　ajax = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;); <br/>　&#125; catch (e) &#123; <br/>　　try &#123; <br/>　　　ajax = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;); <br/>　　&#125; catch (E) &#123; <br/>　　　ajax = false; <br/>　　&#125; <br/>　&#125;<br/>　if (!ajax &amp;&amp; typeof XMLHttpRequest!=&#039;undefined&#039;) &#123; <br/>　　ajax = new XMLHttpRequest(); <br/>　&#125; <br/>　return ajax;<br/>&#125;</div><br/>你也许会说，这个代码因为要调用XMLHTTP组件，是不是只有IE浏览器能使，不是的经我试验，Firefox也是能使用的。<br/><br/>　　那么我们在执行任何Ajax操作之前，都必须先调用我们的InitAjax()函数来实例化一个Ajax对象。<br/><br/>　　2. 使用Get方式<br/><br/>　　现在我们第一步来执行一个Get请求，加入我们需要获取 /show.php?id=1的数据，那么我们应该怎么做呢？<br/><br/>　　假设有一个链接：＜a href="/show.php?id=1"＞新闻1＜/a＞，我点该链接的时候，不想任何刷新就能够看到链接的内容，那么我们该怎么做呢？<br/><br/><div class="code">//将链接改为：<br/>＜a href=&quot;#&quot; onClick=&quot;getNews(1)&quot;＞新闻1＜/a＞<br/>//并且设置一个接收新闻的层，并且设置为不显示：<br/>＜div id=&quot;show_news&quot;＞＜/div＞</div><br/><br/>同时构造相应的JavaScript函数：<br/><div class="code"> function getNews(newsID)<br/>&#123;<br/>　//如果没有把参数newsID传进来<br/>　if (typeof(newsID) == &#039;undefined&#039;)<br/>　&#123;<br/>　　return false;<br/>　&#125;<br/>　//需要进行Ajax的URL地址<br/>　var url = &quot;/show.php?id=&quot;+ newsID;<br/>　//获取新闻显示层的位置<br/>　var show = document.getElementById(&quot;show_news&quot;); <br/>　//实例化Ajax对象<br/>　var ajax = InitAjax();<br/>　//使用Get方式进行请求<br/>　ajax.open(&quot;GET&quot;, url, true); <br/>　//获取执行状态<br/>　ajax.onreadystatechange = function() &#123; <br/>　　//如果执行是状态正常，那么就把返回的内容赋值给上面指定的层<br/>　　if (ajax.readyState == 4 &amp;&amp; ajax.status == 200) &#123; <br/>　　　show.innerHTML = ajax.responseText; <br/>　　&#125; <br/>　&#125;<br/>　//发送空<br/>　ajax.send(null); <br/>&#125;</div><br/><br/>那么当，当用户点击“新闻1”这个链接的时候，在下面对应的层将显示获取的内容，而且页面没有任何刷新。当然，我们上面省略了show.php这个文件，我们只是假设show.php文件存在，并且能够正常工作的从数据库中把id为1的新闻提取出来。<br/><br/>　　这种方式适应于页面中任何元素，包括表单等等，其实在应用中，对表单的操作是比较多的，针对表单，更多使用的是POST方式，这个下面将讲述。<br/><br/>3. 使用POST方式<br/><br/>　　其实POST方式跟Get方式是比较类似的，只是在执行Ajax的时候稍有不同，我们简单讲述一下。<br/><br/>　　假设有一个用户输入资料的表单，我们在无刷新的情况下把用户资料保存到数据库中，同时给用户一个成功的提示。<br/><br/><div class="code">//构建一个表单，表单中不需要action、method之类的属性，全部由ajax来搞定了。<br/>＜form name=&quot;user_info&quot;＞<br/>姓名：＜input type=&quot;text&quot; name=&quot;user_name&quot; /＞＜br /＞<br/>年龄：＜input type=&quot;text&quot; name=&quot;user_age&quot; /＞＜br /＞<br/>性别：＜input type=&quot;text&quot; name=&quot;user_sex&quot; /＞＜br /＞<br/>＜input type=&quot;button&quot; value=&quot;提交表单&quot; onClick=&quot;saveUserInfo()&quot;＞<br/>＜/form＞<br/>//构建一个接受返回信息的层：<br/>＜div id=&quot;msg&quot;＞＜/div＞</div><br/><br/>我们看到上面的form表单里没有需要提交目标等信息，并且提交按钮的类型也只是button，那么所有操作都是靠onClick事件中的saveUserInfo()函数来执行了。我们描述一下这个函数：<br/><br/><div class="code">function saveUserInfo()<br/>&#123;<br/>　//获取接受返回信息层<br/>　var msg = document.getElementById(&quot;msg&quot;);<br/>　//获取表单对象和用户信息值<br/>　var f = document.user_info;<br/>　var userName = f.user_name.value;<br/>　var userAge = f.user_age.value;<br/>　var userSex = f.user_sex.value;<br/>　//接收表单的URL地址<br/>　var url = &quot;/save_info.php&quot;;<br/>　//需要POST的值，把每个变量都通过&amp;来联接<br/>　var postStr = &quot;user_name=&quot;+ userName +&quot;&amp;user_age=&quot;+ userAge +&quot;&amp;user_sex=&quot;+ userSex;<br/>　//实例化Ajax<br/>　var ajax = InitAjax();<br/>　//通过Post方式打开连接<br/>　ajax.open(&quot;POST&quot;, url, true); <br/>　//定义传输的文件HTTP头信息<br/>　ajax.setRequestHeader(&quot;Content-Type&quot;,&quot;application/x-www-form-urlencoded&quot;); <br/>　//发送POST数据<br/>　ajax.send(postStr);<br/>　//获取执行状态<br/>　ajax.onreadystatechange = function() &#123; <br/>　　//如果执行状态成功，那么就把返回信息写到指定的层里<br/>　　if (ajax.readyState == 4 &amp;&amp; ajax.status == 200) &#123; <br/>　　　msg.innerHTML = ajax.responseText; <br/>　　&#125; <br/>　&#125; <br/>&#125; <br/><br/></div><br/><br/>大致使用POST方式的过程就是这样，当然，实际开发情况可能会更复杂，这就需要开发者去慢慢琢磨。<br/><br/>　　4. 异步回调（伪Ajax方式）<br/><br/>　　一般情况下，使用Get、Post方式的Ajax我们都能够解决目前问题，只是应用复杂程度，当然，在开发中我们也许会碰到无法使用Ajax的时候，但是我们又需要模拟Ajax的效果，那么就可以使用伪Ajax的方式来实现我们的需求。<br/><br/>　　伪Ajax大致原理就是说我们还是普通的表单提交，或者别的什么的，但是我们却是把提交的值目标是一个浮动框架，这样页面就不刷新了，但是呢，我们又需要看到我们的执行结果，当然可以使用JavaScript来模拟提示信息，但是，这不是真实的，所以我们就需要我们的执行结果来异步回调，告诉我们执行结果是怎么样的。<br/><br/>　　假设我们的需求是需要上传一张图片，并且，需要知道图片上传后的状态，比如，是否上传成功、文件格式是否正确、文件大小是否正确等等。那么我们就需要我们的目标窗口把执行结果返回来给我们的窗口，这样就能够顺利的模拟一次Ajax调用的过程。<br/><br/>　　以下代码稍微多一点， 并且涉及Smarty模板技术，如果不太了解，请阅读相关技术资料。<br/><br/><div class="code">上传文件：upload.html<br/>//上传表单，指定target属性为浮动框架iframe1<br/>＜form action=&quot;/upload.php&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot; name=&quot;upload_img&quot; target=&quot;iframe1&quot;＞<br/><br/>选择要上传的图片：＜input type=&quot;file&quot; name=&quot;image&quot;＞＜br /＞<br/>＜input type=&quot;submit&quot; value=&quot;上传图片&quot;＞<br/>＜/form＞<br/>//显示提示信息的层<br/>＜div id=&quot;message&quot; style=&quot;display:none&quot;＞＜/div＞<br/>//用来做目标窗口的浮动框架<br/>＜iframe name=&quot;iframe1&quot; width=&quot;0&quot; height=&quot;0&quot; scrolling=&quot;no&quot;＞＜/iframe＞</div><br/>处理上传的PHP文件：upload.php<br/><div class="code">＜?php<br/>　/* 定义常量 */<br/>　//定义允许上传的MIME格式<br/>　define(&quot;UPLOAD_IMAGE_MIME&quot;, &quot;image/pjpeg,image/jpg,image/jpeg,image/gif,image/x-png,image/png&quot;); <br/>　//图片允许大小，字节<br/>　define(&quot;UPLOAD_IMAGE_SIZE&quot;, 102400);<br/>　//图片大小用KB为单位来表示<br/>　define(&quot;UPLOAD_IMAGE_SIZE_KB&quot;, 100); <br/>　//图片上传的路径<br/>　define(&quot;UPLOAD_IMAGE_PATH&quot;, &quot;./upload/&quot;); <br/>　//获取允许的图像格式<br/>　$mime = explode(&quot;,&quot;, USER_FACE_MIME);<br/>　$is_vaild = 0;<br/>　//遍历所有允许格式<br/>　foreach ($mime as $type)<br/>　&#123;<br/>　　if ($_FILES&#91;&#039;image&#039;&#93;&#91;&#039;type&#039;&#93; == $type)<br/>　　&#123;<br/>　　　$is_vaild = 1;<br/>　　&#125;<br/>　&#125;<br/>　//如果格式正确，并且没有超过大小就上传上去<br/>　if ($is_vaild &amp;&amp; $_FILES&#91;&#039;image&#039;&#93;&#91;&#039;size&#039;&#93;＜=USER_FACE_SIZE &amp;&amp; $_FILES&#91;&#039;image&#039;&#93;&#91;&#039;size&#039;&#93;＞0)<br/>　&#123;<br/>　　if (move_uploaded_file($_FILES&#91;&#039;image&#039;&#93;&#91;&#039;tmp_name&#039;&#93;, USER_IMAGE_PATH . $_FILES&#91;&#039;image&#039;&#93;&#91;&#039;name&#039;&#93;)) <br/>　　&#123;<br/>　　　$upload_msg =&quot;上传图片成功！&quot;;<br/>　　&#125; <br/>　　else <br/>　　&#123;<br/>　　　$upload_msg = &quot;上传图片文件失败&quot;;<br/>　　&#125;<br/>　&#125;<br/>　else<br/>　&#123;<br/>　　$upload_msg = &quot;上传图片失败，可能是文件超过&quot;. USER_FACE_SIZE_KB .&quot;KB、或者图片文件为空、或文件格式不正确&quot;;<br/>　&#125;<br/>　//解析模板文件<br/>　$smarty-＞assign(&quot;upload_msg&quot;, $upload_msg);<br/>　$smarty-＞display(&quot;upload.tpl&quot;);<br/>?＞<br/>模板文件：upload.tpl<br/>&#123;if $upload_msg != &quot;&quot;&#125;<br/>callbackMessage(&quot;&#123;$upload_msg&#125;&quot;); <br/>&#123;/if&#125;<br/>//回调的JavaScript函数，用来在父窗口显示信息<br/>function callbackMessage(msg)<br/>&#123;<br/>　//把父窗口显示消息的层打开<br/>　parent.document.getElementById(&quot;message&quot;).style.display = &quot;block&quot;;<br/>　//把本窗口获取的消息写上去<br/>　parent.document.getElementById(&quot;message&quot;).innerHTML = msg;<br/>　//并且设置为3秒后自动关闭父窗口的消息显示<br/>　setTimeout(&quot;parent.document.getElementById(&#039;message&#039;).style.display = &#039;none&#039;&quot;, 3000);<br/>&#125;</div><br/><br/>　使用异步回调的方式过程有点复杂，但是基本实现了Ajax、以及信息提示的功能，如果接受模板的信息提示比较多，那么还可以通过设置层的方式来处理，这个随机应变吧。<br/><br/>　　[ 结束语 ]<br/><br/>　　这是一种非常良好的Web开发技术，虽然出现时间比较长，但是到现在才慢慢火起来，也希望带给Web开发界一次变革，让我们朝RIA（富客户端）的开发迈进，当然，任何东西有利也有弊端，如果过多的使用JavaScript，那么客户端将非常臃肿，不利于用户的浏览体验，如何在做到快速的亲前提下，还能够做到好的用户体验，这就需要Web开发者共同努力了。<br/><br/><br/>Tags - <a href="http://www.dzhope.com/tags/ajax/" rel="tag">ajax</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] AJAX在PHP中的简单使用]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>