2-5 前端页面
Thu, Jul 5, 2018
前端部分,展示了如何串联三个服务器方面的知识,所以还是很有必要好好看下的。所以写了这篇wiki。
想知道
前端应该如何使用cookie和session把身份验证流程打通?
ajax如何和服务端进行交互?
前端 → 代理服务器 → 业务服务器 的完整链条是怎样的?
前端基础
$(document).ready(function () {
alert("主文档加载完毕")
})
// js入口函数
window.onload = function () {
// 执行代码
alert("js装载完毕")
} |
引用
JS
js内部引用别的js文件:
document.write "<script src='another.js'></script>";
本质上是应该在html中再引一个js文件的
<script type="text/javascript" src="/statics/scripts/home.js"></script>
CSS
<link rel="stylesheet" type="text/css" href="/statics/style.css" />
变量
var: 申明了一个要么是全局,要么是函数级的变量
- 变量声明无论出现在代码的任何位置,都会在任何代码执行之前处理
- 给一个非声明变量赋值会隐式创建一个全局变量(全局object的一个属性)
- 如果不初始化,输出undefined或者''
let: 申明了一个块级域的局部变量,并且可以给它一个初始化值
- 与var相比let把变量的作用域限制在块级
const: 创建一个只读常量,在不同浏览器上表现为不可修改;建议申明后不修改;拥有块级作用域
- 可以在全局作用域或者函数内申明常量,但是必须初始化常量
- 常量不能和它所在作用域内其它变量或者函数拥有相同名称
jQuery简明
jQuery 语法是通过选取 HTML 元素,并对选取的元素执行某些操作。
基础语法: $(selector).action()
- 美元符号定义 jQuery
- 选择符(selector)"查询"和"查找" HTML 元素
- jQuery 的 action() 执行对元素的操作
实例:
$(this).hide() - 隐藏当前元素
$("p").hide() - 隐藏所有 <p> 元素
$("p.test").hide() - 隐藏所有 class="test" 的 <p> 元素
$("#test").hide() - 隐藏所有 id="test" 的元素
Promise
简明Demo
function runAsync(){
var def = $.Deferred();
//做一些异步操作
setTimeout(function(){
var num = Math.ceil(Math.random()*10); //生成1-10的随机数
console.log(num);
if(num<=5){
console.log("数字OK");
def.resolve(num);
}
else{
console.log("数字太大了");
def.reject('数字太大了');
}
}, 2000);
return def.promise(); //就在这里调用
}
var d = runAsync();
d.then(function(data){
console.log(data);
return runAsync();
}, function (err) {
console.log("错误的回调", err)
}).then(function(data){
console.log(data);
return runAsync();
}, function (err) {
console.log("错误的回调", err)
}).then(function(data){
console.log(data);
}, function (err) {
console.log("错误的回调", err)
}); |
选取
jQuery 选择器基于元素的 id、类、类型、属性、属性值等"查找"(或选择)HTML 元素。 它基于已经存在的 CSS 选择器,除此之外,它还有一些自定义的选择器。
jQuery 中所有选择器都以美元符号开头:$()
| 选谁 | 语法 | 目标 |
|---|---|---|
| 标签<xxx> | $("button").click(function(){}) $("p").hide() | |
| id | $("#test").hide(); | <p id="test">pick me</p> |
| class | $(".test") | <p class="test">这是一个段落。</p> |
| 所有 | $("*") | |
| 当前 HTML 元素 | $(this) | |
| (组合) 标签 + class | $("p.intro") | <p class="intro">这是一个段落,点击按钮隐藏。</p> |
| (组合) 标签 + 排序 | $("p:first") | |
| (组合) 标签+标签+排序 | $("ul li:first") | 选取第一个 <ul> 元素的第一个 <li> 元素 |
| $("ul li:first-child") | 选取每个 <ul> 元素的第一个 <li> 元素 | |
| $("[href]") | 选取带有 href 属性的元素 | |
| $("a[target='_blank']") | 选取所有 target 属性值等于 "_blank" 的 <a> 元素 | |
| $("a[target!='_blank']") | 选取所有 target 属性值不等于 "_blank" 的 <a> 元素 | |
| $(":button") | 选取所有 type="button" 的 <input> 元素 和 <button> 元素 | |
| $("tr:even") | 选取偶数位置的 <tr> 元素 | |
| $("tr:odd") | 选取奇数位置的 <tr> 元素 |
响应
使用jQuery让元素响应各种「事件」
| 鼠标事件 | 键盘事件 | 表单事件 | 文档/窗口事件 |
|---|---|---|---|
| click | keypress | submit | load |
| dblclick 双击 | keydown | change | resize |
| mouseenter 鼠标指针穿过元素 | keyup | focus | scroll |
| mouseleave 鼠标指针离开元素 | blur | unload |
使用示例:
$("p").click(function(){
// 动作触发后执行的代码!!
}); |
操纵
$("button").click(function(){
$("p").hide(1000);
}); |
其他
Ajax
javascript请求网络的异步库
$("button").click(function(){
$.get("demo_test.php",function(data,status){
alert("数据: " + data + "\n状态: " + status);
});
});
$("button").click(function(){
$.post("/try/ajax/demo_test_post.php",
{
name:"菜鸟教程",
url:"http://www.runoob.com"
},
function(data,status){
alert("数据: \n" + data + "\n状态: " + status);
});
}); |
工程实现
基本思路:
1.绑定事件
- 页面的静态元素(html模板里有的,固定展示的元素),在document.load之后,绑定各种事件
- 页面的动态元素(html里没有,请求回来数据以后生成的元素,如:评论列表),在数据请求回来、根据数据生成好DOM之后,绑定各种时间
PS:数据请求回来、根据数据生成好DOM → 就是initPage方法
2. 根据接口返回结果,刷新界面
所有页面都是这样的。然后,跳转新页面的逻辑和时机,是服务端控制的。
- 不像iOS,是先跳新页面,再发网络请求,在新页面中请求下个请求。
home.html
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="./style.css">
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous">
</script>
<script type="text/javascript" src="./scripts/home.js"></script>
<script type="text/javascript" src="./scripts/requests.js"></script>
</head>
<body id="main-back">
<div class="top-nav">
<a class="active" href="#home">Home</a>
<a href="#news">{{.Name}}</a>
<a href="#about">Help</a>
</div>
<div class="topic-back" style="padding-left:16px">
<h2 id="title">嗨,这里是你的体内,我是红血球...请随意参观~</h2>
</div>
<form method="post" id="reg-submit" action="/userhome" style="width: 500px; margin: 0 auto;">
<div class="container">
<h1>Register</h1>
<hr>
<label for="email"><b>User name</b></label>
<input id="username" type="text" placeholder="Enter user name" name="username" required>
<label for="psw"><b>Password</b></label>
<input id="pwd" type="password" placeholder="Enter Password" name="pwd" required>
<hr>
<p>By creating an account you agree to our <a href="#">Terms & Privacy</a>.</p>
<button id="reg-btn" type="submit" class="register-btn">Register</button>
</div>
<div class="container sign-in">
<p>Already have an account? <a id="sign-in-href" href="#">Sign in</a>.</p>
</div>
</form>
<form method="post" id="sign-in-submit" action="/userhome" style="width: 500px; margin: 0 auto; display: none;">
<div class="container">
<h1>Sign In</h1>
<hr>
<label for="email"><b>User name</b></label>
<input id="s-username" type="text" placeholder="Enter user name" name="username" required>
<label for="psw"><b>Password</b></label>
<input id="s-pwd" type="password" placeholder="Enter Password" name="pwd" required>
<hr>
<p>By creating an account you agree to our <a href="#">Terms & Privacy</a>.</p>
<button id="sign-in-btn" type="submit" class="register-btn">Sign In</button>
</div>
<div class="container sign-in">
<p>Don't have an account? <a id="register-href" href="#">Register</a>.</p>
</div>
</form>
</body>
</html> |
呈现

注意点:css & js文件路径不能直接用html的相对路径,而要用之前通过web服务绑定的「静态资源」路径
r.ServeFiles("/statics/*filepath", http.Dir("./template")) // 把template文件做了静态资源绑定 |
所以,css和js的引用路径:
❌ <link rel="stylesheet" type="text/css" href="./style.css"> ✅ <link rel="stylesheet" type="text/css" href="/statics/style.css" /> |
参考:问答