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" /> |
参考:问答