前端笔记

50次阅读

共计 8614 个字符,预计需要花费 22 分钟才能阅读完成。

一、盒子模型

参考:https://segmentfault.com/a/11…

二、HTML4 和 5 的区别

1、语法简化

HTML、XHTML 的 DOCTYPE、html、meta、script 等标签,在 HTML5 中有大幅度的简化。

2、统一网页内嵌多媒体语法

以前,在网页中播放多媒体时,需要使用 ActiveX 或 Plug-in 的方式来完成。有了 HTML5 之后,使用 <video> 或 <audio> 标签播放视频和音频,不需要在安装其他的什么来播放了。

3、新增了语义标签

为了增加网页的可读性,HTML5 增加了 <header>、<footer>、<section>、<article>、<nav>、<hgroup>、<aside>、<figure> 语义标签。

4、HTML5 废除了一些旧标签

废除的大部分是网页美化方面的标签,例如:<big>、<u>、<font>、<basefont>、<center>、<s>、<tt>。对 <frame> 框架,不能使用。

5、全新的表单设计

表单是网页设计者最常用的功能,HTML5 对表单做了很大的更改,不但新增了几项新的标签,对原来的 <form> 标签也增加了许多属性。

6、新增了 <canvas> 标签,可以绘制图形

HTML5 新增了具有绘图功能的 <canvas>

扩展资料

HTML5 新特征

1、表单是实现用户与页面后台交互主要组成部分,HTML5 在表单的设计上功能更加强大。input 类型和属性的多样性大大地增强了 HTML 可表达的表单形式,再加上新增加的一些表单标签,使得原本需要 JavaScript 来实现的控件,可以直接使用 HTML5 的表单来实现。

2、HTML5 较之传统的数据存储有自已的存储方式,允许在客户端实现较大规模的数据存储。为了满足不同的需求,HTML5 支持 DOM Storage 和 Web SQL Database 两种存储机制。

其中,DOM Storage 适用于具有 key/value 对的基本本地存储;而 WebSQLDatabase 是适用于关系型数据库的存储方式,开发者可以使用 SQL 语法对这些数据进行查询、插入等操作。

3、HTML5 最大特色之一就是支持音频视频,在通过增加了 <audio>、<video> 两个标签来实现对多媒体中的音频、视频使用的支持,只要在 Web 网页中嵌入这两个标签,而无需第三方插件(如 Flash)就可以实现音视频的播放功能。

HTML5 对音频、视频文件的支持使得浏览器摆脱了对插件的依赖,加快了页面的加载速度,扩展了互联网多媒体技术的发展空间。

三、本地存储方式

相同:在本地(浏览器端)存储数据
不同:

  • localStorage 只要在相同的协议、相同的主机名、相同的端口下,就能读取 / 修改到同一份 localStorage 数据。sessionStorage 比 localStorage 更严苛一点,除了协议、主机名、端口外,还要求在同一窗口(也就是浏览器的标签页)下。
  • localStorage 是永久存储,除非手动删除。
  • sessionStorage 当会话结束(当前页面关闭的时候,自动销毁)
  • cookie 的数据会在每一次发送 http 请求的时候,同时发送给服务器而 localStorage、sessionStorage 不会。

了解更多

四、跨域

前端通信类的问题,主要包括以下内容:

1、什么是同源策略及限制
同源策略是一个概念,就一句话。有什么限制,就三句话。能说出来即可。

2、前后端如何通信
如果你不准备,估计也就只能说出 ajax。这个可以考察出知识面。

3、如何创建 Ajax
Ajax 在前后端通信中经常用到。做业务时,可以借助第三方的库,比如 vue 框架里的库、jQuery 也有封装好的方法。但如果让你用原生的 js 去实现,该怎么做?

这就是考察你的动手能力,以及框架原理的掌握。如果能写出来,可以体现出你的基本功。是加分项。

4、跨域通信的几种方式
这部分非常重要。无非就是问你:什么是跨域、跨域有什么限制、跨域有几种方式。

下面分别讲解。

同源策略的概念和具体限制
同源策略:限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。(来自 MDN 官方的解释)

具体解释:

(1)源包括三个部分:协议、域名、端口(http 协议的默认端口是 80)。如果有任何一个部分不同,则源不同,那就是跨域了。

(2)限制:这个源的文档没有权利去操作另一个源的文档。这个限制体现在:(要记住)

Cookie、LocalStorage 和 IndexDB 无法获取。

无法获取和操作 DOM。

不能发送 Ajax 请求。我们要注意,Ajax 只适合同源的通信。

前后端如何通信
主要有以下几种方式:

Ajax:不支持跨域。

WebSocket:不受同源策略的限制,支持跨域。

CORS:不受同源策略的限制,支持跨域。一种新的通信协议标准。可以理解成是:同时支持同源和跨域的 Ajax。

如何创建 Ajax
关于 Ajax 请求,可以看本人的基础文章:Ajax 入门和发送 http 请求

在回答 Ajax 的问题时,要回答以下几个方面:

1、XMLHttpRequest 的工作原理

2、兼容性处理

XMLHttpRequest 只有在高级浏览器中才支持。在回答问题时,这个兼容性问题不要忽略。

3、事件的触发条件

4、事件的触发顺序

XMLHttpRequest 有很多触发事件,每个事件是怎么触发的。

发送 Ajax 请求的五个步骤(XMLHttpRequest 的工作原理)
(1)创建 XMLHttpRequest 对象。

(2)使用 open 方法设置请求的参数。open(method, url, 是否异步)。

(3)发送请求。

(4)注册事件。注册 onreadystatechange 事件,状态改变时就会调用。

如果要在数据完整请求回来的时候才调用,我们需要手动写一些判断的逻辑。

(5)获取返回的数据,更新 UI。

发送 get 请求和 post 请求
get 请求举例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<h1>Ajax 发送 get 请求 </h1>
<input type="button" value="发送 get_ajax 请求" id='btnAjax'>

<script type="text/javascript">
    // 绑定点击事件
    document.querySelector('#btnAjax').onclick = function () {
        // 发送 ajax 请求 需要 五步

        //(1)创建异步对象
        var ajaxObj = new XMLHttpRequest();

        //(2)设置请求的参数。包括:请求的方法、请求的 url。ajaxObj.open('get', '02-ajax.php');

        //(3)发送请求
        ajaxObj.send();

        //(4)注册事件。onreadystatechange 事件,状态改变时就会调用。// 如果要在数据完整请求回来的时候才调用,我们需要手动写一些判断的逻辑。ajaxObj.onreadystatechange = function () {
            // 为了保证 数据 完整返回,我们一般会判断 两个值
            if (ajaxObj.readyState == 4 && ajaxObj.status == 200) {
                // 如果能够进到这个判断 说明 数据 完美的回来了, 并且请求的页面是存在的
                // 5. 在注册的事件中 获取 返回的 内容 并修改页面的显示
                console.log('数据返回成功');

                // 数据是保存在 异步对象的 属性中
                console.log(ajaxObj.responseText);

                // 修改页面的显示
                document.querySelector('h1').innerHTML = ajaxObj.responseText;
            }
        }
    }
</script>
</body>
</html>

post 请求举例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<h1>Ajax 发送 get 请求 </h1>
<input type="button" value="发送 put_ajax 请求" id='btnAjax'>
<script type="text/javascript">

    // 异步对象
    var xhr = new XMLHttpRequest();

    // 设置属性
    xhr.open('post', '02.post.php');

    // 如果想要使用 post 提交数据, 必须添加此行
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    // 将数据通过 send 方法传递
    xhr.send('name=fox&age=18');

    // 发送并接受返回值
    xhr.onreadystatechange = function () {
        // 这步为判断服务器是否正确响应
        if (xhr.readyState == 4 && xhr.status == 200) {alert(xhr.responseText);
        }
    };
</script>
</body>
</html>

onreadystatechange 事件
注册 onreadystatechange 事件后,每当 readyState 属性改变时,就会调用 onreadystatechange 函数。

readyState:(存有 XMLHttpRequest 的状态。从 0 到 4 发生变化)

0: 请求未初始化

1: 服务器连接已建立

2: 请求已接收

3: 请求处理中

4: 请求已完成,且响应已就绪

事件的触发条件

事件的触发顺序

上图的参考链接:

你真的会使用 XMLHttpRequest 吗?
实际开发中用的 原生 Ajax 请求

var util = {};

// 获取 ajax 请求之后的 json
util.json = function (options) {

    var opt = {
        url: '',
        type: 'get',
        data: {},
        success: function () {},
        error: function () {},

    };
    util.extend(opt, options);
    if (opt.url) {
        //IE 兼容性处理:浏览器特征检查。检查该浏览器是否存在 XMLHttpRequest 这个 api,没有的话,就用 IE 的 api
        var xhr = XMLHttpRequest ? new XMLHttpRequest() : new window.ActiveXObject('Microsoft.XMLHTTP');

        var data = opt.data,
            url = opt.url,
            type = opt.type.toUpperCase();
        dataArr = [];}

    for (var key in data) {dataArr.push(key + '=' + data[key]);
    }

    if (type === 'GET') {url = url + '?' + dataArr.join('&');
        xhr.open(type, url.replace(/\?$/g, ''), true);
        xhr.send();}

    if (type === 'POST') {xhr.open(type, url, true);
        // 如果想要使用 post 提交数据, 必须添加此行
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.send(dataArr.join('&'));
    }

    xhr.onload = function () {if (xhr.status === 200 || xhr.status === 304) { //304 表示:用缓存即可。206 表示获取媒体资源的前面一部分
            var res;
            if (opt.success && opt.success instanceof Function) {
                res = xhr.responseText;
                if (typeof res === 'string') {res = JSON.parse(res);  // 将字符串转成 json
                    opt.success.call(xhr, res);
                }
            }
        } else {if (opt.error && opt.error instanceof Function) {opt.error.call(xhr, res);
            }
        }
    };
}

Ajax 的推荐链接:https://segmentfault.com/a/11…

跨域通信的几种方式
方式如下:

1、JSONP

2、WebSocket

3、CORS

4、Hash

5、postMessage

上面这五种方式,在面试时,都要说出来。

1、JSONP
面试会问:JSONP 的原理是什么?怎么实现的?

在 CORS 和 postMessage 以前,我们一直都是通过 JSONP 来做跨域通信的。

JSONP 的原理:通过 <script> 标签的异步加载来实现的。比如说,实际开发中,我们发现,head 标签里,可以通过 <script> 标签的 src,里面放 url,加载很多在线的插件。这就是用到了 JSONP。

JSONP 的实现:

比如说,客户端这样写:

<script src="http://www.smyhvae.com/?data=name&callback=myjsonp"></script>

上面的 src 中,data=name 是 get 请求的参数,myjsonp 是和后台约定好的函数名。服务器端这样写:

    myjsonp({data: {}

    })

于是,本地要求创建一个 myjsonp 的全局函数,才能将返回的数据执行出来。

实际开发中,前端的 JSONP 是这样实现的:

<script>

    var util = {};

    // 定义方法:动态创建 script 标签
    /**
     * [function 在页面中注入 js 脚本]
     * @param  {[type]} url     [description]
     * @param  {[type]} charset [description]
     * @return {[type]}         [description]
     */
    util.createScript = function (url, charset) {var script = document.createElement('script');
        script.setAttribute('type', 'text/javascript');
        charset && script.setAttribute('charset', charset);
        script.setAttribute('src', url);
        script.async = true;
        return script;
    };


    /**
     * [function 处理 jsonp]
     * @param  {[type]} url      [description]
     * @param  {[type]} onsucess [description]
     * @param  {[type]} onerror  [description]
     * @param  {[type]} charset  [description]
     * @return {[type]}          [description]
     */
    util.jsonp = function (url, onsuccess, onerror, charset) {var callbackName = util.getName('tt_player'); // 事先约定好的 函数名
        window[callbackName] = function () {      // 根据回调名称注册一个全局的函数
            if (onsuccess && util.isFunction(onsuccess)) {onsuccess(arguments[0]);
            }
        };
        var script = util.createScript(url + '&callback=' + callbackName, charset);   // 动态创建一个 script 标签
        script.onload = script.onreadystatechange = function () {   // 监听加载成功的事件,获取数据
            if (!script.readyState || /loaded|complete/.test(script.readyState)) {
                script.onload = script.onreadystatechange = null;
                // 移除该 script 的 DOM 对象
                if (script.parentNode) {script.parentNode.removeChild(script);
                }
                // 删除函数或变量
                window[callbackName] = null;  // 最后不要忘了删除
            }
        };
        script.onerror = function () {if (onerror && util.isFunction(onerror)) {onerror();
            }
        };
        document.getElementsByTagName('head')[0].appendChild(script); // 往 html 中增加这个标签,目的是把请求发送出去
    };

</script>

2、WebSocket
WebSocket 的用法如下:

//

var ws = new WebSocket('wss://echo.websocket.org'); // 创建 WebSocket 的对象。参数可以是 ws 或 wss,后者表示加密。// 把请求发出去
ws.onopen = function (evt) {console.log('Connection open ...');
    ws.send('Hello WebSockets!');
};


// 对方发消息过来时,我接收
ws.onmessage = function (evt) {console.log('Received Message:', evt.data);
    ws.close();};

// 关闭连接
ws.onclose = function (evt) {console.log('Connection closed.');
};

Websocket 的推荐链接:http://www.ruanyifeng.com/blo…

面试一般不会让你写这个代码,一般是考察你是否了解 WebSocket 概念,知道有这么回事即可。

3、CORS
CORS 可以理解成是既可以同步、也可以异步的 Ajax。

fetch 是一个比较新的 API,用来实现 CORS 通信。用法如下:

  // url(必选),options(可选)fetch('/some/url/', {method: 'get',}).then(function (response) {// 类似于 ES6 中的 promise}).catch(function (err) {// 出错了,等价于 then 的第二个参数,但这样更好用更直观});

CORS 的推荐链接:http://www.ruanyifeng.com/blo…
推荐链接里有详细的配置。

另外,如果面试官问:“CORS 为什么支持跨域的通信?”

答案:跨域时,浏览器会拦截 Ajax 请求,并在 http 头中加 Origin。

4、Hash
url 的 #后面的内容就叫 Hash。Hash 的改变,页面不会刷新。这就是用 Hash 做跨域通信的基本原理。

补充:url 的? 后面的内容叫 Search。Search 的改变,会导致页面刷新,因此不能做跨域通信。

使用举例:

场景:我的页面 A 通过 iframe 或 frame 嵌入了跨域的页面 B。

现在,我这个 A 页面想给 B 页面发消息,怎么操作呢?

(1)首先,在我的 A 页面中:

// 伪代码
var B = document.getElementsByTagName('iframe');
B.src = B.src + '#' + 'jsonString';  // 我们可以把 JS 对象,通过 JSON.stringify()方法转成 json 字符串,发给 B

(2)然后,在 B 页面中:

// B 中的伪代码
window.onhashchange = function () {  // 通过 onhashchange 方法监听,url 中的 hash 是否发生变化
    var data = window.location.hash;
};

5、postMessage()方法
H5 中新增的 postMessage() 方法,可以用来做跨域通信。既然是 H5 中新增的,那就一定要提到。

场景:窗口 A (http:A.com)向跨域的窗口 B (http:B.com)发送信息。步骤如下。

(1)在 A 窗口中操作如下:向 B 窗口发送数据:

// 窗口 A(http:A.com)向跨域的窗口 B(http:B.com)发送信息
 Bwindow.postMessage('data', 'http://B.com'); // 这里强调的是 B 窗口里的 window 对象

(2)在 B 窗口中操作如下:

// 在窗口 B 中监听 message 事件
Awindow.addEventListener('message', function (event) {   // 这里强调的是 A 窗口里的 window 对象
    console.log(event.origin);  // 获取:url。这里指:http://A.com
    console.log(event.source);  // 获取:A window 对象
    console.log(event.data);    // 获取传过来的数据
}, false);

正文完
 0

前端笔记

50次阅读

共计 1853 个字符,预计需要花费 5 分钟才能阅读完成。

HTML

CSS

CSS 优先级

!important 优先级最高

specifity = A + B + C + D
A: 内联样式存在 A = 1,不存在 A = 0
B: id 选择器 出现的次数
C: 类选择器,伪类,属性选择器 出现的次数
D: 标签选择器,伪元素 出现的次数

//example
li:first-child h2 .title            /* (0, 0, 2, 2) */

盒模型

是什么:
页面是由一个个盒模型组成的,每个元素都可以视为一个盒模型
包括:
从外到内:margin -> border -> padding -> content
分类:
标准盒模型 | IE 盒模型
区别:
标准盒模型的内容大小 = content 的大小
IE 盒模型的内容大小 = content + padding + border
如何设置盒模型的种类:
box-sizing: content-box
box-sizing: border-box

flex 布局

.box {display:flex;}

父元素设置 flex,子元素自动成为容器成员, 成为 flex 项目

水平轴:main axis (main start <-> main end)
垂直轴:cross axis (cross start <-> cross end)
项目默认按 主轴 排列

容器属性:
·flex-direction:决定主轴的方向

.box{
    flex-direction:row|row-reverse|column|column-reverse
    // 从左到右 | 从右到左 | 从上到下 | 从下到上
}

·flex-wrap: 换行

.box{
    flex-wrap: nowrap|rap|rap-reverse;
    // 不换行 | 换行 | 反向换行(第一行在下)}

·flex-flow:flex-direction 和 flex-wrap 的简写

.box{flex-flow:<flex-direction> || <flex-wrap>;}

·justify-content:x 轴对齐方式

.box{
    justify-content:flex-start | flex-end | center | space-between |space-around;
    // 左对齐 | 右对齐 | 居中 | 两端对齐,项目之间的间隔都相等 | 每个项目两侧的间隔相等,该间隔 = 2* 项目与边框的间隔。}

·align-items:y 轴对齐方式

.box{
    align-items:flex-start | flex-end | center |baseline | stretch;
    // 上对齐 | 下对齐 | 居中 | 以第一行文字的基线对齐 | 占满容器(默认}

·align-content:多根轴线对齐方式,单根轴线无效

.box{align-content:flex-start | flex-end | center | spance-between | space-around |stretch;}

项目属性:
·order:数值越小排列越靠前

.item{order:int;}

`flex-grow: 放大比例属性,默认 0

.item{
    flex-grow:<number>;
    // 如果所有项目的 flex-grow 属性都为 1,则它们将等分剩余空间(如果有的话)。如果一个项目的 flex-grow 属性为 2,其他项目为 1,则牵着占据的剩余空间将比其他项多一倍
}

·flex-shrink: 缩小比例属性, 默认 1

.item{flex-shrink:<number>;/* default 1 */}

grow,shrink 为 0,不会自适应,为 1 会自适应

·flex-basis 设置或检索弹性盒伸缩基准值

// 配合 flex-wrap 一起使用,如果 flex-wrap 的值为 nowrap 的话,flex-basis 的作用不大,相反,如果 flex-wrap 的值为 wrap 的话,flex 容器根据 flex-basis 计算是否需要换行

·flex:flex-grow,flex-shrink 和 flex-basis 的简写 默认值 0 1 auto

.item {flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'>]
}

.align-self 属性

align-self 属性允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性。默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,等同于 stretch。

.item {align-self: auto | flex-start | flex-end | center | baseline | stretch;}

JavaScript

Vue

Webpack

React

数据结构

计算机网络

正文完
 0