关于html的一些东西

块级元素和行级元素的区别

块级元素:垂直方向上排列,独占一行,可以包含行内元素和块级元素,设置width,height,line-height,margin,padding有效
行级元素:水平方向上排列,都是同一行,不能包含块级元素,设置width,height,margin,padding无效,但设置line-height有效
现在行级元素和块级元素能够通过display属性互相转换
(现在元素代表的含义与显示无关,元素的包含关系由元素的内容类别决定)

为什么引入css要用href,而引入js要用src

src和href的区别:
src:本质上是引用嵌入式内容,如img,video,iframe这些替换类型的元素,相当于引入的内容像嵌入页面一样,可以直接展示,直观看到
href:本质上是引入超链接,如a,link这些连接型元素。引入的内容是外部资源,与本页面的关系不大,不会直接展示

至于为什么要css要用href,js要用src,可能是历史遗留的问题吧

引入js的script标签,既可以作为替换型标签,又可以不作为替换型标签
引入CSS,可以用style和link标签,而style也不是替换型元素,而我们用link去引入css,就自然是用href啊

HTML5

HTML5和HTML4的区别:

1. 简化的语法
2. canvas替代了flash
3. 新增的语义化标签
4. 新增的表单控件,媒体元素
5. 不再使用frame,center,big,b,font等标签
6. 一些本地离线存储和一些新技术
7. 一些文件操作的API

判断浏览器能否使用HTML5

看window.applicationCache是否存在

新增的语义化标签

header,nav,footer,section,article,aside,figure,main

语义化的理解:
用正确的标签来做正确的事情,语义化标签会让页面的内容结构更加简单易懂,便于搜索引擎解析,便于阅读维护和理解

新增的表单控件和媒体元素

表单控件:calander,date,time,email,url,search,...
表单属性:required,placeholder,autocomplete,autofocus,一些重写属性(formaction,formenctype,...),list,min,max,multiple,pattern,...
媒体元素:video,audio,source,track,embed

新增的绘图标签

canvas(主要写JS功能)和SVG

文件操作的API

FileList:file文件对象的集合
Blob对象:原始数据对象,它提供了slice方法可以读取原始数据中的某块数据
File对象:继承自Blob对象,指向一个具体文件
FileReader对象:设计用来读取文件里面的数据,提供三个常用的读取文件数据的方法,另外读取文件数据使用了异步的方式,非常高效

本地存储(WebStorage)

本地离线存储,把需要离线存储在本地的文件列在一个 manifest 配置文件

分为两种:localStorage和sessionStorage

localStorage和sessionStorage的异同:
异:
1. localStorage能长期存储数据,关闭浏览器后数据不会丢失
   sessionStorage不能长期存储数据(是会话级别的),关闭浏览器后数据会自动删除(刷新页面或进入同源另一页面,数据仍然存在)
同:
1. 都在客户端中保存,不参与和服务器通信
2. 都只能存储字符串
3. 存储大小为5M(各浏览器不一样)
4. 一些存储,获取,删除数据等的方法相同

新技术:WebWorker

WebWorker作用:为JavaScript创建多线程环境,允许主线程创建Worker线程,将一些任务分配给worker线程运行
              在主线程运行的同时,Worker线程在后台运行,他们之间互不干扰
              等到Worker线程完成计算任务,再把结果通过postMessage返回给主线程
好处:对于一些计算密集型或高延迟的任务,被Worker线程负担下来了,主线程就会很流畅,不会被阻塞或被拖慢了


由于Worker线程一旦创建成功,就会始终运行,不会被主线程上的活动给打断。这样有利于随时响应主线程的通信
不过这也导致Worker线程比较浪费资源,不应该过度使用,使用完毕后应该关闭掉


WebWorker的注意点:
1. 同源限制:分配给Worker线程运行的脚本文件,必须与主线程运行的脚本文件同源

2. DOM限制:Worker线程所在的全局对象与主线程不一样,无法获取到主线程所在网页的DOM结构(Worker无法使用document,window,parent对象,但可以用navigator(包含了浏览器信息),location对象)

3. 通信限制:Worker线程和主线程不在同一个上下文环境,他们不能直接通信,必须通过信息完成(此数据通信是拷贝关系,只传值而不传址)
  (通信的内部机制:先将通信内容串行化,然后把串行化后的字符串发给Worker,然后Worker再将它还原)

4. 脚本限制:Worker线程不能执行alert()和confirm()方法,但可以使用XMLHttpRequest对象发出Ajax请求

5. 文件限制:Worker线程无法读取本地文件,他所加载的脚本必须来自网络


主线程对worker线程的一些方法:
1. 主线程创建Worker线程:
在主线程中用new调用Worker的构造函数:var worker=new Worker('work.js');  //此脚本文件必须来自网络

2. 主线程向Worker发送信息:(可以是各种数据类型)
worker.postMessage('xxxx') 

3. 主线程接收Worker发回来的信息:
worker.onmessage=()=>{...}

4. 主线程关闭Worker线程:
worker.terminate()

更多关于WebWorker的用法:http://www.ruanyifeng.com/blog/2018/07/web-worker.html

新技术:WebSocket

WebSocket:
是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信


我们有了HTTP协议了,为什么还要用到WebSocket呢?
因为HTTP协议中,通信只能由客户端发起(服务器不能够主动向客户端推送信息)
对于若服务器有连续的状态变化,客户端要获取信息就会很麻烦,只能使用轮询去了解有没有新的信息


WebSocket的特点:
1. 客户端和服务器只需要完成一次握手,它们之间就直接可以创建持久性的连接
2. 客户端和服务器双向数据传输(平等对话),能实现真正意义上的推送功能
3. 建立在TCP协议之上,服务器的实现比较容易
4. 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器
5. 数据格式比较轻量,性能开销小,通信高效
6. 可以发送文本,也可以发送数据
7. 没有同源限制,客户端可以和任意的服务器通信
8. 协议标识符是ws(若加密则为wss)
9. 异步


客户端的实现:
1. 创建一个socket对象:new WebSocket(url)   //url格式:ws://ip地址:端口号/资源名称
2. 一些事件:
   1) .onopen:连接建立时触发
   2) .onmessage:客户端接收服务器数据时触发
   3) .error:通信时发生错误触发
   4) .close:连接关闭时触发
3. 一些方法:
   send():使用连接发送数据

服务器的实现:
利用Node搭建服务器与socket配合使用

常用Node配合socket.io (服务器与客户端进行配合交互)
(socket.io官网:https://socket.io/)

更多关于WebSocket的用法:http://www.ruanyifeng.com/blog/2017/05/websocket.html

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!