AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
## 9.4、更新与验证 示例: [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>DOM</title> <style type="text/css"> .red{ color:red; } </style> </head> <body> <h2>DOM-用户管理</h2> <table border="1" id="tabUsers" width="100%"> <tr> <th> <input type="checkbox" id="chbAll" /> </th> <th>编号</th> <th>姓名</th> <th>城市</th> <th>操作</th> </tr> </table> <p> <button type="button" id="btnDelSelected">删除选择项</button> </p> <fieldset> <legend>用户信息</legend> <p> <label for="name">姓名:</label> <input type="text" name="name" id="name" placeholder="请输入姓名" /> <span id="nameMsg" class="red"></span> </p> <p> <label for="city">城市:</label> <input type="text" name="city" id="city" placeholder="请输入城市" /> <span id="cityMsg" class="red"></span> </p> <p> <button type="button" id="btnSave">保存</button> <button type="button" id="btnUpdate">更新</button> </p> </fieldset> <script src="../js/jquery-1.12.3.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var app = { data: [{ id: 1, name: "张学友", city: "中国香港" }, { id: 2, name: "张国立", city: "中国北京" }, { id: 5, name: "张惠妹", city: "中国上海" } ], index: -1, bind: function() { //将数组中的数据渲染到页面中 //将表格中第一行以外的数组清空 $("#tabUsers tr:gt(0)").remove(); $.each(app.data, function(i, obj) { var tr = $("<tr/>"); var chbItem = $("<input type='checkbox' name='chbItem'/>").data("index", i); $("<td/>").append(chbItem).appendTo(tr); $("<td/>").html(obj.id).appendTo(tr); $("<td/>").html(obj.name).appendTo(tr); $("<td/>").html(obj.city).appendTo(tr); //创建一个删除元素,在元素中隐藏数据index,对应了数组中的索引 var aDel = $("<a href='#' class='del'>删除</a>").data("index", i); var aEdit = $("<a href='#' class='edit'> | 编辑</a>").data("index", i).data("user", obj); $("<td/>").append(aDel).append(aEdit).appendTo(tr); //在#tabUsers元素中追加子元素tr $("#tabUsers").append(tr); }); }, save: function() { //新增 var user = { id: 1, name: $("#name").val(), city: $("#city").val() }; if(app.verify(user)) { if(app.data.length > 0) { //如果数组中有数据 user.id = app.data[app.data.length - 1].id + 1; }; app.data.push(user); //将user对象添加到数组的末尾 //重新渲染 app.bind(); } }, deleteOne: function(obj) { //根据一个元素删除当前行 var index = $(obj).data("index"); //index表示删除的起始位置,1表示删除几个 app.data.splice(index, 1); //更新页面 //app.bind(); $(obj).closest("tr").remove(); //移除最近的tr父节点 }, deleteSelected: function() { //多删除 var items = $("input[name=chbItem]:checked"); for(var i = items.size(); i >= 0; i--) { app.deleteOne(items[i]); } }, verify: function(user) { if(!(user.name && /^[\u4e00-\u9fa5]{2,4}$/.test(user.name))) { $("#nameMsg").html("姓名格式错误"); return false; } else { $("#nameMsg").html(""); } if(!(user.city && /^.{2,10}$/.test(user.city))){ $("#cityMsg").html("城市格式错误"); return false; } else { $("#cityMsg").html(""); } return true; }, start: function() { //绑定事件 $("#btnSave").click(app.save); $("#tabUsers").on("click", ".del", function() { if(confirm('您确定要删除吗?')) { app.deleteOne(this); } }); $("#chbAll").click(function() { $("input[name=chbItem]").prop("checked", $(this).prop("checked")); }); //多删除 $("#btnDelSelected").click(app.deleteSelected); //编辑 $("#tabUsers").on("click", ".edit", function() { //索引 var index = $(this).data("index"); //对象 var obj = $(this).data("user"); $("#name").val(obj.name); $("#city").val(obj.city); app.index = index; }); //更新 $("#btnUpdate").click(function() { //获得要更新的对象 var user = app.data[app.index]; user.name = $("#name").val(); user.city = $("#city").val(); app.bind(); app.index = -1; }); app.bind(); } }; app.start(); </script> </body> </html> ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") 结果: ![](https://images2018.cnblogs.com/blog/63651/201805/63651-20180530161548396-1672507047.png) ## 9.5、打字游戏 代码: [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script src="jquery-1.4.1.min.js" type="text/javascript"></script> <script type="text/javascript"> var code = ""; var W, H, L, T; var time = 10000; var N = 10; //每次掉下几个 var CNT = 0; //共掉下几个 var DONE = 0; //打完几个 $(function () { W = $("#div1").width(); H = $("#div1").height(); L = $("#div1").offset().left; if (L == 0) { document.location.reload(); } T = $("#div1").offset().top; //alert(W + "," + H + "," + L + "," + T); }); function GetLetter() { CNT++; ShoMsg(); var chars = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z".split(" "); var i = Random(0, 25); $("<div/>") .html(chars[i]) .css({ "font-size": 16 + i * 2, "left": L + Random(0, W - 60), "top": Random((T + 60) * -1, T + 60) * 3 }) .addClass("item") .appendTo("#div1") .animate({ top: (T + H) }, time, "linear", function () { $(this).remove(); GetLetter(); }); code += chars[i]; return chars[i]; } function Random(start, end) { return parseInt(Math.random() * (end + 1)) + start; } function ShoMsg() { $("#spanDONE").html(DONE); $("#spanCNT").html(CNT); $("#spanScore").html(parseInt(DONE*100/CNT*100)/100); } $(function () { $("body").keydown(function (event) { var code = String.fromCharCode(event.keyCode); $("#div1 div").each(function () { if ($(this).text() == code) { DONE++; $(this).stop().css({"color":"red","width":130,"height":130}).animate({ "font-size": "+=50" }, 100).hide(500, function () { $(this).remove(); GetLetter(); }); } }); }); }); $(function () { $("#btnStart").click(function () { N = parseInt($("#txtSpeed").val()); time = parseInt($("#txtTime").val()) * 1000; CNT = 0; DONE = 0; for (var i = 0; i < N; i++) { GetLetter(); } }); $("#btnStop").click(function () { $("#div1 *").remove().stop(); }); }); </script> <style type="text/css"> * { margin:0; padding:0; } #div1 { width: 600px; height: 300px; background: #000; overflow: hidden; } .item { color: #fff; position: absolute; width: 60px; height: 60px; } #msg { line-height:30px; font-size:20px; color:#6f6; font-family:黑体; background:#000; width:580px; padding:0 10px; } #container { width:610px; margin:0 auto; } h2 { line-height:40px; height:40px; text-align:center; } p { margin:10px 0; } </style> </head> <body> <div id="container"> <h2>打字小游戏</h2> <p> 个数:<input id="txtSpeed" type="text" value="10" />个 速度:<input id="txtTime" type="text" value="10" />秒 <input id="btnStart" type="button" value="开始" /> <input id="btnStop" type="button" value="停止" /> </p> <div id="div1"> </div> <p id="msg"> 产生:<span id="spanCNT">0</span>个 完成:<span id="spanDONE">0</span>个 得分:<span id="spanScore">0</span>分 </p> </div> </body> </html> ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") 结果: ![](https://images2018.cnblogs.com/blog/63651/201805/63651-20180531112831717-384398223.png) 示例: [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jQuery DOM</title> <style> #div1 { position: relative; width: 900px; height: 500px; border: 2px solid red; margin: 0 auto; } .letter { position: absolute; font-size: 50px; } </style> </head> <body> <h2>jQuery DOM</h2> <div id="div1"> </div> <script src="../js/jquery-1.12.3.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> function game() { $("<div/>") .html("ABCDEFGHIJKLMNOPQRSTUVWXYZ".split('')[R(0,25)]) .addClass("letter") .css({ left: R(0, 900) + "px", top: R(-50, 0) + "px" }) .appendTo("#div1") .animate({ top: '500px' }, R(100, 8000), "linear", function() { $(this).remove(); game(); }); } function R(start, end) { return parseInt(Math.random() * (end + 1)) + start; } game(); game(); game(); game(); game(); game(); </script> </body> </html> ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") 结果:![](https://images2018.cnblogs.com/blog/63651/201805/63651-20180531112925218-1048895494.png) ##  9.6、AJAX基础 工程: ![](https://images2018.cnblogs.com/blog/63651/201805/63651-20180531154002126-1368124652.png) User [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ package com.zhangguo.entity; /*** * 用户实体 Bean * */ public class User { private int id; private String name; private String city; public User() { } public User(int id, String name, String city) { super(); this.id = id; this.name = name; this.city = city; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", city=" + city + "]"; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } } ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") UserDao: [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ package com.zhangguo.dao; import java.util.ArrayList; import java.util.List; import com.zhangguo.entity.User; /** * 用户数据访问 * */ public class UserDao { private static List<User> users=new ArrayList<>(); static{ users.add(new User(1,"张国立", "中国北京")); users.add(new User(2,"张学友", "中国香港")); users.add(new User(6,"张慧妹", "中国珠海")); } /**获得所有用户*/ public List<User> getAllUsers(){ return users; } /**添加用户*/ public void addUser(User user){ users.add(user); } } ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") UserController: [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ package com.zhangguo.action; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zhangguo.dao.UserDao; import com.zhangguo.entity.User; /** * 用户控制器 */ @WebServlet("/UserController") public class UserController extends HttpServlet { private static final long serialVersionUID = 1L; private UserDao userDao=new UserDao(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); request.setCharacterEncoding("utf-8"); String result="["; for (User user : userDao.getAllUsers()) { result+="{\"id\":"+user.getId()+",\"name\":\""+user.getName()+"\",\"city\":\""+user.getCity()+"\"},"; } if(result.substring(result.length()-1,result.length()).equals(",")) { result=result.substring(0,result.length()-1); } result+="]"; try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } response.getWriter().print(result); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") index.html [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jQuery AJAX</title> </head> <body> <h2>jQuery AJAX</h2> <table border="1" id="tabUsers" width="100%"> <tr> <th>编号</th> <th>姓名</th> <th>城市</th> </tr> </table> <h3 id="msg"></h3> <script src="js/jquery-1.12.3.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> $.ajax({ type: "get", //请求类型 url: "UserController", //路径 beforeSend:function(){ //请求前的事件 $("#msg").html("努力加载中..."); }, success: function(data){ //请求成功后的事件 $.each(data, function(i, obj) { var tr = $("<tr/>"); $("<td/>").html(obj.id).appendTo(tr); $("<td/>").html(obj.name).appendTo(tr); $("<td/>").html(obj.city).appendTo(tr); $("#tabUsers").append(tr); }); }, complete:function(){ //请求完成时的事件,不论成功或失败 $("#msg").html(""); }, error:function (xhr, textStatus, errorThrown) { //错误时 alert(xhr+textStatus+errorThrown); } }); </script> </body> </html> ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") 运行结果: ![](https://images2018.cnblogs.com/blog/63651/201805/63651-20180531154340784-608117905.png) ## 9.7、AJAX添加用户  UserController [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ package com.zhangguo.action; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zhangguo.dao.UserDao; import com.zhangguo.entity.User; /** * 用户控制器 */ @WebServlet("/UserController") public class UserController extends HttpServlet { private static final long serialVersionUID = 1L; private UserDao userDao = new UserDao(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); request.setCharacterEncoding("utf-8"); String action = request.getParameter("action"); if (action.equals("list")) { list(response); //获得所有用户 }else if (action.equals("add")) { add(request, response); //添加新用户 } } /**添加新用户*/ public void add(HttpServletRequest request, HttpServletResponse response) throws IOException { String name = request.getParameter("name"); String city = request.getParameter("city"); userDao.addUser(new User(name, city)); delay(); response.getWriter().print("{\"msg\":\"添加成功\"}"); } /**获得所有用户*/ public void list(HttpServletResponse response) throws IOException { String result = "["; for (User user : userDao.getAllUsers()) { result += "{\"id\":" + user.getId() + ",\"name\":\"" + user.getName() + "\",\"city\":\"" + user.getCity() + "\"},"; } if (result.substring(result.length() - 1, result.length()).equals(",")) { result = result.substring(0, result.length() - 1); } result += "]"; delay(); response.getWriter().print(result); } public void delay(){ try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") index.html [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jQuery AJAX</title> <style type="text/css"> #loading{ display: none; } </style> </head> <body> <h2>jQuery AJAX</h2> <table border="1" id="tabUsers" width="100%"> <tr> <th>编号</th> <th>姓名</th> <th>城市</th> </tr> </table> <p></p> <fieldset> <legend>用户信息</legend> <p> <label for="name">姓名:</label> <input type="text" name="name" id="name" placeholder="请输入姓名" /> <span id="nameMsg" class="red"></span> </p> <p> <label for="city">城市:</label> <input type="text" name="city" id="city" placeholder="请输入城市" /> <span id="cityMsg" class="red"></span> </p> <p> <button type="button" id="btnSave">保存</button> <button type="button" id="btnUpdate">更新</button> </p> </fieldset> <div id="loading"> <img src="img/loading.gif" height="100"/> </div> <script src="js/jquery-1.12.3.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var list = function() { $.ajax({ type: "get", //请求类型 url: "UserController?action=list", //路径 beforeSend: function() { //请求前的事件 $("#loading").show(500); }, success: function(data) { //请求成功后的事件 $("#tabUsers tr:gt(0)").remove(); //移除表格中除第一行以外的数据 $.each(data, function(i, obj) { var tr = $("<tr/>"); $("<td/>").html(obj.id).appendTo(tr); $("<td/>").html(obj.name).appendTo(tr); $("<td/>").html(obj.city).appendTo(tr); $("#tabUsers").append(tr); }); }, complete: function() { //请求完成时的事件,不论成功或失败 $("#loading").hide(500); }, error: function(xhr, textStatus, errorThrown) { //错误时 alert(xhr + textStatus + errorThrown); } }); } list(); //添加 $("#btnSave").click(function(){ $.ajax({ url:"UserController?action=add", //请求地址 data:{name:$("#name").val(),city:$("#city").val()}, //发送给后台的数据 type:"post", //请求类型 beforeSend:function(){ //请求前 $("#loading").show(500); $("#btnSave").prop("disabled",true).html("请求中..."); }, success:function(data){ //请求成功事件 alert(data.msg); list(); //重新绑定 }, complete:function(){ //请求完成,不论成功或失败 $("#loading").hide(500); $("#btnSave").prop("disabled",false).html("保存"); } }); }); </script> </body> </html> ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") 效果: ![](https://images2018.cnblogs.com/blog/63651/201806/63651-20180601095921809-1682175974.png) ##  9.8、序列化与反序列化 示例下载:[https://files.cnblogs.com/files/best/Ajax14301.zip](https://files.cnblogs.com/files/best/Ajax14301.zip) [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ 在解析JSON方面,无疑JACKSON是做的最好的,下面从几个方面简单复习下。 FASTJSON JACKSON 1 JAVA 对象转为JSON import java.io.File; import java.io.IOException; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; public class JacksonExample { public static void main(String[] args) { User user = new User(); ObjectMapper mapper = new ObjectMapper(); try { // convert user object to json string, and save to a file mapper.writeValue(new File("c:\\user.json"), user); // display to console System.out.println(mapper.writeValueAsString(user)); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 输出为: {"age":29,"messages":["msg 1","msg 2","msg 3"],"name":"mkyong"} 2 JSON反序列化为JAVA对象 import java.io.File; import java.io.IOException; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; public class JacksonExample { public static void main(String[] args) { ObjectMapper mapper = new ObjectMapper(); try { // read from file, convert it to user class User user = mapper.readValue(new File("c:\\user.json"), User.class); // display to console System.out.println(user); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 输出:User [age=29, name=mkyong, messages=[msg 1, msg 2, msg 3]] 3 在上面的例子中,如果要输出的JSON好看点,还是有办法的,就是使用 defaultPrettyPrintingWriter()方法,例子为: User user = new User(); ObjectMapper mapper = new ObjectMapper(); System.out.println(mapper.defaultPrettyPrintingWriter().writeValueAsString(user)); 则输出整齐: { "age" : 29, "messages" : [ "msg 1", "msg 2", "msg 3" ], "name" : "mkyong" } Jackson 格式化日期问题 Jackson 默认是转成timestamps形式的,如何使用自己需要的类型, 解决办法: 1、在实体字段上使用@JsonFormat注解格式化日期 @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") 2、通过下面方式可以取消timestamps形式 objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 自定义输出格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); objectMapper.setDateFormat(sdf) ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") jsonutil [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ package com.zhangguo.test; import java.text.SimpleDateFormat; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class JsonUtils { /** * 序列化成json * */ public static String toJson(Object obj) { // 对象映射器 ObjectMapper mapper = new ObjectMapper(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss"); mapper.setDateFormat(sdf); String result = null; // 序列化user对象为json字符串 try { result = mapper.writeValueAsString(obj); } catch (JsonProcessingException e) { e.printStackTrace(); } return result; } /** * 反序列化成对象 * */ public static <T> T toObject(String json,Class<T> valueType) { //对象映射器 ObjectMapper mapper=new ObjectMapper(); T result=null; try { result=mapper.readValue(json,valueType); }catch (Exception e) { e.printStackTrace(); } return result; } } ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ## 9.9、原生AJAX  api帮助:[https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest](https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest) 参考示例:[https://www.cnblogs.com/best/p/6196202.html](https://www.cnblogs.com/best/p/6196202.html) 简单示例: [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ var xmlhttp; function loadXMLDoc(url) { xmlhttp=null; if (window.XMLHttpRequest) {// code for all new browsers xmlhttp=new XMLHttpRequest(); } else if (window.ActiveXObject) {// code for IE5 and IE6 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } if (xmlhttp!=null) { xmlhttp.onreadystatechange=state_Change; xmlhttp.open("GET",url,true); xmlhttp.send(null); } else { alert("Your browser does not support XMLHTTP."); } } function state_Change() { if (xmlhttp.readyState==4) {// 4 = "loaded" if (xmlhttp.status==200) {// 200 = OK // ...our code here... } else { alert("Problem retrieving XML data"); } } } ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") `XMLHttpRequest` 最初由微软设计,随后被 Mozilla、Apple 和 Google采纳。如今,该对象已经被 [W3C组织标准化](http://www.w3.org/TR/XMLHttpRequest/ "http://www.w3.org/TR/XMLHttpRequest/")。 通过它,你可以很容易的取回一个 URL 上的资源数据。尽管名字里有 XML,但 `XMLHttpRequest` 可以取回所有类型的数据资源,并不局限于 XML。而且除了 [HTTP](https://developer.mozilla.org/zh-cn/HTTP "zh-cn/HTTP") ,它还支持 `file` 和 `ftp` 协议。 ### XHR构造函数 [`XMLHttpRequest()`](https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/XMLHttpRequest "关于XMLHttpRequest用法的详细信息,请参考 使用 XMLHttpRequest.") 构造函数初始化一个 `XMLHttpRequest` 对象。必须在所有其他方法被调用前调用构造函数。 ### XHR属性 此接口继承了 [`XMLHttpRequestEventTarget`](https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequestEventTarget "XMLHttpRequestEventTarget是一个描述事件处理程序的接口,你可以在一个用于处理XMLHttpRequest事件的对象中使用到该事件处理程序。") 和 [`EventTarget`](https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget "EventTarget 是一个由可以接收事件的对象实现的接口,并且可以为它们创建侦听器。") 的属性。 | 属性 | 类型 | 描述 | | --- | --- | --- | | `onreadystatechange` | `Function?` | 一个JavaScript函数对象,当readyState属性改变时会调用它。回调函数会在user interface线程中调用。 **警告:** 不能在本地代码中使用. 也不应该在同步模式的请求中使用. | | `readyState` | `unsigned short` | 请求的五种状态 值状态描述0UNSENT&nbsp;(未打开)open()方法还未被调用.1OPENED&nbsp; (未发送)open()方法已经被调用.2HEADERS_RECEIVED (已获取响应头)send()方法已经被调用, 响应头和响应状态已经返回.3LOADING (正在下载响应体)响应体下载中;&nbsp;responseText中已经获取了部分数据.4DONE (请求完成)整个请求过程已经完毕. | | `response` | varies | 响应实体的类型由 `[responseType](https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest#responseType) 来指定,` 可以是 `[ArrayBuffer](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer "ArrayBuffer"),` `[Blob](https://developer.mozilla.org/zh-cn/DOM/Blob "zh-cn/DOM/Blob"),` [`Document`](https://developer.mozilla.org/zh-CN/docs/Web/API/Document "Document 接口提供了一些在浏览器服务中作为页面内容入口点而加载的一些页面,也就是 DOM 树。 DOM 树包括诸如 和 之类的元素,及其他元素。其也为文档(document)提供了全局性的函数,例如获取页面的 URL、在文档中创建新的 element 的函数。"), JavaScript 对象 (即 "json"), 或者是字符串。如果请求未完成或失败,则该值为 `null。` | | `responseText` | `DOMString` | 此次请求的响应为文本,或是当请求未成功或还未发送时为 `null。`**只读。** | | `responseType` | `XMLHttpRequestResponseType` | 设置该值能够改变响应类型。就是告诉服务器你期望的响应格式。 ValueData type of&nbsp;response&nbsp;property""&nbsp;(空字符串)字符串(默认值)"arraybuffer"ArrayBuffer"blob"Blob"document" 和 之类的元素,及其他元素。其也为文档(document)提供了全局性的函数,例如获取页面的 URL、在文档中创建新的 element&nbsp;的函数。" href="https://developer.mozilla.org/zh-CN/docs/Web/API/Document" style="margin: 0px; padding: 0px; font-family: &quot;microsoft yahei&quot; !important; color: rgb(0, 0, 0); text-decoration: underline;">Document"json"JavaScript 对象,解析自服务器传递回来的JSON 字符串。"text"字符串 | | `responseXML` | `Document?` | 本次请求的响应是一个 `[Document](https://developer.mozilla.org/zh-cn/DOM/document "zh-cn/DOM/Document")` 对象,如果是以下情况则值为 `null:`请求未成功,请求未发送,或响应无法被解析成 XML 或 HTML。当响应为text/xml 流时会被解析。当 `responseType` 设置为"document",并且请求为异步的,则响应会被当做 `text/html` 流来解析。**只读****.** **注意:** 如果服务器不支持 `text/xml` Content-Type 头,你可以使用 `overrideMimeType() 强制``XMLHttpRequest` 将响应解析为 XML。 | | `status` | `unsigned short` | 该请求的响应状态码 (例如, `状态码`200 表示一个成功的请求).**只读.** | | `statusText` | `DOMString` | 该请求的响应状态信息,包含一个状态码和原因短语 (例如 "`200 OK`"). **只读****.** | | `upload` | `XMLHttpRequestUpload` | 可以在 `upload 上添加一个事件监听来跟踪上传过程。` | | `withCredentials` | `boolean` | 表明在进行跨站(cross-site)的访问控制(Access-Control)请求时,是否使用认证信息(例如cookie或授权的header)。 默认为 `false。` **注意:** 这不会影响同站(same-site)请求. | ### XHR非标准属性 | Attribute | Type | Description | | --- | --- | --- | | `channel` | `[nsIChannel](https://developer.mozilla.org/zh-CN/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIChannel)` | The channel used by the object when performing the request. This is `null` if the channel hasn't been created yet. In the case of a multi-part request, this is the initial channel, not the different parts in the multi-part request. **Requires elevated privileges to access; ****只读****.** | | `mozBackgroundRequest` | `boolean` | Indicates whether or not the object represents a background service request. If `true`, no load group is associated with the request, and security dialogs are prevented from being shown to the user. **Requires elevated privileges to access.** In cases in which a security dialog (such as authentication or a bad certificate notification) would normally be shown, the request simply fails instead. | | `mozResponseArrayBuffer`已废弃 Gecko 6 | [`ArrayBuffer`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer "ArrayBuffer") | The response to the request, as a JavaScript typed array. This is NULL if the request was not successful, or if it hasn't been sent yet. **只读** | | `multipart` | `boolean` | Indicates whether or not the response is expected to be a stream of possibly multiple XML documents. If set to `true`, the content type of the initial response must be `multipart/x-mixed-replace` or an error will occur. All requests must be asynchronous. This enables support for server push; for each XML document that's written to this request, a new XML DOM document is created and the `onload` handler is called between documents. **注意:** 当这个属性被开启,XMLdocument被初次加载后onload事件处理器以及其它事件处理器不会被重置,并且onload事件处理器会在每一次响应接收的时候被调用。 | ### XHR方法 ### abort() 如果请求已经被发送,则立刻中止请求. ### getAllResponseHeaders() ~~~html DOMString getAllResponseHeaders(); ~~~ 返回所有响应头信息(响应头名和值), 如果响应头还没接受,则返回`null`.** 注意:** For multipart requests, this returns the headers from the current part of the request, not from the original channel. ### getResponseHeader() ~~~html DOMString? getResponseHeader(DOMString header); ~~~ 返回指定的响应头的值, 如果响应头还没被接受,或该响应头不存在,则返回null. ### open() 初始化一个请求. 该方法用于JavaScript代码中;如果是本地代码, 使用 [`openRequest()`](https://developer.mozilla.org/zh-cn/nsIXMLHttpRequest#openRequest() "/zh-cn/XMLHttpRequest#openRequest()")方法代替. **注意:** 在一个已经激活的request下(已经调用open()或者openRequest()方法的request)再次调用这个方法相当于调用了abort()方法。 ~~~html void open( DOMString method, DOMString url, optional boolean async, optional DOMString user, optional DOMString password ); ~~~ ###### 参数 `method` 请求所使用的HTTP方法; 例如 "GET", "POST", "PUT", "DELETE"等. 如果下个参数是非HTTP(S)的URL,则忽略该参数. `url` 该请求所要访问的URL `async` 一个可选的布尔值参数,默认为true,意味着是否执行异步操作,如果值为false,则send()方法不会返回任何东西,直到接受到了服务器的返回数据。如果为值为true,一个对开发者透明的通知会发送到相关的事件监听者。这个值必须是true,如果multipart 属性是true,否则将会出现一个意外。 `user` 用户名,可选参数,为授权使用;默认参数为空string. `password` 密码,可选参数,为授权使用;默认参数为空string. ### overrideMimeType() 重写由服务器返回的MIME type。这个可用于, 例如,强制把一个响应流当作“text/xml”来处理和解析,即使服务器没有指明数据是这个类型。注意,这个方法必须在send()之前被调用。 ~~~html void overrideMimeType(DOMString mimetype); ~~~ ### send() 发送请求. 如果该请求是异步模式(默认),该方法会立刻返回. 相反,如果请求是同步模式,则直到请求的响应完全接受以后,该方法才会返回. **注意:** 所有相关的事件绑定必须在调用`send()方法之前进行`. ~~~html void send(); void send(ArrayBuffer data); void send(Blob data); void send(Document data); void send(DOMString? data); void send(FormData data); ~~~ #### 注意 如果发送的数据是个文档,它会在发送之前进行序列化。当发送一个文档,Firefox高于3的版本会对发送的请求使用UTF-8编码;[Firefox 3](https://developer.mozilla.org/zh-cn/Firefox_3 "zh-cn/Firefox_3") 也可以支持发送文档的时候通过使用`body.xmlEncoding`指定编码方式,如果不指定则默认使用UTF-8编码。 If it's an `nsIInputStream`, it must be compatible with `nsIUploadChannel`'s `setUploadStream()`method. In that case, a Content-Length header is added to the request, with its value obtained using `nsIInputStream`'s `available()`method. Any headers included at the top of the stream are treated as part of the message body. The stream's MIMEtype should be specified by setting the Content-Type header using the [`setRequestHeader()`](https://developer.mozilla.org/zh-cn/nsIXMLHttpRequest#setRequestHeader() "/zh-cn/XMLHttpRequest#setRequestHeader()")method prior to calling `send()`. ### setRequestHeader() 给指定的HTTP请求头赋值.在这之前,你必须确认已经调用 [`open()`](https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest#open) 方法打开了一个url. ~~~html void setRequestHeader( DOMString header, DOMString value ); ~~~ #### 参数 `header` 将要被赋值的请求头名称. `value` 给指定的请求头赋的值. ### 非标准方法 #### init() 在 C++代码中初始化一个XHR对象. **警告:** 该方法不能在 JavaScript 代码中使用. ~~~html [noscript] void init( in nsIPrincipal principal, in nsIScriptContext scriptContext, in nsPIDOMWindow ownerWindow ); ~~~ ##### 参数 `principal` 主要用于请求;不可以为null. `scriptContext` 请求上下文;不可以为null. `ownerWindow` 和窗口相关请求; 可能为null. #### openRequest() 初始化一个请求. 这个方法用于本地代码; 如果用JavaScript 代码来初始化请求, 使用 [`open()`](https://developer.mozilla.org/zh-cn/nsIXMLHttpRequest#open() "/zh-cn/XMLHttpRequest#open()")代替. 看文档`open()`. ### sendAsBinary() 发送二进制数据 的`send()`方法变种. ~~~html void sendAsBinary( in DOMString body ); ~~~ ##### 参数 `body` 请求体的DOMstring。这个数据已由一系列单字节字符截取(移除每个字符的高位字节)转换成了字符串。 ## 9.10、原生AJAX示例 代码: [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>原生ajax</title> </head> <body> <h2>原生ajax</h2> <h3 id="time"></h3> <button type="button" onclick="getTime_click()">获得服务器时间</button> <script> function getXHR(){ //判断是否拥有xhr对象 if(window.XMLHttpRequest){ return new XMLHttpRequest(); }else if(window.ActiveXObject){ //ie6,ie5下的xhr对象获得办法 return new ActiveXObject("Microsoft.XMLHTTP"); } return null; } function getTime_click(){ var xhr=getXHR(); //当状态变化时的事件 xhr.onreadystatechange=function(){ if(xhr.readyState==4){ //请求成功 if(xhr.status==200){ //服务器响应状态成功 //将从服务器获得的数据显示在页面上 document.getElementById("time").innerHTML= xhr.responseText; } } } //打开请求 xhr.open("GET","GetTime",true); //请求类型,路径,是否为异步请求 //发送请求 xhr.send(null); //参数 } </script> </body> </html> ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") Servlet: [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ package com.zhangguo.action; import java.io.IOException; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/GetTime") public class GetTime extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write(new Date().toString()); } } ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") 结果: ![](https://images2018.cnblogs.com/blog/63651/201806/63651-20180605144413770-1122062595.png) jQuery ajax请求 [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>原生ajax</title> </head> <body> <h2>原生ajax</h2> <h3 id="time"></h3> <button type="button" onclick="getTime_click()">获得服务器时间</button> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <script> function getTime_click(){ $.get("GetTime",function(data){$("#time").html(data); }); } </script> </body> </html> ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ## 9.11、AJAX用户示例 [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jQuery AJAX</title> <style type="text/css"> #loading{ display: none; } </style> </head> <body> <h2>jQuery AJAX</h2> <table border="1" id="tabUsers" width="100%"> <tr> <th>编号</th> <th>姓名</th> <th>城市</th> <th>操作</th> </tr> </table> <p></p> <fieldset> <legend>用户信息</legend> <p> <label for="name">姓名:</label> <input type="text" name="name" id="name" placeholder="请输入姓名" /> <span id="nameMsg" class="red"></span> </p> <p> <label for="city">城市:</label> <input type="text" name="city" id="city" placeholder="请输入城市" /> <span id="cityMsg" class="red"></span> </p> <p> <button type="button" id="btnSave">保存</button> <button type="button" id="btnUpdate">更新</button> </p> </fieldset> <div id="loading"> <img src="img/loading.gif" height="100"/> </div> <script src="js/jquery-1.12.3.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var list = function() { $.ajax({ type: "get", //请求类型 url: "UserController?action=list", //路径 beforeSend: function() { //请求前的事件 $("#loading").show(500); }, success: function(data) { //请求成功后的事件 $("#tabUsers tr:gt(0)").remove(); //移除表格中除第一行以外的数据 $.each(data, function(i, obj) { var tr = $("<tr/>"); $("<td/>").html(obj.id).appendTo(tr); $("<td/>").html(obj.name).appendTo(tr); $("<td/>").html(obj.city).appendTo(tr); var del=$("<a href='#' class='del'>删除 | </a>").data("id",obj.id); var edit=$("<a href='#' class='edit'>编辑</a>").data("user",obj); $("<td/>").append(del).append(edit).appendTo(tr); $("#tabUsers").append(tr); }); }, complete: function() { //请求完成时的事件,不论成功或失败 $("#loading").hide(500); }, error: function(xhr, textStatus, errorThrown) { //错误时 alert(xhr + textStatus + errorThrown); } }); } list(); //添加 $("#btnSave").click(function(){ $.ajax({ url:"UserController?action=add", //请求地址 data:{name:$("#name").val(),city:$("#city").val()}, //发送给后台的数据 type:"post", //请求类型 beforeSend:function(){ //请求前 $("#loading").show(500); $("#btnSave").prop("disabled",true).html("请求中..."); }, success:function(data){ //请求成功事件 alert(data.msg); list(); //重新绑定 }, complete:function(){ //请求完成,不论成功或失败 $("#loading").hide(500); $("#btnSave").prop("disabled",false).html("保存"); } }); }); $("#tabUsers").on("click",".del",function(){ var id=$(this).data("id"); //发送ajax get请求 $.get("UserController?action=del",{"id":id},function(data){ alert(data.msg); list(); }); }); var user=null; $("#tabUsers").on("click",".edit",function(){ user=$(this).data("user"); $("#name").val(user.name); $("#city").val(user.city); }); //更新事件 $("#btnUpdate").click(function(){ user.name=$("#name").val(); user.city=$("#city").val(); //向服务器发送post请求 $.post("UserController?action=update",user,function(data){ alert(data.msg); list(); }); }); </script> </body> </html> ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")  ![](https://images2018.cnblogs.com/blog/63651/201806/63651-20180605152755164-2076452695.png) ## 9.12、artDialog弹出层 帮助:[http://aui.github.io/artDialog/doc/index.html](http://aui.github.io/artDialog/doc/index.html) 应用:[https://www.cnblogs.com/best/p/6196202.html](https://www.cnblogs.com/best/p/6196202.html) 上课示例:[https://files.cnblogs.com/files/best/Ajax14301\_2.zip](https://files.cnblogs.com/files/best/Ajax14301_2.zip) 示例: [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>artDialog</title> <link rel="stylesheet" type="text/css" href="js/artDialog7/css/dialog.css"/> <style type="text/css"> #formUser{ display: none; } </style> </head> <body> <h2>artDialog</h2> <button type="button" onclick="click1()">提示</button> <button type="button" onclick="click2()">添加用户</button> <button type="button" onclick="click3()">加载中</button> <fieldset id="formUser"> <legend>用户信息</legend> <p> <label for="name">姓名:</label> <input type="text" name="name" id="name" placeholder="请输入姓名" /> <span id="nameMsg" class="red"></span> </p> <p> <label for="city">城市:</label> <input type="text" name="city" id="city" placeholder="请输入城市" /> <span id="cityMsg" class="red"></span> </p> <p> <button type="button" id="btnSave">保存</button> <button type="button" id="btnUpdate">更新</button> </p> </fieldset> <script src="js/jquery-1.12.3.min.js" type="text/javascript" charset="utf-8"></script> <script src="js/artDialog7/dist/dialog.js" type="text/javascript" charset="utf-8"></script> <script> function click1(){ var d=dialog({ title:"提示", content:"恭喜您,删除成功!", okValue: '确定', ok:function(){ setTimeout(function(){ d.close().remove(); },2000); return false; }, cancel:function(){ } }); d.show(); } function click2(){ var d=dialog({ title:"添加用户", modal:true, backdropOpacity:0.2, width:'600px', height:'300px', content:$("#formUser") }); d.show(); } var box function click3(){ var box=dialog({ modal:true }); box.show(); }; </script> </body> </html> ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") 结果:  ![](https://images2018.cnblogs.com/blog/63651/201806/63651-20180606150940943-1281633678.png) ## 9.13、Bootstrap基础  http://www.layui.com/ http://www.h-ui.net/H-ui.admin.shtml 移动端 http://www.dcloud.io/mui.html http://m.sui.taobao.org/components/#forms http://www.bootCSS.com [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>BootStrap Demo</title> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <link rel="stylesheet" type="text/css" href="js/bootstrap-3.3.7-dist/css/bootstrap.min.css" /> </head> <body> <div class="container-fluid"> <div class="row"> <div class="jumbotron"> <h1>Hello, Bootstrap!</h1> <p>这是我的第一个bootstrap页面!</p> <p> <a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a> </p> </div> </div> <div class="row"> <div class="col-md-8">.col-md-8 <!-- Standard button --> <button type="button" class="btn btn-default">(默认样式)Default</button> <!-- Provides extra visual weight and identifies the primary action in a set of buttons --> <button type="button" class="btn btn-primary">(首选项)Primary</button> <!-- Indicates a successful or positive action --> <button type="button" class="btn btn-success">(成功)Success</button> <!-- Contextual button for informational alert messages --> <button type="button" class="btn btn-info">(一般信息)Info</button> <!-- Indicates caution should be taken with this action --> <button type="button" class="btn btn-warning">(警告)Warning</button> <!-- Indicates a dangerous or potentially negative action --> <button type="button" class="btn btn-danger">(危险)Danger</button> <!-- Deemphasize a button by making it look like a link while maintaining button behavior --> <button type="button" class="btn btn-link">(链接)Link</button> </div> <div class="col-md-4">.col-md-4</div> </div> </div> <script src="js/bootstrap-3.3.7-dist/js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script> </body> </html> ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") 效果 ![](https://images2018.cnblogs.com/blog/63651/201806/63651-20180607092715698-329905879.png) ##  9.14、在线可视化布局系统 http://www.ibootstrap.cn/ http://www.bootcss.com/p/layoutit/ 示例: ![](https://images2018.cnblogs.com/blog/63651/201806/63651-20180607104113624-1184979487.png) 代码: [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") ~~~ <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>BootStrap Demo</title> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <link rel="stylesheet" type="text/css" href="js/bootstrap-3.3.7-dist/css/bootstrap.min.css" /> </head> <body> <div class="container"> <div class="row clearfix"> <div class="col-md-12 column"> <nav class="navbar navbar-default" role="navigation"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button> <a class="navbar-brand" href="#">Brand</a> </div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li class="active"> <a href="#">Link</a> </li> <li> <a href="#">Link</a> </li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown<strong class="caret"></strong></a> <ul class="dropdown-menu"> <li> <a href="#">Action</a> </li> <li> <a href="#">Another action</a> </li> <li> <a href="#">Something else here</a> </li> <li class="divider"> </li> <li> <a href="#">Separated link</a> </li> <li class="divider"> </li> <li> <a href="#">One more separated link</a> </li> </ul> </li> </ul> <form class="navbar-form navbar-left" role="search"> <div class="form-group"> <input type="text" class="form-control" /> </div> <button type="submit" class="btn btn-default">Submit</button> </form> <ul class="nav navbar-nav navbar-right"> <li> <a href="#">Link</a> </li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown<strong class="caret"></strong></a> <ul class="dropdown-menu"> <li> <a href="#">Action</a> </li> <li> <a href="#">Another action</a> </li> <li> <a href="#">Something else here</a> </li> <li class="divider"> </li> <li> <a href="#">Separated link</a> </li> </ul> </li> </ul> </div> </nav> <div class="jumbotron"> <h1> Hello, world! </h1> <p> This is a template for a simple marketing or informational website. It includes a large callout called the hero unit and three supporting pieces of content. Use it as a starting point to create something more unique. </p> <p> <a class="btn btn-primary btn-large" href="#">Learn more</a> </p> </div> </div> </div> <div class="row clearfix"> <div class="col-md-12 column"> <div class="carousel slide" id="carousel-941720"> <ol class="carousel-indicators"> <li class="active" data-slide-to="0" data-target="#carousel-941720"> </li> <li data-slide-to="1" data-target="#carousel-941720"> </li> <li data-slide-to="2" data-target="#carousel-941720"> </li> </ol> <div class="carousel-inner"> <div class="item active"> <img alt="" src="http://ibootstrap-file.b0.upaiyun.com/lorempixel.com/1600/500/sports/1/default.jpg" /> <div class="carousel-caption"> <h4> First Thumbnail label </h4> <p> Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. </p> </div> </div> <div class="item"> <img alt="" src="http://ibootstrap-file.b0.upaiyun.com/lorempixel.com/1600/500/sports/2/default.jpg" /> <div class="carousel-caption"> <h4> Second Thumbnail label </h4> <p> Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. </p> </div> </div> <div class="item"> <img alt="" src="http://ibootstrap-file.b0.upaiyun.com/lorempixel.com/1600/500/sports/3/default.jpg" /> <div class="carousel-caption"> <h4> Third Thumbnail label </h4> <p> Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. </p> </div> </div> </div> <a class="left carousel-control" href="#carousel-941720" data-slide="prev"><span class="glyphicon glyphicon-chevron-left"></span></a> <a class="right carousel-control" href="#carousel-941720" data-slide="next"><span class="glyphicon glyphicon-chevron-right"></span></a> </div> </div> </div> <div class="row clearfix"> <div class="col-md-4 column"> <h2> Heading </h2> <p> Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p> <p> <a class="btn" href="#">View details »</a> </p> </div> <div class="col-md-4 column"> <h2> Heading </h2> <p> Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p> <p> <a class="btn" href="#">View details »</a> </p> </div> <div class="col-md-4 column"> <h2> Heading </h2> <p> Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p> <p> <a class="btn" href="#">View details »</a> </p> </div> </div> <div class="row clearfix"> <div class="col-md-12 column"> <div class="row"> <div class="col-md-4"> <div class="thumbnail"> <img alt="300x200" src="http://ibootstrap-file.b0.upaiyun.com/lorempixel.com/600/200/people/default.jpg" /> <div class="caption"> <h3> Thumbnail label </h3> <p> Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. </p> <p> <a class="btn btn-primary" href="#">Action</a> <a class="btn" href="#">Action</a> </p> </div> </div> </div> <div class="col-md-4"> <div class="thumbnail"> <img alt="300x200" src="http://ibootstrap-file.b0.upaiyun.com/lorempixel.com/600/200/city/default.jpg" /> <div class="caption"> <h3> Thumbnail label </h3> <p> Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. </p> <p> <a class="btn btn-primary" href="#">Action</a> <a class="btn" href="#">Action</a> </p> </div> </div> </div> <div class="col-md-4"> <div class="thumbnail"> <img alt="300x200" src="http://ibootstrap-file.b0.upaiyun.com/lorempixel.com/600/200/sports/default.jpg" /> <div class="caption"> <h3> Thumbnail label </h3> <p> Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. </p> <p> <a class="btn btn-primary" href="#">Action</a> <a class="btn" href="#">Action</a> </p> </div> </div> </div> </div> </div> </div> <div class="row clearfix"> <div class="col-md-8 column"> <table class="table"> <thead> <tr> <th> 编号 </th> <th> 产品 </th> <th> 交付时间 </th> <th> 状态 </th> </tr> </thead> <tbody> <tr> <td> 1 </td> <td> TB - Monthly </td> <td> 01/04/2012 </td> <td> Default </td> </tr> <tr class="success"> <td> 1 </td> <td> TB - Monthly </td> <td> 01/04/2012 </td> <td> Approved </td> </tr> <tr class="error"> <td> 2 </td> <td> TB - Monthly </td> <td> 02/04/2012 </td> <td> Declined </td> </tr> <tr class="warning"> <td> 3 </td> <td> TB - Monthly </td> <td> 03/04/2012 </td> <td> Pending </td> </tr> <tr class="info"> <td> 4 </td> <td> TB - Monthly </td> <td> 04/04/2012 </td> <td> Call in to confirm </td> </tr> </tbody> </table> </div> <div class="col-md-4 column"> <h2> Heading </h2> <p> Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p> <p> <a class="btn" href="#">View details »</a> </p> </div> </div> </div> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <script src="js/bootstrap-3.3.7-dist/js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script> </body> </html>  ~~~ [![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码") 结果: ![](https://images2018.cnblogs.com/blog/63651/201806/63651-20180607104202437-854968782.png)