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