记录一些前端小技巧。
浏览器
大部分使用技巧,基于chrome浏览器。
强制刷新
强制刷新清除本地缓存。
Windows:
- Ctrl + F5,Chrome
Macos:
Command + Shift + R,Chrome
Command + Option + R,Safari
开发者工具
F12
或ctrl + shift + i
打开开发者工具。
调试
在代码中添加debugger;
,可在开发者工具中进行代码调试。
样式
在“元素”面板,通过按钮“创建样式规则”来添加样式,会自动在“源代码”面板中相对所修改页面的路径下创建一个inspector-stylesheet文件保存修改。
在调试完样式后直接拷走其中的内容即可。
移动app
localStorage API,保存
sessionStorage API,保存的数据在app被杀掉后台之后将不存在。不希望自动登录可将登录状态保存在这
使用HTML技术开发移动app时,可添加如下meta标签:
1 |
<!-- 可视宽度为device-width;首次显示缩放级别为1,即按设备尺寸显示无缩放;最大缩放级别为1,即禁止用户放大页面;是否可缩放设置为否 --> |
calc函数:菜鸟教程
1 |
使用 calc() 函数计算 <div> 元素的宽度: |
正则表达式
笔记摘自:菜鸟教程
案例一
案例二
^
,有限定开头、(否)取反的意思。一般在中括号”[]”中使用表示否定(取反)。
1 |
//案例见后边的笔记,这里对正则表达式进行分析: |
案例三
匹配“[]”,其中字符(为数据库字段名)可有可无
1 |
//使用 RegExp对象 |
说明:
- \w,查找数字、字母及下划线。
- *,匹配任何包含零个或多个 n 的字符串。
- “\”,为转义符。使用RegExp对象,需特别注意转义,请仔细阅读代码。
- g,全局匹配
案例四
1 |
//不使用正则: |
地址栏相关
获取url中的参数值
1 |
//获取地址栏中的参数(?key=value) |
去除url指定参数
1 |
var removeURLParam = function(url,name){ |
HTML相关
单位
PX
px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。
REM
rem是CSS3新增的一个相对单位(root em,根em),使用rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。目前,除了IE8及更早版本外,所有浏览器均已支持rem。对于不支持它的浏览器,应对方法也很简单,就是多写一个绝对单位的声明。这些浏览器会忽略用rem设定的字体大小。下面就是一个例子:
1 |
p {font-size:14px; font-size:.875rem;} |
注意: 选择使用什么字体单位主要由你的项目来决定,如果你的用户群都使用最新版的浏览器,那推荐使用rem,如果要考虑兼容性,那就使用px,或者两者同时使用。
px 与 rem 的选择?
对于只需要适配少部分手机设备,且分辨率对页面影响不大的,使用px即可 。
对于需要适配各种移动设备,使用rem,例如只需要适配iPhone和iPad等分辨率差别比较挺大的设备。
摘自菜鸟教程
input
1 |
//设置 默认值 |
innerHTML和innerText
document对象中有innerHTML、innerText这两个属性,都是获取document对象文本内容,但使用起来还是有区别的;
1) innerHTML设置或获取标签所包含的HTML+文本信息(从标签起始位置到终止位置全部内容,包括HTML标签,但不包括自身)
2) outerHTML设置或获取标签自身及其所包含的HTML+文本信息(包括自身)
3) innerText设置或获取标签所包含的文本信息(从标签起始位置到终止位置的内容,去除HTML标签,但不包括自身)
4) outerText设置或获取标签自身及其所包含的文本信息(包括自身)
样式相关
占位符
1 |
中文占位符: |
打印时的样式
style标签上添加属性media="print"
。
1 |
<style media="print"> |
隐藏滚动条
1 |
/* 隐藏滚动条。element,应用在要隐藏滚动条的元素上 */ |
布局
居中
方法一:弹性盒模型。body这样设置,内部嵌套的div会水平、垂直方向居中
1 |
body { |
方法二:
1 |
父元素 |
靠到两边
上边的弹性盒模型,除了可以让元素水平、垂直居中,还可以设置靠到两边(元素内,有两个元素)。可用在header布局中。
1 |
display: flex; |
平分宽度
1 |
#父元素,设置弹性布局,水平方向 |
占满剩余空间
上边的“平分宽度”中。一个子元素设置“flex: 1”一个不设置。则设置了的,将占满剩余空间。
渐变
1 |
/*径向渐变*/ |
弹出数字键盘
1 |
document.querySelector('input').type = 'number'; //数字键盘 |
图标
标签页图标
网页标签页中的图标
使用link rel=”shortcut icon”为网页标题加图标
1 |
<link rel="shortcut icon" href="../../../images/markdown_img/2020/20210617175633.png" type="image/x-icon"> |
图片无法显示
笔记摘自:知乎
保存在gitee的图片不能正常访问,被重定向(302,防盗链)。解决方法:
1 |
<!-- html文件的head中添加以下meta标签--> |
第三方API
必应壁纸API
1 |
https://www.yangshangzhen.com/bing/wallpaper |
使用:
1 |
background: url(https://www.yangshangzhen.com/bing/wallpaper) center no-repeat; |
数据相关
小数点
1 |
// 如果去零时需要保留位数: (比如 19.520100 --> 19.52) |
过滤
使用filter()函数,过滤数组中的元素。
案例:
1 |
//this.table_data数组 中保存原始数据 |
其他应用,见VUE中的搜索框案例。
存储
详细介绍、案例,见这篇博客。
JS文件
把一些常用数据(json对象、字符串等)保存在js文件中,通过script标签引入使用。
Storage API
包括sessionStorage、localStorage。
前端数据库
转换
字符串生成文本
将字符串保存到文件中,并通过浏览器下载
1 |
function download(filename, text) {//文件名(例如:用户数据.txt)、文本内容(即待保存的字符串) |
文本转换为字符串
使用到elementUI的upload组件,有图片的选择示例。
1 |
<el-upload :on-change="fileChange" :show-file-list="false" :auto-upload="false" action="#" |
将excel转换为json
使用SheetJs将excel转换为json对象(数据保存在数组中),笔记在这篇博客。
base64
1 |
window.btoa('china is so nb') // 编码 |
JSON
获取json对象的属性值
1 |
var student = { |
获取json对象的属性
1 |
//方法一:使用上边的方法,遍历一遍 |
getOwnPropertyNames方法可以获得对象的所有属性名,并储存于一个数组当中。
keys方法只能获取可遍历的属性名并储存于数组。
删除属性
1 |
//有一个json对象如下: |
判断两个对象是否相同
1 |
// 对比两个对象的值是否完全相等 返回值 true/false |
类型判断
判断是不是数字
1 |
// true:数值型的,false:非数值型 |
object、number、string等
判断是不是数组
1 |
if(value instanceof Array){//value,要判断的数据 |
判空
判断一个对象是否存在
1 |
if (navigator.mediaDevices === undefined) { |
问题
若json对象,无法通过json对象.属性名
来获取属性值:
- 检查json对象是否被引号包裹(
{}
前后有引号),可将json对象转换为字符串,去掉前后引号后再转换为json对象。 - 尝试将内部的单引号
'
转换为双引号"
。
1 |
//例子: |
时间相关
时钟
周期定时器,实现时钟
1 |
var myInterval = setInterval(() => { |
时间格式化
自定义函数
1 |
//准备: |
第三方库
使用Day.js进行时间格式化。
1 |
<!-- cdn引入dayjs --> |
24小时制
1 |
new Date().toLocaleString('chinese', {hour12: false}) |
时间戳
第一种方法:(这种方法只精确到秒)
var timestamp = Date.parse(new Date());
结果:1545816450000
第二种方法:
var timestamp=new Date().getTime();
结果:1545816456780
第三种方法:
var timestamp=new Date().getTime();(和二重复了)
var timestamp = (new Date()).valueOf() //1572173440709
结果:1572173440709
获取月份
1 |
var getMonths = function(startTime) { |
JS语法
事件监听
addEventListener,添加事件监听器。
removeEventListener,移除监听器。
1 |
//添加事件监听器,监听自定义事件mycustom |
自定义事件
1 |
event = new CustomEvent(typeArg, customEventInit); |
CustomEvent的参数:
typeArg
- 指定事件类型,传递一个字符串。
customEventInit可选
1 |
//添加事件监听器,监听自定义事件mycustom |
模板字符串
模板字符串里面${var}
是变量的占位符,在字符串里面可以使用js语法和js表达式。
1 |
//`string` 是模板字符串,ES2015新增的符号。 |
匿名函数
(function(){})();
第一个部分(function(){})
定义一个匿名函数,第二个部分();
在匿名函数定义完成后马上调用它;
避免产生全局变量,影响整体页面环境,增加代码的兼容性。
扩展:
函数声明:使用function声明函数,并指定函数名。
1 |
function setFn() { // coding } |
注释
函数注释:
1 |
/** |
常用函数
汉字转拼音
GItee地址:Bopomofo。
下载bopomofo.js、bopomofo.min.js(字库文件,较大)文件,使用script标签引入项目。
1 |
<!-- Bopomofo汉字转拼音 --> |
长度计算
1 |
//长度计算(针对数据库长度限制,避免超长度报错) |
截取字符串
上边“长度计算”的拓展。
1 |
//截取指定长度(针对数据库长度限制)的字符串 |
程序暂停
类似Java中的休眠Thread.sleep(毫秒数);
1 |
function sleep(millisecond) { |
异步操作并行
把多个异步操作,并行执行。然后按照顺序(调用顺序,即下边案例中构造iterationFunArr时添加的顺序)返回执行结果。
1 |
// Math.ceil() 向上取整。 2.3 -》 3 |
第三方工具库
封装了一些常用js函数。
拼接sql
特殊字符处理:使用运算符||拼接或使用转义字符。
1 |
//转义 字符 ' |
获取随机数
1 |
//获取随机数。参数n为随机数的长度。 |
除前/后字符
1 |
/** |
扩展:
1 |
var datas = JSON.parse(this.textarea2); |
判断设备
扩展:
阮一峰博客:JavaScript 侦测手机浏览器的五种方法
js判断
JavaScript判断打开html的设备是手机还是电脑,以便分别设置不同的参数。
1 |
var ua = navigator.userAgent.toLowerCase(); |
CSS判断
使用@media 查询
来判断。@media 规则允许在相同样式表为不同媒体设置不同的样式。(更详细介绍,见菜鸟教程。案例1:传送门)
1 |
/*如果文档宽度小于 500 像素则修改背景颜色(background-color);500是一个经验值,用于设置手机端样式*/ |
也可以针对不同的媒体使用不同 stylesheets :
1 |
<link rel="stylesheet" media="*mediatype* and|not|only (*media feature*)" href="*mystylesheet.css*"> |
使用@media 查询
来设置手机端显示的样式,在头部最好添加下边的<meta>
标签。意思是根据手机屏幕1:1显示的页面。
1 |
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"> |
ajax
使用fetch,发起ajax请求。
fetch是web提供的一个可以获取异步资源的api,目前还没有被所有浏览器支持,它提供的api返回的是Promise对象。
1 |
fetch(this.request.url, { |
剪贴板
execCommand
使用命令execCommand实现复制、粘贴。
特点:
- 需要使用到输入组件,只能将输入组件中选中的内容拷贝至剪贴板。
- 只能读取/写入文本(剪贴板)。
- 涉及到用户隐私,在chrome浏览器中不支持执行Paste命令。使用Clipboard API解决。
复制:
1 |
//复制 |
粘贴:
1 |
//粘贴(chrome浏览器不支持执行Paste命令) |
扩展:第三方库clipboard对
document.execCommand()
命令进行封装,简化使用方法和提高兼容性。
Clipboard API
使用Clipboard API实现复制、粘贴。
特点:
- 不需要使用到输入组件
- 可将任意数据写入剪贴板、可从剪贴板读取任意数据(文本、图片、二进制数据等)
- 只支持 https 协议或开发环境localhost。
1 |
//查看权限 |
扩展:chrome浏览器,可在chrome://settings/content/clipboard
中授予剪贴板权限。
数组
判断是不是数组
1 |
if(value instanceof Array){//value,要判断的数据 |
元素操作
往数组中添加/删除元素:
- push()
- 往数组尾部添加元素,返回新数组长度
- 使用
...
即arr.push(...arr2)
,合并数组
- unshift()
- 往数组头部添加元素,返回新数组长度
- shift()
- 从数组头部开始删除(1个)元素,返回所删除的数组元素
- 一次删除一个元素,不接收参数
- pop()
- 从数组尾部开始删除(1个)元素,返回所删除的数组元素
- splice()
- 指定索引处添加/删除元素,见后边的截取/拷贝
- 注意:以上操作均会改变原数组。删除元素时,空数组不报错,但返回undefined
1 |
var arr = ['1', '2']; |
截取/拷贝
splice()
splice() 方法可以添加元素、删除元素,也可以截取数组片段。删除元素时,将返回被删除的数组片段,因此可以使用 splice() 方法截取数组片段。
array.splice(index, howmany, item1, ....., itemX)
-
index 必需。整数,指定在什么位置添加/删除项目,使用负值指定从数组末尾开始的位置。 howmany 可选。要删除的项目数。如果设置为 0,则不会删除任何项目。 item1, …, itemX 可选。要添加到数组中的新项目。
slice()
- slice() 方法与 splice() 方法功能相近,但是它仅能够截取数组中指定区段的元素,并返回这个子数组。该方法包含两个参数,分别指定截取子数组的起始和结束位置的下标。
案例
数组拷贝
slice,从数组中返回指定下标内的新数组,下标包括前不包括后。
1 |
this.showTableData = this.tableData.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this |
扩展:
浅拷贝。引用数据类型的赋值操作,是地址的拷贝。缺点:会污染源数据。
深拷贝。对数值的拷贝。深拷贝可以使用JSON的stringify、parse方法实现。
1
2
3
4//1.使用stringify方法,将JSON对象转换成字符串
JSON.stringify()
//2.使用parse方法,将字符串转换成JSON对象,再进行赋值操作
JSON.parse()
数组拆分
1 |
//案例:把一个数组拆分成两个 |
数组去重
1 |
//数组去重 |
循环遍历
笔记摘自:map和forEach的区别
1 |
//map和forEach的区别:在于返回值 |
npm命令
1 |
//下载到项目的node_modules,但不会添加到package.json文件中 |
草稿
自动点击登录按钮
1 |
setInterval(() => { |
(js)markdown插件:
https://github.com/jonschlinkert/remarkable
https://github.com/miaolz123/vue-markdown
优雅的代码
键值映射
0 - 未提交
1 - 已提交
2 - 审批中
3 - 已审批
要将数据0、1、2、3转换为对应的显示值。
1 |
//将 键值对 定义为json对象的属性,传递进来的数据要转换为显示值,将其作为json对象的key,从json对象中取出值返回即可( json对象['属性名'] ,返回对应属性值 ) |