在github上看了justjavac的一篇关于小程序资源的汇总,觉得挺不错的就并转发至
]]>
面对这个问题?我想了想,看了看,参考了一下别人的文章,并自己梳理了一下知识,其中有好多东西没有涉及到比如web安全、性能优化、绘话技术、存储技术、负载均衡、集群等,日后有空再慢慢补充,此文也只是简单的记录一下自己对此的理解。以便形成自己前端知识体系,如若有错,欢迎指出!,哈哈哈哈哈,不瞎扯了,看文章了
!

DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库
dns解析成IP的大致流程:
注意,域名查询时有可能是经过了CDN调度器的(如果有cdn存储功能的话)。而且,需要知道dns解析是很耗时的,因此如果解析域名过多,会让首屏加载变得过慢,可以考虑 dns-prefetch优化。
chrome://dns
清除Chrome浏览器的DNS缓存

清除本机DNS缓存,此截图以win系统为例, cmd输入命令ipconfig /flushdns

http的本质就是 tcp/ip请求。
需要了解3次握手规则建立连接以及断开连接时的四次挥手。
tcp将http长报文划分为短报文,通过三次握手与服务端建立连接,进行可靠传输。
三次握手的步骤(抽象派)
建立连接成功后,接下来就正式传输数据。
然后,待到断开连接时,需要进行四次挥手(因为是全双工的,所以需要四次挥手)。
四次挥手的步骤(抽象派)
tcp/ip的并发限制
浏览器对同一域名下并发的tcp连接是有限制的(2-10个不等)。
而且在http1.0中往往一个资源下载就需要对应一个tcp/ip请求。
所以针对这个瓶颈,又出现了很多的资源优化方案。
get和post的区别
get和post虽然本质都是tcp/ip,但两者除了在http层面外,在tcp/ip层面也有区别。
get会产生一个tcp数据包,post两个。
具体就是:
headers和 data一起发送出去,服务器响应200(返回数据),headers,服务器响应 100continue,浏览器再发送 data,服务器响应200(返回数据)。再说一点,这里的区别是 specification(规范)层面,而不是 implementation(对规范的实现)
其实这个概念挺难记全的,记不全没关系,但是要有一个整体概念。
其实就是一个概念:从客户端发出http请求到服务器接收,中间会经过一系列的流程。
简括就是:从应用层的发送http请求,到传输层通过三次握手建立tcp/ip连接,再到网络层的ip寻址,再到数据链路层的封装成帧,最后到物理层的利用物理介质传输。
当然,服务端的接收就是反过来的步骤。
五层因特尔协议栈其实就是: 1.应用层(dns,http) DNS解析成IP并发送http请求 2.传输层(tcp,udp) 建立tcp连接(三次握手) 3.网络层(IP,ARP) IP寻址 4.数据链路层(PPP) 封装成帧 5.物理层(利用物理介质传输比特流) 物理传输(然后传输的时候通过双绞线,电磁波等各种介质)
当然,其实也有一个完整的OSI七层框架,与之相比,多了会话层、表示层。
OSI七层框架: 物理层、 数据链路层、 网络层、 传输层、 会话层、表示层、 应用层。


这里面最常用到的就是状态码,很多时候都是通过状态码来判断,如(列举几个最常见的):

渲染引擎首先通过网络获得所请求文档的内容后进行如下渲染流程
渲染基本流程:
解析html以构建dom树->构建render树->布局render树->绘制render树

具体渲染流程图如下

webkit渲染引擎的主流程

Mozilla的Geoko 渲染引擎主流程
从图可以看出,尽管webkit和Gecko使用的术语稍有不同,他们的主要流程基本相同。Gecko称可见的格式化元素组成的树为frame树,每个元素都是一个frame,webkit则使用render树这个名词来命名由渲染对象组成的树。Webkit中元素的定位称为布局,而Gecko中称为回流。Webkit称利用dom节点及样式信息去构建render树的过程为attachment,Gecko在html和dom树之间附加了一层,这层称为内容接收器,相当制造dom元素的工厂。下面将讨论流程中的各个阶段。
参考资料:
]]>先来看一下,知乎的大佬们对mpvue的看法………….
mpvue (github 地址请参见)是一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验。
使用 mpvue 开发小程序,你将在小程序技术体系的基础上获取到这样一些能力:
Vue.js 开发体验Vuex 数据管理方案:方便构建复杂应用webpack 构建机制:自定义构建策略、开发阶段 hotReloadVue.js 命令行工具 vue-cli 快速初始化项目其它特性正在等着你去探索,详细文档。
mpvue 作为小程序版本的 Vue.js,在框架 SDK 之外,完整的技术体系还包括如下设施。

● 将小程序页面编写为 Vue.js 实现
● 以 Vue.js 开发规范实现父子组件关联
小程序代码
● 以小程序开发规范编写视图层模板
● 配置生命周期函数,关联数据更新调用
● 将 Vue.js 数据映射为小程序数据模型
并在此基础上,附加如下机制
● Vue.js 实例与小程序 Page 实例建立关联
● 小程序和 Vue.js 生命周期建立映射关系,能在小程序生命周期中触发 Vue.js 生命周期
● 小程序事件建立代理机制,在事件代理函数中触发与之对应的 Vue.js 组件事件响应
本文假设你既不会 vue 也不会小程序,如嫌拖沓,请直接快进跳读。
现代前端开发框架和环境都是需要 Node.js 的,如果没有的话,请先下载 nodejs 并安装。
然后打开命令行工具:
1 | 1. 先检查下 Node.js 是否安装成功 |
随着运行成功的回显之后,可以看到本地多了个 dist 目录,这个目录里就是生成的小程序相关代码。
这一步比较简单,按照提示一步步安装好就行,然后用微信扫描二维码登陆。 至此小程序的开发环境差不多完成。
选择 小程序项目 并依次填好需要的信息:
如图:

点击“确定”按钮后会跳到正式的开发页面,点击“编辑器”按钮,关闭自带的小程序编辑器。然后如图:

此时,整个 mpvue 项目已经跑起来了。
用自己趁手的编辑器(或者IDE)打开 my-project 中的 src 目录下的代码试试,如示例:
到此,上手完毕。
npm run dev 来进行编译
- 原文地址:Recap of Front-end Development in 2017
- 原文作者:FrontendMasters
- 译文出自:掘金翻译计划
- 本文永久链接:github.com/xitu/front-…
- 译者:bambooom
- 校对者:realYukiko
更多精彩内容请关注:前端开发者指南 2018
]]>掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。
代码如下:
1 |
|
在学习js的数组和字符串方法的时候会发现彼此之间好多方法是类似的,为了方便记忆及发现两者之间的关联,之后就自己总结了一个xmind的思维导构,总结可能有瑕疵,哪里有错误的话,希望各位大牛多指出!ThankYou!!!
###注意:
由于考虑到该思维导构图为png格式,所以图片里面的备注是没办法看到的,所以如果需要源文件的话可以点击下面百度云链接下载,辛苦编写,如果觉得对您有用的话,不吝点个赞哈!谢谢。
链接:http://pan.baidu.com/s/1hr5IZZY 密码:5alp
]]>typora-copy-images-to: medias
[TOC]
插件建议在线安装,因为离线安装 容易出现问题
| 按 Press | 功能 Function |
|---|---|
| Ctrl + Shift + P,F1 | 显示命令面板 Show Command Palette |
| Ctrl + P | 快速打开 Quick Open |
| Ctrl + Shift + N | 新窗口/实例 New window/instance |
| Ctrl + Shift + W | 关闭窗口/实例 Close window/instance |
| 按 Press | 功能 Function |
|---|---|
| Ctrl+X | 剪切行(空选定) Cut line (empty selection) |
| Ctrl+C | 复制行(空选定)Copy line (empty selection) |
| Alt+ ↑ / ↓ | 向上/向下移动行 Move line up/down |
| Shift+Alt + ↓ / ↑ | 向上/向下复制行 Copy line up/down |
| Ctrl+Shift+K | 删除行 Delete line |
| Ctrl+Enter | 在下面插入行 Insert line below |
| Ctrl+Shift+Enter | 在上面插入行 Insert line above |
| Ctrl+Shift+\ | 跳到匹配的括号 Jump to matching bracket |
| Ctrl+] / [ | 缩进/缩进行 Indent/outdent line |
| Home | 转到行首 Go to beginning of line |
| End | 转到行尾 Go to end of line |
| Ctrl+Home | 转到文件开头 Go to beginning of file |
| Ctrl+End | 转到文件末尾 Go to end of file |
| Ctrl+↑ / ↓ | 向上/向下滚动行 Scroll line up/down |
| Alt+PgUp / PgDown | 向上/向下滚动页面 Scroll page up/down |
| Ctrl+Shift+[ | 折叠(折叠)区域 Fold (collapse) region |
| Ctrl+Shift+] | 展开(未折叠)区域 Unfold (uncollapse) region |
| Ctrl+K Ctrl+[ | 折叠(未折叠)所有子区域 Fold (collapse) all subregions |
| Ctrl+K Ctrl+] | 展开(未折叠)所有子区域 Unfold (uncollapse) all subregions |
| Ctrl+K Ctrl+0 | 折叠(折叠)所有区域 Fold (collapse) all regions |
| Ctrl+K Ctrl+J | 展开(未折叠)所有区域 Unfold (uncollapse) all regions |
| Ctrl+K Ctrl+C | 添加行注释 Add line comment |
| Ctrl+K Ctrl+U | 删除行注释 Remove line comment |
| Ctrl+/ | 切换行注释 Toggle line comment |
| Shift+Alt+A | 切换块注释 Toggle block comment |
| Alt+Z | 切换换行 Toggle word wrap |
| 按 Press | 功能 Function |
|---|---|
| Ctrl + T | 显示所有符号 Show all Symbols |
| Ctrl + G | 转到行… Go to Line… |
| Ctrl + P | 转到文件… Go to File… |
| Ctrl + Shift + O | 转到符号… Go to Symbol… |
| Ctrl + Shift + M | 显示问题面板 Show Problems panel |
| F8 | 转到下一个错误或警告 Go to next error or warning |
| Shift + F8 | 转到上一个错误或警告 Go to previous error or warning |
| Ctrl + Shift + Tab | 导航编辑器组历史记录 Navigate editor group history |
| Alt + ←/→ | 返回/前进 Go back / forward |
| Ctrl + M | 切换选项卡移动焦点 Toggle Tab moves focus |
| 按 Press | 功能 Function |
|---|---|
| Ctrl + F | 查找 Find |
| Ctrl + H | 替换 Replace |
| F3 / Shift + F3 | 查找下一个/上一个 Find next/previous |
| Alt + Enter | 选择查找匹配的所有出现 Select all occurences of Find match |
| Ctrl + D | 将选择添加到下一个查找匹配 Add selection to next Find match |
| Ctrl + K Ctrl + D | 将最后一个选择移至下一个查找匹配项 Move last selection to next Find match |
| Alt + C / R / W | 切换区分大小写/正则表达式/整个词 Toggle case-sensitive / regex / whole word |
| 按 Press | 功能 Function |
|---|---|
| Alt +单击 | 插入光标 Insert cursor |
| Ctrl + Alt +↑/↓ | 在上/下插入光标 Insert cursor above / below |
| Ctrl + U | 撤消上一个光标操作 Undo last cursor operation |
| Shift + Alt + I | 在选定的每一行的末尾插入光标 Insert cursor at end of each line selected |
| Ctrl + I | 选择当前行 Select current line |
| Ctrl + Shift + L | 选择当前选择的所有出现 Select all occurrences of current selection |
| Ctrl + F2 | 选择当前字的所有出现 Select all occurrences of current word |
| Shift + Alt + → | 展开选择 Expand selection |
| Shift + Alt + ← | 缩小选择 Shrink selection |
| Shift + Alt + (拖动鼠标) | 列(框)选择 Column (box) selection |
| Ctrl + Shift + Alt +(箭头键) | 列(框)选择 Column (box) selection |
| Ctrl + Shift + Alt + PgUp / PgDown | 列(框)选择页上/下 Column (box) selection page up/down |
| 按 Press | 功能 Function |
|---|---|
| Ctrl + 空格 | 触发建议 Trigger suggestion |
| Ctrl + Shift + Space | 触发器参数提示 Trigger parameter hints |
| Tab | Emmet 展开缩写 Emmet expand abbreviation |
| Shift + Alt + F | 格式化文档 Format document |
| Ctrl + K Ctrl + F | 格式选定区域 Format selection |
| F12 | 转到定义 Go to Definition |
| Alt + F12 | Peek定义 Peek Definition |
| Ctrl + K F12 | 打开定义到边 Open Definition to the side |
| Ctrl + . | 快速解决 Quick Fix |
| Shift + F12 | 显示引用 Show References |
| F2 | 重命名符号 Rename Symbol |
| Ctrl + Shift + . /, | 替换为下一个/上一个值 Replace with next/previous value |
| Ctrl + K Ctrl + X | 修剪尾随空格 Trim trailing whitespace |
| Ctrl + K M | 更改文件语言 Change file language |
| 按 Press | 功能 Function |
|---|---|
| Ctrl+F4, Ctrl+W | 关闭编辑器 Close editor |
| Ctrl+K F | 关闭文件夹 Close folder |
| Ctrl+\ | 拆分编辑器 Split editor |
| Ctrl+ 1 / 2 / 3 | 聚焦到第1,第2或第3编辑器组 Focus into 1st, 2nd or 3rd editor group |
| Ctrl+K Ctrl+ ←/→ | 聚焦到上一个/下一个编辑器组 Focus into previous/next editor group |
| Ctrl+Shift+PgUp / PgDown | 向左/向右移动编辑器 Move editor left/right |
| Ctrl+K ← / → | 移动活动编辑器组 Move active editor group |
| 按 Press | 功能 Function |
|---|---|
| Ctrl+N | 新文件 New File |
| Ctrl+O | 打开文件… Open File… |
| Ctrl+S | 保存 Save |
| Ctrl+Shift+S | 另存为… Save As… |
| Ctrl+K S | 全部保存 Save All |
| Ctrl+F4 | 关闭 Close |
| Ctrl+K Ctrl+W | 关闭所有 Close All |
| Ctrl+Shift+T | 重新打开关闭的编辑器 Reopen closed editor |
| Ctrl+K | 输入保持打开 Enter Keep Open |
| Ctrl+Tab | 打开下一个 Open next |
| Ctrl+Shift+Tab | 打开上一个 Open previous |
| Ctrl+K P | 复制活动文件的路径 Copy path of active file |
| Ctrl+K R | 显示资源管理器中的活动文件 Reveal active file in Explorer |
| Ctrl+K O | 显示新窗口/实例中的活动文件 Show active file in new window/instance |
| 按 Press | 功能 Function |
|---|---|
| F11 | 切换全屏 Toggle full screen |
| Shift+Alt+1 | 切换编辑器布局 Toggle editor layout |
| Ctrl+ = / - | 放大/缩小 Zoom in/out |
| Ctrl+B | 切换侧栏可见性 Toggle Sidebar visibility |
| Ctrl+Shift+E | 显示浏览器/切换焦点 Show Explorer / Toggle focus |
| Ctrl+Shift+F | 显示搜索 Show Search |
| Ctrl+Shift+G | 显示Git Show Git |
| Ctrl+Shift+D | 显示调试 Show Debug |
| Ctrl+Shift+X | 显示扩展 Show Extensions |
| Ctrl+Shift+H | 替换文件 Replace in files |
| Ctrl+Shift+J | 切换搜索详细信息 Toggle Search details |
| Ctrl+Shift+C | 打开新命令提示符/终端 Open new command prompt/terminal |
| Ctrl+Shift+U | 显示输出面板 Show Output panel |
| Ctrl+Shift+V | 切换Markdown预览 Toggle Markdown preview |
| Ctrl+K V | 从旁边打开Markdown预览 Open Markdown preview to the side |
| 按 Press | 功能 Function |
|---|---|
| F9 | 切换断点 Toggle breakpoint |
| F5 | 开始/继续 Start/Continue |
| Shift+F5 | 停止 Stop |
| F11 / Shift+F11 | 下一步/上一步 Step into/out |
| F10 | 跳过 Step over |
| Ctrl+K Ctrl+I | 显示悬停 Show hover |
| 按 Press | 功能 Function |
|---|---|
| Ctrl+` | 显示集成终端 Show integrated terminal |
| Ctrl+Shift+` | 创建新终端 Create new terminal |
| Ctrl+Shift+C | 复制选定 Copy selection |
| Ctrl+Shift+V | 粘贴到活动端子 Paste into active terminal |
| Ctrl+↑ / ↓ | 向上/向下滚动 Scroll up/down |
| Shift+PgUp / PgDown | 向上/向下滚动页面 Scroll page up/down |
| Ctrl+Home / End | 滚动到顶部/底部 Scroll to top/bottom |
[TOC]
浏览器内建对象,用于在后台与服务器通信(交换数据) ,由此我们便可实现对网页的部分更新,而不是刷新整个页面。
1 | // 1、创建XMLHttpRequest对象 |
步骤:
1.0 创建对象
1 | var xhr = new XMLHttpRequest(); |
2.0 设置参数
1 | //get 请求 |
3.0 设置回调函数
1 | xhr.onreadystatechange = function(){} |
4.0 发送请求
1 | xhr.send(null); |
post方式时,可以在send后面带参数
参数形式:key1=value1&key2=value2;
如果要后台接收到,还必须加上:
1 | //post请求时如果要传递参数需要带上 |
5.0 判断响应
即 JavaScript Object Notation,另一种轻量级的文本数据交换格式,独立于语言。
它是javascript对象的一种字符串的表现形式
1 | //表示对象 |
JSON数据在不同语言进行传输时,类型为字符串,不同的语言各自也都对应有解析方法,需要解析完成后才能读取
Javascript 解析方法
eval()
如果转换JSON数组的字符串可以直接转换
1 | var a = "[1,2,3,4,5]"; |
如果将JSON对象的字符串转为对象,注意,需要将对象首尾加上“()”,才能转换成功,否则eval会将大括号识别为JavaScript代码块的开始和结束标记
1 | var json='{"name":"CJ","age":18}'; |
eval可以解析并执行js代码:
1 | eval('alert("abc");'); |
JSON对象
PHP解析方法
总结:JSON体积小、解析方便且高效,在实际开发成为首选。
1 | function ajax(url,type,param,dataType,callback){ |
1 | function hello(data){ |
其本质是利用了标签具有可跨域的特性,由服务端返回一个预先定义好的Javascript函数的调用,并且将服务器数据以该函数参数的形式传递过来,此方法需要前后端配合完成。
文件后缀并不能代表什么,关建我们要看服务器返回的内容,比如css.php
这时返回的内容为 echo ‘body {background:color}’我们可以通过content-type:text/css来指定浏览器该如何解析,返回的内容
1 |
|
同样我们也可以js文件以.php结尾,比如js.php 这时我们可以指定Content-Type: text/javascript可告知浏览器要以javascript来执行我们返回的内容,如果返回的是一个javascript的一个函数调用,那么在这个函数调用过程中可以将跨域请求来的数据以“实参”的传递过来,并且这个实参一般是JSON格式的
1 |
|
结合html标签src具有跨域访问的特性和Content-Type指定文档类型两个方面,可以实现跨域的数据访问。
1 |
|
JSONP其本质就是服务端返回了一个Javascript的一个函数调用,而这个函数已经提前被定义了。
###favicon图标介绍:
收藏夹图标就是出现在浏览器地址栏左侧的那个小图标。收藏夹图标,也作网站头像。当然,这不仅仅是收藏夹图标的全部,根据浏览器的不同,收藏夹图标显示也有所区别:在大多数主流浏览器如FireFox和Internet Explorer (5.5及以上版本)中,收藏夹图标不仅在收藏夹中显示,还会同时出现在地址栏上,这时用户可以拖曳收藏夹图标到桌面以建立到网站的快捷方式;除此之外,标签式浏览器甚至还有不少扩展的功能,如FireFox甚至支持动画格式的收藏夹图标等
###favicon查看方法
已知网站的地址的时候,一般favicon都是放在网站的根目录,所以直接在网站的根目录下输入 网址/favicon.ico 即可查看该网站的favicon图标,如下图:
###网站 favicon icon制作方法
关于网站icon图标制作,个人比较喜欢在线的favicon icon图标制作网站—-比特虫,使用方法里面写的很详细,如下图:
###favicon icon图标使用方法
当成功生成favicon.ico图像文件后,浏览器会自动弹出一个zip的压缩文件将压缩文件中的favicon.ico图像放在根目录下(也可以是其他目录)
在页面源文件的
1 |
|
fopen: 打开文件或者 URL
1 | resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] ) |
fclose: 关闭一个已打开的文件指针
1 | bool fclose ( resource $handle ) |
fread: 读取文件(可安全用于二进制文件)
1 | string fread ( resource $handle , int $length ) |
fwrite: 写入文件(可安全用于二进制文件)
1 | int fwrite ( resource $handle , string $string [, int $length ] ) |
file: 把整个文件读入一个数组中
1 | array file ( string $filename [, int $flags = 0 [, resource $context ]] ) |
file_get_contents: 将整个文件读入一个字符串
1 | string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] ) |
file_put_contents: 将一个字符串写入文件
1 | int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) |
global 关键字
PHP中全局变量,不能直接在函数中使用;
使用global关键字,来实现:将全局变量引入到函数中来用。
global在声明为全局变量,不能直接赋值,需要在下一行来赋值;
global关键字只能在函数内部来使用。
global关键字与JS中的全局变量的功能不一样,可以理解为”引用传值地址”
1 |
|
超全局数组变量:\$_GET、\$_POST、\$_SERVER、\$_REQUEST、\$_FILES、$_COOKIE、\$_SESSION、\$GLOBALS
超全局数组变量,可以在网页的任何地方都能使用
1 | header("content-type:text/html;charset=utf-8"); |
1 |
|
1 | $p = new P(); |
1 | $p->id = 12; |
1 | echo $p->age; |
报文
请求报文
请求报文头
1 | GET http://www.a.com/ HTTP/1.1 |
请求报文行
1 | Host: www.a.com |
固定换行
请求报文体
响应报文
响应报文头
1 | HTTP/1.1 200 OK |
响应报文行
1 | Date: Mon, 18 Sep 2017 20:34:21 GMT |
固定换行
响应报文体
1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> |
报文查看工具:fiddler
get
特点:
方式:
PHP中的接收方式:
1 | $name = $_GET['name']; |
post
特点:
方式:
PHP中的接收方式
1 | $name = $_POST['name']; |
$_REQUEST:
1 | $name = $_REQUEST['name']; |
详细说明:http://www.w3school.com.cn/jsref/jsref_splice.asp
这种方式很有意思,其它语言如Java,其数组的length是只读的,不能被赋值。如
Java中会报错,编译通不过。而JS中则可以,且将数组清空了,
目前 Prototype中数组的 clear 和mootools库中数组的 empty 使用这种方式清空数组。
这里其实并不能说是严格意义的清空数组,只是将ary重新赋值为空数组,之前的数组如果没有引用在指向它将等待垃圾回收。
Ext库Ext.CompositeElementLite类的 clear 使用这种方式清空。
方式2 保留了数组其它属性,方式3 则未保留。很多人认为方式2的效率很高些,因为仅仅是给length重新赋值了,而方式3则重新建立个对象。经 测试 恰恰是方式3的效率高。测试代码:
测试结果:

以上结果可看到:方式3更快,效率更高。因此如果不保留原数组的其它属性Ext采用的方式更值得推荐。
原文:http://www.cnblogs.com/snandy/archive/2011/04/04/2005156.html
]]>
所有PHP代码都放在标记: <?php …… ?>
PHP输出方式:echo
1 | echo 'hello world' |
注释
语句分隔符 “;”
PHP文件访问方式
1 | echo date('Y-m-d H:i:s'); |
默认情况下PHP输出的时间是格林威治时间,比中国时区晚8个小时
解决方案:
1.0 找到PHP的配置文件 php.ini
2.0 定位到 date.timezone
3.0 设置中国时区
1 | ; PRC为中华人民共和国 |
变量的数据类型由其中的内容决定
直接以 “$+变量名”的方式 取得可以取得变量的值
1 | $userName = "admin"; |
可以使用“.”来连接将变量与字符串一起输出
1 | echo "我的名字叫".$userName |
也可以在字符串的内部直接使用变量
1 | echo "我的名字叫做$userName" |
header():设置服务器返回到浏览器的数据的类型
1 | header('content-type:text/html;charset=utf-8'); |
isset() 判断变量是否存在
empty() 判断变量是否为空
var 是非空或非零的值,则 empty() 返回 FALSEunset() 删除变量
可以通过这个函数删除一个已经存在的变量,删除之后变量为null
可以同步删除多个变量
如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。(这个当我们学了全局变量与局部变量以后再说)
1 | unset($a,$b,$c) |
var_dump() 显示变量的类型和值
print_r() 显示数组的元素信息
指一个变量的名称,由另一个变量的值来充当
1 | $a = "b"; |
如果使用可变变量,一定要加上给可变变量的变量名加上{}作为定界符
JS中的基本数据类型(只有一个值):字符串型、数值型、布尔型、undefined、null
JS中的复合数据类型(多个值):数组(Array)、对象(Object)、函数(Function)
值传递:
引用传递
在PHP中可以使用 & 符号将值传递的变量改变为引用传递:如
1 | $a = "abc"; |
语法: bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
案子:通过define关键来定义
1 | define('TITLE',"中华人民共和国");//定义常量TITLE |
判断是否是常量:defined()
语法: bool defined ( string $name )
defined()可以判断常量
1 | defined(“TITLE”);//通过defined判断常量时,常量一定要加上引号 |
数据类型分类
1 | js中的数据类型: |
数据类型判断
is_bool(),判断变量是不是布尔型
is_int(),判断变量是不是整型
is_string() 判断变量是不是字符串型
is_float() 判断变量是不是浮点型
is_numeric() 判断变量不是数值型或数字字符串。
is_array() 判断变量是不是数组
is_null() 判断变量是否为NULL
is_resource() 判断变量是不是资源型
1 | //判断用户是否大于18岁,如果大于18岁,显示网页内容,如果没有,则不显示 |
在js中所有的数字都用number来表示,但是在PHP,数字有不同的划分,其中整数(正整数,0,负整数)用整型来表示
整型包含正整数、负整数、零0
可以用10进制、八进制、16进制表示
1 | echo 100;//十进制 |
PHP中最大整数:PHP_INT_MAX,(2^31)-1
如果数字超出来了整数据范围,则类型会变为float
PHP中除了整数还有浮点型,一般浮点数会包含小数,比整型更加精确
浮点型的范围:1.8E-308~1.8E+308
注意点:
如果要对浮点数进行操作,就好先将浮点数转为整数再处理
1 | //以下做法不可取 |
字符串定义的四种方式
用单引号可以定义一个字符串;如:$a = ‘abc’;
用双引号来定义一个字符串;如:$a = “abc”;
定义长字符串:heredoc
1 |
|
定义长字符串:nowdoc
1 |
|
概念
强制转换
通过关键字进行转换
1 | (bool)$a//强制转换为bool |
进制转换
算数运算符+、-、*、/、%、++、–
赋值运算符=、+=、-=、*=、/=、%=
字符串运算符. 和 .=
案例:隔行变色
1 |
|
比较运算符>、<、>=、<=、\=\=、!=、\=\=\=、!==
案例:字符串比较
ASCII码表:如果两个字符进行比较,比较的本质是它们对应的ASCII码
1 | echo ("a" > 120); |
逻辑运算符&&、||、!
实例:闰年判断
1 | //条件: |
运算符优先级
三元运算符
案例:比较两个数的大小
1 | $a = 123; |
错误控制运算符(@)
作用:主要用来屏蔽表达式的错误:
可以用在变量、常量、函数调用之前,但是不能用在函数定义、类定义之前。
1 | $a = 100; |
顺序结构
赋值语句
1 | $a = 123; |
分支结构
循环结构
使用 array() 函数来创建数组
创建枚举数组:
下标是从0 开始的正整数
1 | $arr = array($value1,$value2,$value3,....); |
创建关联数组
$key是重新给数组元素指定一个下标
下标和元素的值之间连接号是”=>”,又称”重载元素下标”
1 | $arr = array([$key=>]$value,[$key=>]$value,[$key=>]$value,....) |
创建混合数组
有字符串下标的元素,就没有整型下标
如果$key省略了,就用默认下标
下标只能是整型以及字符串
如果元素没有指定下标,会在最大整数下标的基础上加1.
1 | $arr[] = $value |
创建混合数组:
由语法1,2混合创建数组
1 | $arr[] = 12; |
多维数组,即数组中的元素又是一个数组
1 | $arr = array( |
1 | for($i = 0; $i < count($arr); $i++) { |
1 | $arr = array(1,2,3,4); |
1 | /* |
1 | function showSelf($name,$age=19,$gender="男") { |
func_get_args( void ):返回一个参数列表的枚举数组,参数数组的下标是从0开始的整数
func_get_arg( $index ):返回参数数组中,指定下标的参数的值;
func_num_args( void ):返回实参的个数。
1 | function getSum() { |
大概的意思就是:你所上传的文件大小超过了POST的最大限制大小(8M),
以下是有道翻译的结果警告:POST content -
length为2110919154字节,超过了第0行未知的8388608字节的限制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
####**这是demo的代码**
```js
<?php
if(!empty($_FILES)){
$file = $_FILES["img-file"];
move_uploaded_file($file["tmp_name"],"./res/".$file["name"]);//将文件流从临时存储的位置移到指定的路径
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="./file_upload.php" method="post" enctype="multipart/form-data" >
<input type="file" name="img-file" id=""><br>
<input type="submit" value="上传">
</form>
</body>
</html>
###以上代码就是实现一个简单的上传功能,图片如下:
###解决方法:
文件上传的其他注意事项
console.time方法是开始计算时间,console.timeEnd是停止计时,输出脚本执行的时间,代码如下
1 | // 启动计时器 |
输出结果如下图:
这两个方法中都可以传人一个参数,作为计时器的名称,它的作用是在代码并行运行时分清楚各个计时器。对console.timeEnd的调用会立即输出执行总共消耗的时间,单位是毫秒。
由于,js脚本是自上而下执行解析的,所以可以通过+new Date()或new
Date().getTime()来计算中间代码的执行时间,还是上代码来的直接:
代码执行结果如下图:
或直接将其封装为函数如下:
运行结果为同上
测试JavaScript性能的方法有很多,但console.time/timeEnd两个方法是最基本、最直接的技巧。
1 | setcookie(name[, value, expire, path, domain]); |
expires 有效期
临时COOKIE(缓存cookie)
1 | setcookie("uName","admin"); |
硬盘COOKIE
1 | //一小时过期 |
path有效 路径
1 | //只有在upload文件夹下才能被访问到 |
domain 域名
1 | //只有在a.com以及它下面的子域名中才能被访问 |
设置有效时间为过去时间
1 | setcookie("uName","admin",time()-1); |
将cookie中的值设置为false或者空字符串
1 | setcookie("uName",false); |
不设置值
1 | setcookie("uName"); |
在浏览器中清除缓存
1 | // 设置cookie |
1 | // 设置cookie |
1 | session_start(); |
1 | session_start(); |
1 | session_start(); |
1 | session_start(); |
1 | session_destroy(); |
| 区别 | cookie | session |
|---|---|---|
| 存储位置 | 浏览器 | 服务器 |
| 浏览器携带的数据量 | 多 | 少(只携带session-id) |
| 存储的数据类型 | 只能是字符串 | 任意类型 |
| 安全性 | 较低 | 较高 |
| 默认的有效路径 | 当前路径及其子路径 | 整站有效 |
| 数据的传输量 | 有限制4K,不能超过20个 | 无限制 |
1 | session.gc_maxlifetime = 1440 |
只要标签有id这个属性,不使用getElementById方法,也可以直接用id获取dom元素。
###解惑
经过一波搜索及查资料,原因大概是:如果dom元素的id名称不和js内置属性或全局变量重名的话,该名称自动成为window对象的属性,所以可以直接用来操作dom。看网上的说法是,这个是IE首先支持,火狐谷歌后面才支持的。不过现在还未形成标准,为了保险,还是不用的好。不过看各大浏览器都支持,觉得也许以后这个有可能直接成标准也说不定哈,到时候又可以省几个代码0.
在各大浏览器中的测试结果如下:
chorme浏览器中
-firefox浏览器中
i5ting_toc a node npm wrapper of i5ting_ztree_toc https://github.com/i5ting/i5ting_ztree_toc
##全局安装
1 | npm install -g i5ting_toc |
##使用方法
全局安装完毕之后,直接在此处打开命令行,切换到你想要转换的md文件根目录下,使用以下命令,这个版本的命令比较简单,只有一个-f参数,如果没有填写,默认使用README.md1
i5ting_toc -f sample.md -o
常见的命令参数如下:
-h, –help output usage information
-V, –version output the version number
-f, –file [filename] default is README.md
-o, –open open in browser
-v, –verbose 打印详细日志
运行成功之后则在当前目录下生成一个preview文件夹,里面就是我们想要的东东了
注意: 如果md文件包含有图片资源的话,需要将图片资源的路径手动 copy进toc文件夹内
自执行函数或是自调用函数 声明完了,马上进行调用,只能使用一次,,有两种写法,举个栗子如下:
写法一:
1 | <script> |
写法二:
1 | <script> |
- 复杂数据类型:对象类型
- 简单(基本)数据类型:number string boolean null undefined
####数据类型转换分类
####一.其他数据类型转number类型
1.0 . 隐式转换:只要是参与数学运算都会进行一个隐式类型转换 + - * / %1.1. null对应number类型中的0,1.2. NaN 是属于number类型,表示数字的一种不正常状态,也就是说本来应该进行数学运算的值没有转换成number, js中特别的安排了一个这么一个NaN的值,有了这个值程序就不报错了1.3、NaN是属于number类型的一个值,代表数字的一种不正常状态,是非常特殊的,特殊到和任何值都不相等,即使自己也不相等,所以任何与NaN的数学运算,最最终的结果都是NaN
特点:
a.如果转换的内容可以转成数字,那么就直接返回这个内容对应的数字。b.如果不可以转换那么返回NaN.c.如果在内容中出现小数,那么小数会保留。d.如果内容为空,那么转换成0;
1 | 如: |
ParseInt()
特点:
a.如果转换的内容可以转成数字,那么就直接返回这个内容对应的数字。
b.如果不可以转换那么返回NaN.
c.如果带有小数,那么会去掉小数,而不是四舍五入。
d.如果第一个字符是数字,则继续解析直至字符串解析完毕或者遇到一个非数字符号为止.
1 | 例子: |
ParseFloat()
1 | 例子: |
####二.其他类型转换为String类型
隐式转换:当两个操作数做”+”运算时,如果表达式中任意一边有字符串,”+”,为字符串连接符
1
2
3
4
5例子:
var n = 200;
n = n + "";
console.log(n);//"200"
console.log(typeof n);//string
显式(强制)转换: toString( ) 和 String()
1.toString() : 除了null undefined这两个类型不能调用 .toString() ,其他任何数据都可以调用.toString();
2.String() : 任何数据都可以调用此函数;
1
2
3
4
5
6例子:
var a = undefined;
a = String(a);
console.log(a);//"undefined"
console.log(typeof a);//string
####三.其他类型转换为Boolean类型:
其它数据类型转换为boolean类型值为false只有这几种情况:0 NaN “” null undefined false
隐式转换: 在数据类型之前加“!!”即可
1 | 例子: |
显式转换:调用Boolean():
1 | 例子 |
**如若有错,请多多指教,谢谢广大网友**]]>###事件绑定
要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数。所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称。
在JavaScript中,有三种常用的绑定事件的方法:
在DOM元素中直接绑定;
我们可以在DOM元素上绑定onclick、onmouseover、onmouseout、onmousedown、onmouseup、ondblclick、onkeydown、onkeypress、onkeyup等。好多不一一列出了。如果想知道更多事件类型请查看,DOM事件。
1 | <input type="button" value="click me" onclick="hello()"> |
在JavaScript代码中(即script标签内)绑定事件可以使JavaScript代码与HTML标签分离,文档结构清晰,便于管理和开发。
1 | <input type="button" value="click me" id="btn"> |
绑定事件的另一种方法是用 addEventListener() 或 attachEvent() 来绑定事件监听函数。下面详细介绍,事件监听。
关于事件监听,W3C规范中定义了3个事件阶段,依次是捕获阶段、目标阶段、冒泡阶段。
起初Netscape制定了JavaScript的一套事件驱动机制(即事件捕获)。随即IE也推出了自己的一套事件驱动机制(即事件冒泡)。最后W3C规范了两种事件机制,分为捕获阶段、目标阶段、冒泡阶段。IE8以前IE一直坚持自己的事件机制(前端人员一直头痛的兼容性问题),IE9以后IE也支持了W3C规范。
语法:
1 | element.addEventListener(event, function, useCapture) |
event : (必需)事件名,支持所有DOM事件。
function:(必需)指定要事件触发时执行的函数。
useCapture:(可选)指定事件是否在捕获或冒泡阶段执行。true,捕获。false,冒泡。默认false。
注:IE8以下不支持。
1 | <input type="button" value="click me" id="btn1"> |
语法:
1 | element.attachEvent(event, function) |
event:(必需)事件类型。需加“on“,例如:onclick。
function:(必需)指定要事件触发时执行的函数。
1 | <input type="button" value="click me" id="btn2"> |
1、可以绑定多个事件。
1 | <input type="button" value="click me" id="btn3"> |
常规的事件绑定只执行最后绑定的事件。
1 | <input type="button" value="click me" id="btn4"> |
两个事件都执行了。
2、可以解除相应的绑定
1 | <input type="button" value="click me" id="btn5"> |
1 | <input type="button" value="click me" id="btn5"> |
事件委托就是利用冒泡的原理,把事件加到父元素或祖先元素上,触发执行效果。
1 | <input type="button" value="click me" id="btn6"> |
上面只是个例子,代码尽可能的简化了。在实际的代码中 我们可能用到jQuery的live()、delegate()、bind()、on()等。
1、提高JavaScript性能。事件委托可以显著的提高事件的处理速度,减少内存的占用。实例分析JavaScript中的事件委托和事件绑定,这篇文章写得还不错。
传统写法
1 | <ul id="list"> |
事件委托
1 | <ul id="list"> |
2、动态的添加DOM元素,不需要因为元素的改动而修改事件绑定。
传统写法
1 | <ul id="list"> |
点击item1到item3都有事件响应,但是点击item4时,没有事件响应。说明传统的事件绑定无法对动态添加的元素而动态的添加事件。
事件委托
1 | <ul id="list"> |
当点击item4时,item4有事件响应。说明事件委托可以为新添加的DOM元素动态的添加事件。
]]>本文标题:事件绑定、事件监听、事件委托
文章作者:Tsrot
发布时间:2016年08月12日 - 13时37分
最后更新:2017年10月01日 - 15时04分
原始链接:http://blog.xieliqun.com/2016/08/12/event-delegate/
许可协议: “署名-非商用-相同方式共享 3.0” 转载请保留原文链接及作者。
代码如下:
效果如下:
解决问题:
原因:由于换行字符会被浏览器解析成一个空格符,所以就会产生一个间隙
解决方法:
方法1:将行内或行内块元素写在一行,不过不建议这么写,这样编排不够简洁优雅。
方法2:给父元素设置font-size:0;因为空格符也是字符,设置font-size:0 即可消除空隙。
方法3:可以通过margin来调整位置
方法4:将img设为块元素,即display为block
]]>