jQuery+Ajax+Bootstrap学习干货(二)

导读:本篇文章讲解 jQuery+Ajax+Bootstrap学习干货(二),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    这里对jQuery中的一些实际运用的例子再进行讲解一下,然后再简单的说一下关于Ajax这个方面的应用,还有一个前端框架Bootstrap的使用!!!都比较基础,想了解的可以进行更深入的学习哦!!

jQuery的实例运用

(1)jQuery实现下拉列表选项

<title>下拉列表左右选择</title>
		<script type="text/javascript" src="../js/jquery-1.8.3.js" ></script>
		<script>
			$(function(){
				/*1.选中单击去右边*/
				$("#selectOneToRight").click(function(){
					$("#left option:selected").appendTo($("#right"));
				});
				
				/*2.单击全部去右边*/
				$("#selectAllToRight").click(function(){
					$("#left option").appendTo($("#right"));
				});
				
				/*3.选中双击去右边*/
				$("#left option").dblclick(function(){
					$("#left option:selected").appendTo($("#right"));
				});
			});
		</script>
<body>
		<table border="1" width="600" align="center">
			<tr>
				<td>
					分类名称
				</td>
				<td>
					<input type="text" name="cname" value="手机数码"/>
				</td>
			</tr>
			<tr>
				<td>
					分类描述
				</td>
				<td>
					<textarea name="cdesc" rows="4" cols="20">手机数码类商品</textarea>
				</td>
			</tr>
			<tr>
				<td>
					分类商品
				</td>
				<td>
					<span style="float: left;">
						<font color="green" face="宋体">已有商品</font><br/>
						<select multiple="multiple" style="width: 100px;height: 200px;" id="left">
							<option>IPhone6s</option>
							<option>小米4</option>
							<option>锤子T2</option>
						</select>
						<p><a href="#" style="padding-left: 20px;" id="selectOneToRight">>></a></p>
						<p><a href="#" style="padding-left: 20px;" id="selectAllToRight">>>></a></p>
					</span>
					<span style="float: right;">
						<font color="red" face="宋体">未有商品</font><br/>
						<select multiple="multiple" style="width: 100px;height: 200px;" id="right">
							<option>三星Note3</option>
							<option>华为6s</option>
						</select>
						<p><a href="#" ><<</a></p>
						<p><a href="#" ><<<</a></p>
					</span>
				</td>
			</tr>
			<tr>
				<td colspan="2">
					<input type='submit' value="修改"/>
				</td>
			</tr>
		</table>
	</body>

(2)jQuery实现表单验证(重要,这个需要掌握下规则)

   案例1:validate入门

<script type="text/javascript" src="../../js/jquery-1.8.3.js" ></script>
		<!--validate.js是建立在jquery之上的,所以得先导入jquery的类库-->
		<script type="text/javascript" src="../../js/jquery.validate.min.js" ></script>
		<!--引入国际化js文件-->
		<script type="text/javascript" src="../../js/messages_zh.js" ></script>
		<script>
			$(function(){
				$("#checkForm").validate({
					rules:{
						username:{
							required:true,
							minlength:6
						},
						password:{
							required:true,
							digits:true,
							minlength:6
						}
					},
					messages:{
						username:{
							required:"用户名不能为空!",
							minlength:"用户名不得少于6位!"
						},
						password:{
							required:"密码不能为空!",
							digits:"密码必须是整数!",
							minlength:"密码不得少于6位!"
						}
					}
				});
			});
		</script>
		
	</head>
	<body>
		<form action="#" id="checkForm">
			用户名:<input type="text" name="username" /><br />
			密码:<input type="password" name="password"/><br />
			<input type="submit"/>
		</form>
	</body>

案例2:实现表单内容的验证(其中的出生日期和验证码没有进行验证,这两个需要特别的进行处理)

<script>
			$(function(){
				$("#registForm").validate({
					rules:{
						user:{
							required:true,
							minlength:3
						},
						password:{
							required:true,
							digits:true,
							minlength:6
						},
						repassword:{
							required:true,
							equalTo:"[name='password']"
						},
						email:{
							required:true,
							email:true
						},
						username:{
							required:true,
							maxlength:5
						},
						sex:{
							required:true
						}
					},
					messages:{
						user:{
							required:"用户名不能为空!",
							minlength:"用户名不得少于3位!"
						},
						password:{
							required:"密码不能为空!",
							digits:"密码必须是整数!",
							minlength:"密码不得少于6位!"
						},
						repassword:{
							required:"确认密码不能为空!",
							equalTo:"两次输入密码不一致!"
						},
						email:{
							required:"邮箱不能为空!",
							email:"邮箱格式不正确!"
						},
						username:{
							required:"姓名不能为空!",
							maxlength:"姓名不得多于5位!"
						},
						sex:{
							required:"性别必须勾选!"
						}
					},
					errorElement: "label", //用来创建错误提示信息标签,validate插件默认的就是label
					success: function(label) { //验证成功后的执行的回调函数
						//label指向上面那个错误提示信息标签label
						label.text(" ") //清空错误提示消息
							.addClass("success"); //加上自定义的success类
					}
				});
			});
		</script>
<form action="#" method="get" id="registForm">
		<div id="father">
			<div id="form2">
				<table border="0px" width="100%" height="100%" align="center" cellpadding="0px" cellspacing="0px" bgcolor="white">
								<tr>
									<td colspan="2" >
										          
										<font size="5">会员注册</font>   USER REGISTER 
									</td>
								</tr>
								<tr>
									<td width="180px">
										      										      										   
										<label for="user" >用户名</label>
									</td>
									<td>
						<em style="color: red;">*</em>   <input type="text" name="user" size="35px" id="user"/>
									</td>
								</tr>
								<tr>
									<td>										      									      
										   
										密码
									</td>
									<td>
						<em style="color: red;">*</em>   <input type="password"  name="password" size="35px" id="password" />
									</td>
								</tr>
								<tr>
									<td>
										      										      									   
										确认密码
									</td>
									<td>
						<em style="color: red;">*</em>   <input type="password" name="repassword" size="35px"/>
									</td>
								</tr>
								<tr>
									<td>
										      
										      
										   
										Email
									</td>
									<td>
						<em style="color: red;">*</em>   <input type="text" name="email" size="35px" id="email"/>
									</td>
								</tr>
								<tr>
									<td>
   
										姓名
									</td>
									<td>
				<em style="color: red;">*</em>   <input type="text" name="username" size="35px"/>
									</td>
								</tr>
								<tr>
									<td>
										      
										      
										   
										性别
									</td>
									<td>
						<span style="margin-right: 155px;">
							<em style="color: red;">*</em>   <input type="radio" name="sex" value="男"/>男
								<input type="radio" name="sex" value="女"/>女<em></em>
								<label for="sex" class="error" style="display: none;"></label>
								</span>
										
									</td>
								</tr>
								<tr>
									<td>
				出生日期
									</td>
									<td>
					<em style="color: red;">*</em>   <input type="text" name="birthday"  size="35px"/>
									</td>
								</tr>
								<tr>
									<td>
	   
										验证码
									</td>
									<td>
			<em style="color: red;">*</em>   <input type="text" name="yanzhengma" />
		<img src="../img/yanzhengma.png" style="height: 18px;width: 85px;"/>
									</td>
								</tr>
								<tr>
									<td colspan="2">										      									      
								<input type="submit" value="注      册" height="50px"/>
									</td>
								</tr>
							</table>
						</div>
					</div>
				</form>

Ajax知识点:

(1):原生JS调用例子

<script type="text/javascript"> 
function fn1(){ 
	//1、创建ajax引擎对象 ---- 所有的操作都是通过引擎对象 
	var xmlHttp = new XMLHttpRequest(); 
	//2、绑定监听 ---- 监听服务器是否已经返回相应数据 
	xmlHttp.onreadystatechange = function(){ 
		if(xmlHttp.readyState==4&&xmlHttp.status==200){ 
			//5、接受相应数据 var res = xmlHttp.responseText; 
			document.getElementById("span1").innerHTML = res; } 
		} 
	//3、绑定地址 
	xmlHttp.open("GET","/WEB22/ajaxServlet?name=lisi",true); 
	//true为异步 //4、发送请求 xmlHttp.send(); } 
	function fn2(){ 
		//1、创建ajax引擎对象 ---- 所有的操作都是通过引擎对象
		var xmlHttp = new XMLHttpRequest(); 
		//2、绑定监听 ---- 监听服务器是否已经返回相应数据 
		xmlHttp.onreadystatechange = function(){
			if(xmlHttp.readyState==4&&xmlHttp.status==200){ 
				//5、接受相应数据 
				var res = xmlHttp.responseText; 
				document.getElementById("span2").innerHTML = res; } 
			} 
		//3、绑定地址 
		xmlHttp.open("POST","/WEB22/ajaxServlet",false); 
		//false为同步 
		//4、发送请求 
		xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
		xmlHttp.send("name=wangwu"); } 
	</script>
<body>
	<input type="button" value="异步访问服务器端" οnclick="fn1()">
	<span id="span1"></span>
	<br>
	<input type="button" value="同步访问服务器端" οnclick="fn2()">
	<span id="span2"></span>
	<br>
	<input type="button" value="测试按钮" οnclick="alert()">
</body>

原生的方法大概就是上面的五个步骤,然后可以看到异步和同步之间的区别,这是首先要明白的内容

(2)GET 和 POST 和 jQuery结合aJax进行的使用

<script type="text/javascript"> 
	function fn1(){ 
		//get异步访问
		$.get( "/WEB22/ajaxServlet2", //url地址 
				{"name":"张三","age":25}, //请求参数
				function(data){ //执行成功后的回调函数 //{\"name\":\"tom\",\"age\":21} 
				alert(data.name); }, "json" ); } 
	function fn2(){ //post异步访问 
		$.post( "/WEB22/ajaxServlet2", //url地址 
				{"name":"李四","age":25}, //请求参数 
				function(data){ //执行成功后的回调函数 
					alert(data.name); }, "json" ); } 
	function fn3(){ 
		$.ajax({ 
			url:"/WEB22/ajaxServlet2", 
			async:true, 
			type:"POST", 
			data:{"name":"lucy","age":18}, 
			success:function(data){ 
				alert(data.name); 
				}, 
				error:function()
				{ 
					alert("请求失败"); 
				}, 
				dataType:"json" 
				}); 
		} </script>

<body>
	<input type="button" value="get访问服务器端" οnclick="fn1()">
	<span id="span1"></span>
	<br>
	<input type="button" value="post访问服务器端" οnclick="fn2()">
	<span id="span2"></span>
	<br>
	<input type="button" value="ajax访问服务器端" οnclick="fn3()">
	<span id="span2"></span>
	<br>
</body>
</html>

(3)实例:用aJax使用360搜索的jsonp接口,然后当输入内容的时候,能够进行响应的反馈搜索内容(就是类似百度这样的)

<script type="text/javascript">

	//实现一个简易版的搜索框事件
	$(function () {
		$('.inputkey').keyup(function() {
			var values = $('.inputkey').val();			
			//用ajax请求公开的接口数据
			//该例子功能:通过360的一个搜索jsonp接口,然后当输入c的时候,获取360网页搜素框弹出来的内容
			$.ajax({
				url:'http://sug.so.360.cn/suggest?',
				type:'GET',
				dataType:'jsonp',
				data:{ word : values}           //这是设置一下关键字
			})
			//当请求成功执行下面:
			.done(function(data) {
				$('.list').empty();
				//将请求到的数据显示出来,jQuery知识中的添加节点
				for(var i =0 ; i <data.s.length ; i++){
					var $li = $('<li>'+data.s[i]+'</li>');
					$li.appendTo($('.list'));
				}
			})
			//请求失败执行下面:
			.fail(function() {
				alert("fail");
			})
		})
	})
</script>
<body>
	<input type="text" id ="inputkey" class="inputkey">
	<ul class="list" id="list">
	</ul>
</body>

(4)Ajax提交form表单

$.post("<%=basePath%>customer/update.action",$("#edit_customer_form").serialize(),function(data){
				alert("客户信息更新成功!");
				window.location.reload();
			});

备注:参数1:访问地址

   参数2:需要传送的表单,并进行序列化

   参数3:访问成功后,返回处理函数

Bootstrap知识点:

(1)实例:响应式改变页面布局(随不同屏幕尺寸进行改变)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Bootstrap</title>
</head>
<script type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<link rel="stylesheet" href="css/bootstrap.min.css" type="text/css"></link>
<style type="text/css">
body {
	background-color: #e8fcfd;
}

.pic {
	max-width: 200px;
	border: 1px solid red;
	height: 200px;
	margin: 15px auto;
	background-color: yellow;
}

.picture {
	
}
</style>
<script type="text/javascript">
	$(function() {
		$('#dis').children().click(function() {
			alert($(this).index());
			return false;
		})
	})
</script>
<body>
	<div class="container">
		<div class="row" id="dis">
			<div class="col-log-3 col-md-4 col-sm-6">
				<div class="pic" id="di">个人信息修改</div>
			</div>
			<div class="col-log-3 col-md-4 col-sm-6">
				<div class="pic" id="di">密码修改</div>
			</div>
			<div class="col-log-3 col-md-4 col-sm-6">
				<div class="pic" id="di">功能三</div>
			</div>
			<div class="col-log-3 col-md-4 col-sm-6">
				<div class="pic" id="di">功能四</div>
			</div>
			<div class="col-log-3 col-md-4 col-sm-6">
				<div class="pic" id="di">功能五</div>
			</div>
			<div class="col-log-3 col-md-4 col-sm-6">
				<div class="pic" id="di">功能六</div>
			</div>
			<div class="col-log-3 col-md-4 col-sm-6">
				<div class="pic" id="di">功能七</div>
			</div>
		</div>
	</div>
</body>
</html>

总结:其中主要就是属性class =”container”  和class=”col-log-N”   其中这个需要符合12的倍数才行,否则布局会存在问题。比如上面的例子,大家应该就能看出来关系。然后其中这个参数可以为col-lg-N    ,,col-md-N,,,,,,,,col-sm-N,,,,,col-xs-N  (含义就是对于不同的尺寸屏幕进行适配)

(2)关于Bootstrap中的主要内容,用下面的这个例子来进行演示,大家可以运行看看

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width , user-scalable=no , initial-scale=1.0 
		,maximum-scale=1.0, minimum-scale=1.0"  >
<title>Bootstrap</title>
</head>
<script type="text/javascript" src = "js/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src = "js/bootstrap.min.js"></script>
<link rel="stylesheet" href = "css/bootstrap.min.css" type="text/css"></link>


<style type="text/css">
	hr{
	color: green;
	}
	
	body{
	 background-color: #e8fcfd;
	}

	.pic{
		max-width: 200px;
		border: 1px solid red;
		height: 200px;
		margin: 15px auto;
		background-color: yellow;
	}
	
	.navbar-default .navbar-nav>li>a {
    color: #ff0000;
	}
	
	.fclass{
			width: 500px;
			background-color: #f5f5f5;
	}
	.zclass{
			width:20px;
			background-color: blue;
			text-align: center;
	}
	.val{color: white;}
</style>

<script type="text/javascript">
	$(function () {
		$('#dis').children().click(function() {
			alert($(this).index());
			return false;
		})
		
		
		//JS控制模态框
		$('#btn1').click(function() {
			$('#modal01').modal('show');
		});
		
		
		
		//进度条的控制
		var timer = null;  //计时器
		$('.fclass').click(function() {
			alert("开始加载,请稍后!");
			//每500毫秒一次
			timer = setInterval(jindutiaomove , 500);
			$('.fclass').unbind("click");//移除点击事件,防止多次点击
		})
		//进度条的控制
		function jindutiaomove() {
			//获取进度当前的数值
			var con = $('#val').text();
			//得到当前的进度
			var sub =parseInt(con.substring(0,con.length-1));
			//进度+1
			sub = sub + 1;
			//判断是否等于或超过100%,表示完成
			if(sub == 100){
				//隐藏标签
				$('.fclass').hide();
				alert("加载成功");
				//让进度条消失				
				//定时器关闭
				clearInterval(timer);			
				return ;
			}
			//否则设置显示内容
			$('#val').html(sub+"%"); 
			var wid = parseInt($('.zclass').width());
			//因为父div标签有500的宽
			wid = wid + 5;
			if(wid > 20){
				//设置css内容,来表示进度条再变化
				$('.zclass').css({width:wid});
			}		
		}	
	})
</script>

<body>
	<!-- 巨幕效果 -->
	<div class="jumbotron">
		<div class="container">
			<h1>欢迎访问</h1>
			<p>欢迎正文</p>
		</div>
	</div>

	<!-- 导航条的制作 -->
	<div class="navbar navbar-default navbar-static-top">
		<div class="container">
		<!-- 导航头 -->
			<div class="navbar-header">
				<button class="navbar-toggle" data-toggle="collapse"
					data-target="#togglemenu">
					<span class="icon-bar"></span> <span class="icon-bar"></span> <span
						class="icon-bar"></span>
				</button>
				<a href="#" class="navbar-brand">CSAPP</a>
			</div>

			<!-- 制订导航栏菜单内容 -->
			<div class="collapse navbar-collapse" id="togglemenu">
				<ul class="nav navbar-nav ">
					<li class="active"><a href="#" class="changecolor">首页</a></li>
					<li><a href="#" class="changecolor">个人信息修改</a></li>
					<li><a href="#" class="changecolor">密码修改</a></li>
					<li><a href="#" class="changecolor">其他功能1</a></li>
					<li><a href="#" class="changecolor">其他功能2</a></li>
					<li><a href="#" class="changecolor">其他功能3</a></li>
					<li><a href="#" class="changecolor">其他功能4</a></li>
					<li><a href="#">其他功能5</a></li>
				</ul>

				<form class="navbar-form navbar-right">
					<div class="form-group">
						<div class="input-group">
							<input type="text" name="" class="form-control"> <span
								class="input-group-btn">
								<button class="btn btn-default">
									<span class="glyphicon glyphicon-search"></span>
									搜索
								</button>
							</span>
						</div>
					</div>
				</form>
			</div>
		</div>
	</div>

	<!--栅格系统 -->
	<div class="container">
		<div class="row" id="dis">
			<div class="col-log-3 col-md-4 col-sm-6" ><div class="pic" id="di">个人信息修改</div></div>
			<div class="col-log-3 col-md-4 col-sm-6" ><div class="pic" id="di">密码修改</div></div>
			<div class="col-log-3 col-md-4 col-sm-6" ><div class="pic" id="di">功能三</div></div>
			<div class="col-log-3 col-md-4 col-sm-6" ><div class="pic" id="di">功能四</div></div>
			<div class="col-log-3 col-md-4 col-sm-6" ><div class="pic" id="di">功能五</div></div>
			<div class="col-log-3 col-md-4 col-sm-6" ><div class="pic" id="di">功能六</div></div>
			<div class="col-log-3 col-md-4 col-sm-6" ><div class="pic" id="di">功能七</div></div>			
		</div>	
	</div>
	
	<!-- 具有按钮的样式使用 -->
	<button class="btn btn-success">我是Button</button>
	<a class = "btn btn-warning" href="#">我是带有button效果的超链</a>
	<button class="btn btn-info btn-block">我是满屏的按钮</button>
	<button class="btn btn-danger btn-lg">我是变大的按钮</button>
	<button class="btn btn-danger btn-sm">我是中等的按钮</button>
	<button class="btn btn-danger btn-xs">我是最小的按钮</button>
	
	<br>
	<hr>
	<!-- 按钮组的使用,就是将多个按钮设置为一组 ,也可以调整大小,通过btn-group-lg和sm和xs-->
	<div class="btn-group btn-group-sm">
	<button class="btn btn-info ">我是按钮1</button>
	<button class="btn btn-default ">我是按钮2</button>
	<button class="btn btn-danger ">我是按钮3</button>
	</div>
	<br>
	<hr>	
	<!-- 占满屏的按钮组 -->
	<div class="btn-group btn-group-justified">
		<div class="btn-group">
			<button class="btn btn-info ">我是按钮1</button>
		</div>
		<div class="btn-group">
			<button class="btn btn-default ">我是按钮2</button>
		</div>
		<div class="btn-group">
			<button class="btn btn-danger ">我是按钮3</button>
		</div>
	</div>

	<br><hr>
	<!-- 表单的样式 -->
	<form action="hello.html" method="post">
		<div class="form-group">
			<label for="exampleInputEmail1">Email address</label> <input
				type="email" class="form-control" id="exampleInputEmail1"
				placeholder="Email">
		</div>
		<div class="form-group">
			<label for="exampleInputPassword1">Password</label> <input
				type="password" class="form-control" id="exampleInputPassword1"
				placeholder="Password">
		</div>
		<div class="form-group">
			<label for="exampleInputFile">File input</label> <input type="file"
				id="exampleInputFile">
			<p class="help-block">Example block-level help text here.</p>
		</div>
		<div class="checkbox">
			<label> <input type="checkbox"> Check me out
			</label>
		</div>
		<button type="submit" class="btn btn-default">Submit</button>
	</form>
	
	
	<br><br><hr style="color: black;">
	<!-- 按钮带图标 -->
	<button class="btn btn-success"><span class="glyphicon glyphicon-music"></span>音乐</button>

	<!-- 多种模态框的使用 -->
	<div class="container">
		<h1>模态框</h1>
		<button class="btn btn-success" id="btn1">js控制弹出</button>

		<button class="btn btn-primary" data-toggle="modal" data-target="#modal01">大摸态框</button>

		<button class="btn btn-primary" data-toggle="modal" data-target="#modal02">一般摸态框</button>

		<button class="btn btn-primary" data-toggle="modal" data-target="#modal03">小摸态框</button>
	</div>
	
		<!--大模态框 -->
	<div class="modal fade" id="modal01">
		<div class="modal-dialog modal-lg"> <!-- 在这里设置大小就可以了 -->
			<div class="modal-content">

				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>				
					弹框的标题
				</div>

				<div class="modal-body">
					弹框主体<br><br>
					主体文字

				</div>

				<div class="modal-footer">
					<button class="btn btn-primary">确定</button>
					<button class="btn btn-warning" data-dismiss="modal">取消</button>
				</div>
			</div>
		</div>
	</div>
	<!--中等模态框 -->
	<div class="modal fade" id="modal02">
		<div class="modal-dialog">
			<div class="modal-content">

				<div class="modal-header">
					弹框的标题
				</div>

				<div class="modal-body">
					弹框主体
				</div>

				<div class="modal-footer">
					<button class="btn btn-primary">确定</button>
					<button class="btn btn-warning" data-dismiss="modal">取消</button>
				</div>

			</div>
		</div>
	</div>

	<!-- 小模态框 -->
	<div class="modal fade" id="modal03">
		<div class="modal-dialog modal-sm">
			<div class="modal-content">

				<div class="modal-header">
					弹框的标题
				</div>

				<div class="modal-body">
					弹框主体
				</div>

				<div class="modal-footer">
					<button class="btn btn-primary">确定</button>
					<button class="btn btn-warning" data-dismiss="modal">取消</button>
				</div>

			</div>
		</div>
	</div>
	
	<!-- 自己用jquery写的进度条 -->
	<div class ="fclass">
		<div class="zclass">
			<p id="val" class ="val">0%</p>			
		</div>
	</div>

	<!-- Bootstrop自带的进度条 (静态的,自己可以根据我上面写的进行变化就可以了)-->
	<div class="progress">
		<div class="progress-bar progress-bar-striped active"
			role="progressbar" aria-valuenow="45" aria-valuemin="0"
			aria-valuemax="100" style="width: 45%">
			<span class="sr-only">45% Complete</span>
		</div>
	</div>
</body>
</html>

大家如果对Bootstrap中的内容很感兴趣,可以直接百度Bootstrap中文网官网,里面有很多的例子,可以进行参考

(3)会持续进行更新哦!!!!!!!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/12445.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!