不参加变革社会的斗争,理想永远是一种幻影。 —— 吴运铎
到底部
返回文章列表

如何使用ajax开发web应用程序(4)

在这个系列的第四部分中,你将会学习如何在不刷新页面的前提下通过form来提交数据。 这能在很多方面发挥作用。让我们现从表单(form)的HTML开始,然后我们再给它加上javascript脚本,通过ajax提交表单。

请注意,在这篇文章中我会使用php来响应javascript提交的服务端请求,所以在文章中提及的代码需要保存为一个后缀为.php的文件并在一个支持php的服务器上运行。它没法直接在你的本地硬盘上工作。

Language:html4strict, parsed in: 0.036 seconds, using GeSHi 1.0.7.12
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. "http://www.w3.org/TR/html4/strict.dtd">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  4. <title>如何使用ajax开发web应用程序(4)</title>
  5. <style type="text/css">
  6. .note {
  7. background: #ffa;
  8. border: solid 1px #f30;
  9. margin: 1em;
  10. padding: 0.5em;
  11. }
  12. </style>
  13. </head>
  14. <form action="ajax_output.php" method="post"><fieldset>
  15. <label>姓名: <input type="text" name="name"></label><br>
  16. <label>出生地: <input type="text" name="born"></label><br>
  17. <label><input type="submit" value="Submit form"></label>
  18. </fieldset></form>
  19. </body>
  20.  

这个表单会提交到这个php文件:ajax_output.php--将接受数据并输出它。

Language:php, parsed in: 0.028 seconds, using GeSHi 1.0.7.12
  1. <?php
  2. if(isset($_POST)){
  3. echo '<div class="note">';
  4. if(isset($_POST['name']) && !empty($_POST['name'])){
  5. echo '<p>你好, '.$_POST['name'].'.</p>';
  6. }
  7. if(isset($_POST['born']) && !empty($_POST['born'])){
  8. echo '<p>你出生于风景如画的'.$_POST['born'].'!</p>';
  9. }
  10. echo '</div>';
  11. }
  12. ?>
  13.  

这个php文件将输出一个包含两个段落的DIV。如果文本域name填写了内容,将输出"你好, [你的名字]"。如果文本域born填写了内容,将会输出"你出生于风景如画的[出生地名]!",如果你两个空格都填了,那将输出两个消息到同一个DIV中。

该添加javascript了,下面是javascript代码以及说明。

Language:html4strict, parsed in: 0.053 seconds, using GeSHi 1.0.7.12
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. "http://www.w3.org/TR/html4/strict.dtd">
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  4. <title>如何使用ajax开发web应用程序(4)</title>
  5. <style type="text/css">
  6. .note {
  7. background: #ffa;
  8. border: solid 1px #f30;
  9. margin: 1em;
  10. padding: 0.5em;
  11. }
  12. </style>
  13. <script type="text/javascript">
  14. function submitForm(f){
  15. if(window.XMLHttpRequest){
  16. var xmlReq = new XMLHttpRequest();
  17. } else if(window.ActiveXObject) {
  18. var xmlReq = new ActiveXObject('Microsoft.XMLHTTP');
  19. }
  20. var formData = '', elem = '';
  21. for(var s=0; s<f.elements.length; s++){
  22. elem = f.elements[s];
  23. if(formData != ''){
  24. formData += '&';
  25. }
  26. formData += elem.name+"="+elem.value;
  27. }
  28. xmlReq.onreadystatechange = function(){
  29. if(xmlReq.readyState == 4){
  30. document.getElementById('insert').innerHTML = xmlReq.responseText;
  31. }
  32. }
  33. xmlReq.open(f.method, f.action, true);
  34. xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  35. xmlReq.send(formData);
  36. return false;
  37. }
  38. </script>
  39. </head>
  40. <div id="insert"></div>
  41. <form action="ajax_output.php" method="post" onsubmit="return submitForm(this)"><fieldset>
  42. <label>姓名: <input type="text" name="name"></label><br>
  43. <label>出生地: <input type="text" name="born"></label><br>
  44. <label><input type="submit" value="提交表单"></label>
  45. </fieldset></form>
  46. </body>
  47.  

查看示例外链

你先注意以下javascript标签部分。这是一个将在表单被提交的时候触发的函数(表单里的onsubmit事件句柄(event handler)将调用这个函数)。这个函数首先创建一个XMLHttpRequest,它用于传输数据到表单的action(ajax_output.ph[)。下一步,我们遍历每一个表单元素并将它们使用(&)连接起来以便于数据可以被正确地传送给action。接下来,我们创建了一个onReadyStateChange函数用于将这个idinsert的DIV和ajax_output.php传输回来的数据组合起来。然后我们打开表单的method(ajax_output.php)--用POST或者GET(在我们的ajax_output.php中,我们只接受POST的数据)--以及action (ajax_output.php)。我们需要设置正确的请求头(request header)以便于javascript能够发送经过URL编码的form数据(form urlencoded data)给ajax_output.php,最后就是让javascript发送数据了。

结论

这个脚本是非常通用并且在很多方面都很有用的,因为你能够将form里面的任何表单元素组合成数据并post给这个表单的action而不需要重新加载页面。你只需要简单的修改这个表单的action指向的文件,相应地修改和表单对应的输入域的名字以及如何处理数据。

关于作者

  Jonathan Fenocchi是一个网络开发者,主攻web设计,客户端脚本,php脚本。他的网站位于:http://www.slightlyremarkable.com外链

子乌注:忍不住在翻译完发一下牢骚。这个家伙的最后一篇文章在隔了一年之后才面世,而这么长的时间过后,连像我这种迟钝的人都能够摸进ajax的大门……

到顶部