Web前端学习笔记

it2025-06-18  12

Web前端学习笔记

1. 格式或命名问题

javascript 代码如果访问了页面中的元素需要将 script 代码放至最后,因为此时为页面还没有完全加载,获取元素有可能会失败

css 引入格式如下:

<link rel="stylesheet" type="text/css" href="">

向元素中添加事件时(如 button 中的点击时间),函数名不能与 window 中的自带函数重复,不然会导致函数不执行或其他错误,如:

<input type="button" value="清空" onclick="clear()">

此时点击按钮后函数不会执行,因为 clear 与 window 中的 clear 重名

2. 标签样式及属性问题

2.1 table

2.1.1 单元格合并

<td colspan="x"></td> <!-- 表示将该单元格与前 x-1 个列单元格合并 --> <td rowspan="x"></td> <!-- 表示将该单元格与后 x-1 个行单元格合并 -->

2.1.2 表格居中

<talbe style="margin: 0 auto; text-align: center;"></table>

2.1.3 表格以及单元格边框

td { border: 1px solid; } table { border: 1px solid; }

1px: 边框大小 solid: 直线

2.2 textarea

2.2.1 禁止拉伸样式

将其 style 样式中的 resize 设置为 none 即可

2.2.2 设置所填字符串最大/最小长度

<textarea minlength="3" maxlength="100"></textarea>

该属性只在其在表单中,且点击提交表单按钮时生效

2.2.3 设置为必填项

向其中加入 required属性

该属性只在其在表单中,且点击提交表单按钮时生效

2.3 form

2.3.1 提交问题

传统提交方法

<form action="" method=""></form> 属性值描述acceptMIME_typeHTML 5 中不支持accept-charsetcharset_list规定服务器可处理的表单数据字符集actionURL规定当提交表单时向何处发送表单数据autocompleteonoff规定是否启用表单的自动完成功能enctype见说明规定在发送表单数据之前如何对其进行编码methodgetpost规定用于发送 form-data 的 HTTP 方法nameform_name规定表单的名称novalidatenovalidate如果使用该属性,则提交表单时不进行验证target_blank_self_parent_topframename规定在何处打开 action URL

使用 Ajax

$("form").submit(function() { $.ajax({ method: 'post', url: '', data: {}, success: function() {}, error: function(err) {}, ... }); });

2.3.2 form表单提交的原生事件

form 表单在提交时会有一个原生事件,即自动刷新页面,此时如果你采用 ajax 方法想要在提交表单后进行其他处理,由于此时事件是异步的,有一定几率会先刷新页面,随后再执行你的函数

实例如下:

... <script> function sendmessage() { $.ajax({ method: 'post', url: '/SendMessage', data: {...}, success: function() { alert("提交成功"); window.location = "/"; }, error: function(err) { alert("提交失败,请刷新重试"); console.log(err); } }); } $("form").submit(function() { sendmessage(); }); </script> ...

此时 success 中的函数有一定几率被跳过

解决方法

使用 e.preventDefault() 函数阻止原生事件的发生

修改如下:

$("form").submit(function(e) { sendmessage(); e.preventDefault(); });

2.4 input

<input placeholder="提示内容" type="text" autocomplete="off" required maxlength="10" minlength="6">

placeholder

提示内容

type

类型

autocomplete

是否记忆化

required

作为表单的必填项

maxlength

最大字符长度

minlength

最小字符长度

2.5 label

将两个元素绑定起来,经常与 checkbox 连用,增强用户体验,如:

<input type="checkbox" id="remember_me"> <label for="remember_me">下次自动登录</label>

2.6 ul(ol)

去除缩进

ul { margin: 0; padding: 0; }

2.7 li

去除标签前的标识符

li { list-style: none; margin: 10px 0; }

3. CSS

3.1 margin

/* 应用于所有边 */ margin: 1em; margin: -3px; /* 上边下边 | 左边右边 */ margin: 5% auto; /* 上边 | 左边右边 | 下边 */ margin: 1em auto 2em; /* 上边 | 右边 | 下边 | 左边 */ margin: 2px 1em 0 auto; /* 全局值 */ margin: inherit; margin: initial; margin: unset;

margin 属性接受 1~4 个值。每个值可以是 <length>,<percentage>,或 auto。取值为负时元素会比原来更接近临近元素

当只指定一个值时,该值会统一应用到全部四个边的外边距上指定两个值时,第一个值会应用于上边和下边的外边距,第二个值应用于左边和右边指定三个值时,第一个值应用于上边,第二个值应用于右边和左边,第三个则应用于下边的外边距指定四个值时,依次(顺时针方向)作为上边,右边,下边,和左边的外边距

length

​ 以固定值为外边距

percentage

​ 相对于包含块的宽度,以百分比值为外边距

auto

​ 让浏览器自己选择一个合适的外边距。有时,在一些特殊情况下,该值可以使元素居中

3.2 vertical-align

用于设置元素标签在垂直方向上的位置,一般将其设置为 middle

3.3 display

值描述none此元素不会被显示block此元素将显示为块级元素,此元素前后会带有换行符inline默认。此元素会被显示为内联元素,元素前后没有换行符inline-block行内块元素。(CSS2.1 新增的值)list-item此元素会作为列表显示run-in此元素会根据上下文作为块级元素或内联元素显示compactCSS 中有值 compact,不过由于缺乏广泛支持,已经从 CSS2.1 中删除markerCSS 中有值 marker,不过由于缺乏广泛支持,已经从 CSS2.1 中删除table此元素会作为块级表格来显示(类似 <table>),表格前后带有换行符inline-table此元素会作为内联表格来显示(类似 <table>),表格前后没有换行符table-row-group此元素会作为一个或多个行的分组来显示(类似 <tbody>)table-header-group此元素会作为一个或多个行的分组来显示(类似 <thead>)table-footer-group此元素会作为一个或多个行的分组来显示(类似 <tfoot>)table-row此元素会作为一个表格行显示(类似 <tr>)table-column-group此元素会作为一个或多个列的分组来显示(类似 <colgroup>)table-column此元素会作为一个单元格列显示(类似 <col>)table-cell此元素会作为一个表格单元格显示(类似 <td> 和 <th>)table-caption此元素会作为一个表格标题显示(类似 <caption>)inherit规定应该从父元素继承 display 属性的值。

特别的,display: flex 表示弹性布局,是一种新特性,可以让父级元素内的元素禁止换行

3.4 border

border: 1px solid; /* 边框大小1px 边框形状为直线 */ border-radius: 2px; /* 设置边框角落圆弧半径 */

3.5 line-height

将其设置成和元素高度一致可使得文字垂直居中,如

div { height: 36px; line-height: 36px; }

3.6 outline

设置 outline: none; 可以去除一些元素在被选中时的边框

3.7 cursor

设置鼠标指向该元素时的形状,如 cursor: pointer; 设置为指针状

3.8 自动计算宽度和高度

有时如果对元素指定宽度和高度会出现溢出问题(即使宽度或高度未超过父元素),此时我们可以设置 css 自动计算宽度和高度

... <li> <input style="width: 60%;"> <input style="width: calc(100% - 60%); height: auto;"> </li> ...

4. jQuery

4.1 Ajax

Ajax 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)

Ajax 不是新的编程语言,而是一种使用现有标准的新方法

Ajax 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容

Ajax 不需要任何浏览器插件,但需要用户允许 JavaScript 在浏览器上执行

一般语法:

$.ajax({ method: 'post', url: '', data: {}, success: function() {}, error: function(err) {}, ... });

4.2 语法

jQuery 语法是通过选取 HTML 元素,并对选取的元素执行某些操作

基础语法:$(selector).action()

美元符号定义 jQuery选择符(selector)“查询"和"查找” HTML 元素jQuery 的 action() 执行对元素的操作

实例:

$(this).hide() - 隐藏当前元素$(“p”).hide() - 隐藏所有 <p> 元素$(“p.test”).hide() - 隐藏所有 class=“test” 的 <p> 元素$("#test").hide() - 隐藏 id=“test” 的元素

4.3 HTML相关

4.3.1 捕获元素相关属性

text() - 设置或返回所选元素的文本内容html() - 设置或返回所选元素的内容(包括 HTML 标记)val() - 设置或返回表单字段的值attr() 方法用于获取属性值

4.3.2 获取 checkbox 是否被选择

var checked = $('#checkbox').prop('checked');

4.4 JQuery实现简单搜索功能并设置关键词高亮

4.4.1 搜索功能

function search() { //获取关键词 var value = $.trim($('#search_text').val()); //获取要搜索处的父级元素 var children = $('#comments_container').children(); //对每一个子级元素进行关键词搜索 children.each(function() { $(this).hide(); //先将其隐藏 if($(this).text().indexOf(value) >= 0) { $(this).show(); //匹配成功,显示 } }); }

4.4.2 关键词高亮

利用 jQuery 第三方插件 highlight 实现关键词高亮

<script src="https://johannburkard.de/resources/Johann/jquery.highlight-5.js"></script> <script> function search() { var value = $.trim($('#search_text').val()); var children = $('#comments_container').children(); children.each(function() { $(this).hide(); $(this).removeHighlight(value); if($(this).text().indexOf(value) >= 0) { $(this).highlight(value); $(this).show(); } }); } </script>

5. node.js

5.1 node.js 中的路由机制

众所周知,Web 中后端和前端可以通过 get/post 来实现信息传递,而 node.js 为我们提供的正是一种路由机制,这种机制使我们不用新建文件便可以在后端获取前端穿过来的数据,比如:

app.get(url, function(req, res) { ... });

其中 url 相当于是路由器上的端口,是数据传输的桥梁,告诉 app 数据从哪来,应该到哪去

为了不使得 app.js 中的代码冗余繁杂,我们可以建立一个新的 js 文件,来专门存放路由相关的代码,并借用 moudle.exports 来实现文件间的调用

//路由文件 router.js var express = require("express"); var Message = require("./message"); var router = express.Router(); router.post('url', function(req, res) { ... }); module.exports = router; //app.js var path = require('path'); var express = require("express"); var router = require("./router"); var app = express(); app.use(router); //使用路由中的端口 app.use(express.static(path.join(__dirname, "public"))); app.listen(3000, function() { console.log('Start in port 3000...'); }); module.exports = app;

5.2 回调函数

先举一个栗子:

var fs = require("fs"); function get() { var Data = ""; fs.readfile(path, function(err, data) { Data = data; }); return data; }

由于 node.js 中的代码是异步处理的,所以 fs.readfile(...) 函数会优先被忽略而直接执行 return 语句,最终我们会获得空字符串而无法获得文件中的数据

解决方法:使用回调函数

var fs = require("fs"); function get(callback) { fs.readfile(path, function(err, data) { if(err) { callback(err); return; } callback(err, data); }); } get(function(err, data) { if(err) { console.log(err); return; } ... //对 data 进行处理 });

在 node.js 中,只能通过上述回调函数 (callback) 的方法才能获取异步函数的数据

5.3 中间件

暂时没有用到,所以理解不是很深刻,其基础形式如下:

app.use(function(req, res, next) { ... });

其中 next 函数是如果满足一定要求,则接着调用下一个符合要求的中间件,路由机制就是 express 中的一种中间件

目前知道的一个应用就是如果访问不存在的地址则可以通过这种机制来实现 404 跳转,因为中间件是顺序匹配的,所以如果和所有路由中的 url 均不匹配,则会进入最后一个中间件,所以我们将如下代码放至所有路由的最后即可实现 404 跳转

app.use(function (req, res, next) { res.render('404.html'); });

5.4 调用其他 node.js 文件中的变量或函数

首先,在需要调用的 js 文件中使用 require

var func = require("func.js");

方法一: 在 func.js 中使用 moudle.exports

function createTime() { ... } module.exports = { createTime: function() { return createTime(); } ... };

或者

module.exports = createTime;

方法二: 在 func.js 中使用 exports

exports.createTime = function() { ... }

5.5 nodemon

安装命令 npm install --global nodemon

一种 node 自动重启插件,可以监听 app.js 中的改动,每当按下保存后会自动重启 app.js

5.6 express

一种框架,用于加载公用、静态资源,可处理 get/post 请求

var path = require('path'); var express = require("express"); var app = express(); app.use(express.static(path.join(__dirname, "public"))); app.get('/GetMessage', function(req, res) { ... }); app.post('/PostMessage', function(req, res) { ... }); app.listen(3000, function() { console.log('Start in port 3000...'); });

5.7 fs

用于读写文件

//read file fs.readFile("message.json", 'utf8', function(err, data) { if(err) { console.log(err); res.status(404).send(err); } res.send(JSON.parse(data)); }); //write file fs.writeFile("message.json", JSON.stringify(data), function(err) { if(err) { console.log(err); res.status(404).send(err); } res.send(); });

5.8 querystring

用于解析 post 请求中的参数

app.post('/PostMessage', function(req, res) { var comment = ""; req.on('data', function(data) { comment += data; }); res.on('end', function(req, res) { //parse用于将其解析为对象 var comment1 = querystring.parse用于将其解析为对象(comment); //stringify用于将其解析为字符串 var comment2 = querystring.stringify(comment); res.send(); }); });

注意由于 js 的函数是异步处理的,所以所有处理的函数一定要放到 res.on(…) 的 function 里面,另外假设要先读取文件后写入文件,也要将写入的函数放在读取的 function 里面,如:

app.post('/SendMessage', function(req, res) { var comment = ""; req.on('data', function(data) { comment += data; }); req.on('end', function() { fs.readFile("message.json", 'utf8', function(err, data) { if(err) { console.log(err); fs.writeFile("message.json", JSON.stringify([]), function(err) { if(err) { console.log(err); res.status(404).send(err); } res.send(); }); res.status(404).send(err); } fs.writeFile("message.json", "", function(err) { if(err) { console.log(err); res.status(404).send(err); } res.send(); }); }); }); });

5.9 nodemailer

自动收发邮件的第三方包,其用法如下:

var nodemalier = require("nodemailer"); var mailTransport = nodemalier.createTransport({ service: "qq", secureConnection: true, auth : { user : '发送者邮箱', pass : 'SMTP授权码' } }); router.get('/SendEmail', function(req, res) { Email_code = Message.CreateEmailCode(); var options = { from: "发送者 <发送者邮箱>", to: '接收者邮箱', subject: "邮件标题", html: "邮件内容,支持html语法" }; mailTransport.sendMail(options, (err, info) => { ... }); });

5.10 mysql

node.js 连接本地 mysql 数据库的第三方包,其用法如下:

var mysql = require("mysql"); var connection = mysql.createConnection({ host: "localhost", user: "root", password: "root", database: "database", port: 3306, dateStrings: true }); //查询 exports.login = function(info, callback) { var sql = "select * from user where (username = '" + info.username + "' or email = '" + info.username + "') and password = '" + info.password + "';"; connection.query(sql, function(err, result) { if(err) { console.log(err); callback(err); } callback(null, result[0].username); }); }; //插入 exports.register = function(data, callback) { var sql = "insert user(username, password, email, createtime) values(?, ?, ?, ?);"; connection.query(sql, [data.username, data.password, data.email, data.createtime], function(err) { if(err) { callback(err); return; } callback(null); }); }; //删除 exports.deletemessage = function(username, id, callback) { var sql = "delete from message where username = ? and id = ?;"; connection.query(sql, [username, id], function(err, result) { if(err) { callback(err); return; } callback(null, result.affectedRows); }); } //修改 exports.changepassword = function(username, new_password, callback) { var sql = "update user set password = ? where (username = ? or email = ?);"; connection.query(sql, [new_password, username, username], function(err, result) { if(err) { callback(err); return; } callback(null, result.affectedRows); }); }

5.11 express-session

用于将用户的数据保存到服务端,如记住密码等

//一定要将其放在使用路由之前 app.use(session({ secret: 'CUG_YZL', //加密字符串 cookie: { httpOnly: true, //是否禁止在前端通过 JS 代码进行修改 maxAge: 1000 * 60 * 60 * 24 //session 保存的最大时间 }, rolling: true, //当用户在页面有操作时自动更新 session 失效时间 resave: true, //允许重复保存 //是否强制将未初始化的 session 存储(不知道什么意思,只知道 rolling 为 true 时候其必须为 false) saveUninitialized: false }));

如果想要在重新提交请求是修改其有效时间,可以采用以下这种办法:

router.post('/Login', function(req, res) { var data = ""; req.on('data', function(chunk) { data += chunk; }); req.on('end', function() { ... var hour = 1000 * 60 * 60 * 24 * 30; req.session.cookie.expires = new Date(Date.now() + hour); //修改其到期时间 req.session.cookie.maxAge = 100 * hour; //修改其有效时间 ... }); });

5.12 crypto

一种加密算法,一般用于对用户密码进行加密操作

var crypto = require("crypto"); const hash_key = "AVs5pq"; router.post('/Login', function(req, res) { var data = ""; req.on('data', function(chunk) { data += chunk; }); req.on('end', function() { data = querystring.parse(data); //注意每次加密时都要重新定义一个 md5 var md5 = crypto.createHash("md5", hash_key); data.password = md5.update(data.password).digest("hex"); ... }); });

6. art-template

一种渲染框架

<body> <div id="comment"> <div id="head"> <h1>留言板</h1> <button onclick="javascript:window.location.href='./html/comment.html'">写留言</a></button> </div> <div id="comments_container"> <ul> {{ each comments }} <li class="newslist"> {{ $value.name }}说: {{ $value.message }} <span>{{ $value.datatime }}</span> </li> {{ /each }} </ul> </div> </div> </body> <script> window.onload = function() { $.ajax({ method: "get", url: "/GetMessage", data: {}, success: function(data) { var ret = template('comment', { comments: data }); document.getElementById('comment').innerHTML = ret; }, error: function(err) { console.log(err); } }); }; </script>

要禁止字符串转义可以使用 {{@value}},注意千万不要加空格,否则会报错

6.1 与table不兼容问题

问题描述

在一个项目中,使用 art-template 对 table 内的单元格进行渲染,报错如下:

template-web.js:2 Uncaught TemplateError: comment:21:33 19| </thead> 20| <tbody><tr> >> 21| <td>{{ $value.name }}</td> 22| <td>{{ $value.message }}</td> 23| <td>{{ $value.datatime }}</td> 24| </tr></tbody> RuntimeError: Cannot read property 'name' of undefined

核心代码如下:

... <table style="margin-top: 10px;"> <thead> <tr> <td><b>发言者</b></td> <td><b>内容</b></td> <td><b>发布时间</b></td> </tr> </thead> <tbody> {{ each comments }} <tr> <td>{{ $value.name }}</td> <td>{{ $value.message }}</td> <td>{{ $value.datatime }}</td> </tr> {{ /each }} </tbody> </table> ...

解决方案

将 table 模块的代码使用 <script type="text/html" id="..."></script> 包裹,在 js 代码中动态改变相关因素的 innerHTML

具体实例如下:

... <div id="comments_container"> <script type="text/html" style="display: none;" id="Table"></script> <table style="margin-top: 10px;"> <thead> <tr> <td><b>发言者</b></td> <td><b>内容</b></td> <td><b>发布时间</b></td> </tr> </thead> <tbody> {{ each comments }} <tr> <td>{{ $value.name }}</td> <td>{{ $value.message }}</td> <td>{{ $value.datatime }}</td> </tr> {{ /each }} </tbody> </table> </script> </div> ... <script> window.onload = function() { $.ajax({ method: "get", url: "/GetMessage", data: {}, success: function(data) { var ret = template('comment', { comments: data }); document.getElementById('comment').innerHTML = ret; document.getElementById("comments_container").innerHTML = document.getElementById("Table").innerHTML; }, error: function(err) { console.log(err); } }); }; </script>

7. express-art-template

将 art-template 与 express 结合的渲染工具,可以在后端通过 res.render(url, data) 方法对页面进行跳转并渲染,并且支持设置模板页面,大大缩减代码量

7.1 在后端渲染页面

//首先启动引擎,设置渲染格式为 html app.engine("html", require("express-art-template")); //设置渲染目录,在访问时会自动将该页面放至根目录 app.set("views", path.join(__dirname, "/views/")); //对根目录进行渲染 app.get('/', function(req, res) { Message.getmessage(function(err, data) { if(err) { console.log(err); res.render("404.html"); return; } //跳转并渲染 res.render("index.html", { comments: data }); }); });

7.2 模板页面的使用

可以将某些页面的公共部分整合出来,并通过渲染语法动态加载页面,大大缩减了代码量,如:

<!-- 模板页面 layout.html --> <!DOCTYPE html> <html lang="zh-cmn-Hans"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" type="text/css" href="./public/css/style.css"> <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script src="./public/js/main.js"></script> {{ block 'head' }} {{ /block }} </head> <body> {{ block 'header' }} {{ /block }} {{ block 'content' }} {{ /block }} {{ include '../_partitals/footer.html' }} </body> {{ block 'script' }} {{ /block }} </html> <!-- 底部 footer.html --> <div id="copyright"> ... </div> <!-- 首页 index.html --> {{ extend './_layout/layout.html' }} {{ block 'head' }} <title>留言板</title> {{ /block }} {{ block 'header' }} <div id="head"> <h1>留言板</h1> <button onclick="javascript:window.location.href='comment'">写留言</a></button> </div> {{ /block }} {{ block 'content' }} <div id="comments_container"> <hr/> {{ each comments }} <div style="text-align: left; margin-left: 10px;"> <b>@{{ $value.name }}</b> <span style="font-size: 14px;">{{ $value.datatime }}</span> <p>&emsp;{{ $value.message }}</p> </div> <hr/> {{ /each }} </div> {{ /block }}

其中 {{ include … }} 用于加载其他页面,{{ block … }} 为自定义模块,{{ extend … }} 用于继承模板页面

8. node.js 项目结构

|-- node_moudles 用于存放 node.js 的第三方包 |-- public 用于存放静态资源 |-- js 用于存放 JavaScript 代码 |-- css 用于存放 css 样式文件 |-- img 用于存放图片、logo等 |-- views 用于存放视图目录 |-- _layout 用于存放底层页面模板 |-- _paritals 用于存放某些页面的公共部分,如:header.html |-- 其他 |- index.html |-- routes 用于存放路由文件 |- app.js 监听文件 |- pakege.json 包描述文件,可使用npm init 命令生成 |- pakege-lock.json 第三方包版本锁定文件(npm 5 以上版本可用) |- README.md 项目说明文档

9. 同步和异步问题

故名思议,同步即为顺序执行,而异步则是指操作系统的调度机制使得代码不按顺序执行,如上文提到的文件读写问题等等

问了解决这个问题,我们引入了 promise 工具

promise 可以将异步操作队列化,使其按照用户希望的顺序执行,并返回预期的结果

promise 有三种状态:

pending

待定状态,操作处于队列中,等待处理

fulfilled

成功状态,操作已被成功执行

rejected

执行失败

promise 仅可能处于一种状态,并且当其状态改变时会立刻触发 then 函数中的后续操作

简单实例如下:

var p = new Promise(function(resolve, reject) { ... if(success) { resolve(data); } else { reject(err); } }); p.then(function(data) { console.log(data); }, function(err) { console.log(err); });

promise 一旦被创建(new),就会立即执行内部的定义函数,并返回结果执行 then 中的后续操作

10. 其他

10.1 node.js 读取文件失败

var datapath = "./message.json"

将相对路径改为绝对路径

var path = require("path"); var datapath = path.join(__dirname, "/message.json");

10.2 判断是否为 PC 端

function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; var flag = true; for (var v = 0; v < Agents.length; v++) { if (userAgentInfo.indexOf(Agents[v]) > 0) { flag = false; break; } } return flag; }

10.3 生成验证码

var array = new Array(); var verify_code = ""; function init() { var cnt = 0; for(var i = 0; i < 10; ++i) array[cnt++] = i; for(var i = 65; i < 91; ++i) array[cnt++] = String.fromCharCode(i); for(var i = 97; i < 123; ++i) array[cnt++] = String.fromCharCode(i); } //以下内容参考至https://blog.csdn.net/qq_42463851/article/details/90755734 function change_code() { var img = document.getElementById("verify_img"); var canvas = document.createElement("canvas"); var width = img.clientWidth; var height = img.clientHeight; canvas.width = img.width; canvas.height = img.height; var context = canvas.getContext("2d"); var len = array.length; verify_code = ""; var length = 5; //生成随机字母并将其旋转后显示在图像上 for(var i = 0; i < length; ++i) { var alpha = array[Math.floor(Math.random() * len)]; var angle = Math.random() * 20 * Math.PI / 100; //产生0~20内的随机角度 angle = Math.random() < 0.5 ? angle : -angle; verify_code += alpha; var x = 10 + i * width / length; var y = Math.min(Math.max(0.6 * height + Math.random() * 10 * (Math.random() < 0.5 ? 1 : -1), 0.4 * height), 0.8 * height); context.font = "bold 20px console"; context.translate(x, y); context.rotate(angle); context.fillstyle = randomColor(); context.fillText(alpha, 0, 0); context.rotate(-angle); context.translate(-x, -y); } //生成随机线条 for(var i = 0; i < 10; ++i) { context.strokeStyle = randomColor(); //从(0, 0)开始 context.beginPath(); //将画笔移动至随机位置 context.moveTo(Math.random() * width, Math.random() * height); //画出一条随机线条 context.lineTo(Math.random() * width, Math.random() * height); context.stroke(); } //生成随机小点 for(var i = 0; i < 10; ++i) { context.strokeStyle = randomColor(); context.beginPath(); var x = Math.random() * width; var y = Math.random() * height; context.moveTo(x, y); context.lineTo(x + 1, y + 1); context.stroke(); } img.src = canvas.toDataURL("image/png"); verify_code = verify_code.toLowerCase(); } function randomColor() { var R = Math.floor(Math.random() * 256); var G = Math.floor(Math.random() * 256); var B = Math.floor(Math.random() * 256); return "rgb(" + R + ", " + G + ", " + B + ")"; }

10.4 Ajax 提交时 Json 会被转成字符串

如果要判断 bool 类型,应当使用 Bool == 'true' 来判断

10.5 JS 获取当前时间

function pushzero(number) { return number < 10 ? "0" + number : number; } function createTime() { var date = new Date(); var arr = [pushzero(date.getFullYear()) + "-", pushzero(date.getMonth() + 1) + "-", pushzero(date.getDate()) + " ", pushzero(date.getHours()) + ":", pushzero(date.getMinutes()) + ":", pushzero(date.getSeconds())]; return arr.join(""); }

10.6 设置页面为中文的方法

zh-CN 已经被废弃了,应该使用 zh-cmn-Hans

<html lang="zh-cmn-Hans">
最新回复(0)