【前端知识体系-JS相关】JS-Web-API总结
2.1 DOM操作
2.1.1 DOM的本质是什么?
<!-- DOM树:二叉树 -->
/*
<?xml version="1.0" encoding="UTF-8"> // 告诉浏览器以哪一种类型进行解析
<node>
<child />
</node>
*/
<!DOCTYPE html> // 以html类型进行解析文档内容
<html>
<body>
</body>
</html>
2.1.2 DOM操作的常用API有哪些?
节点查找API
- document.getElementById :根据ID查找元素,大小写敏感,如果有多个结果,只返回第一个;
- document.getElementsByClassName :根据类名查找元素,多个类名用空格分隔,返回一个 HTMLCollection 。注意兼容性为IE9+(含)。另外,不仅仅是document,其它元素也支持 getElementsByClassName 方法;
- document.getElementsByTagName :根据标签查找元素, * 表示查询所有标签,返回一个 HTMLCollection 。
- document.getElementsByName :根据元素的name属性查找,返回一个 NodeList 。
- document.querySelector :返回单个Node,IE8+(含),如果匹配到多个结果,只返回第一个。
- document.querySelectorAll :返回一个 NodeList ,IE8+(含)。
- document.forms :获取当前页面所有form,返回一个 HTMLCollection ;
节点创建API
- createElement创建元素
- createTextNode创建文本节点
- cloneNode 克隆一个节点
- createDocumentFragment
节点修改API
- appendChild
- insertBefore
- insertAdjacentHTML
- Element.insertAdjacentElement()
- removeChild
- replaceChild
节点关系API
- 1、父关系API
parentNode :每个节点都有一个parentNode属性,它表示元素的父节点。Element的父节点可能是Element,Document或DocumentFragment;
parentElement :返回元素的父元素节点,与parentNode的区别在于,其父节点必须是一个Element元素,如果不是,则返回null;
- 2、子关系API
children :返回一个实时的 HTMLCollection ,子节点都是Element,IE9以下浏览器不支持;
childNodes :返回一个实时的 NodeList ,表示元素的子节点列表,注意子节点可能包含文本节点、注释节点等;
firstChild :返回第一个子节点,不存在返回null,与之相对应的还有一个 firstElementChild ;
lastChild :返回最后一个子节点,不存在返回null,与之相对应的还有一个 lastElementChild ;
- 3、兄弟关系型API
previousSibling :节点的前一个节点,如果不存在则返回null。注意有可能拿到的节点是文本节点或注释节点,与预期的不符,要进行处理一下。
nextSibling :节点的后一个节点,如果不存在则返回null。注意有可能拿到的节点是文本节点,与预期的不符,要进行处理一下。
previousElementSibling :返回前一个元素节点,前一个节点必须是Element,注意IE9以下浏览器不支持。
nextElementSibling :返回后一个元素节点,后一个节点必须是Element,注意IE9以下浏览器不支持。
元素属性型API
1、setAttribute 给元素设置属性:
2、getAttribute
3、hasAttribute
样式操作API(面试考点)
- 1、直接修改元素的样式
elem.style.color = 'red';
elem.style.setProperty('font-size', '16px');
elem.style.removeProperty('color');
- 2、动态添加样式规则
var style = document.createElement('style');
style.innerHTML = 'body{color:red} #top:hover{background-color: red;color: white;}';
document.head.appendChild(style);
- 3、classList获取样式属性
[!NOTE]
了解dom节点样式(classList)的remove, add, toggle, contains, replace等方法的使用。
- 4、window.getComputedStyle
通过 element.sytle.xxx 只能获取到内联样式,借助 window.getComputedStyle 可以获取应用到元素上的所有样式,IE8或更低版本不支持此方法。
var style = window.getComputedStyle(element[, pseudoElt]);
2.1.3 DOM节点的attr和proerty的区别
// proprty------>>>获取nodeName和nodeType(property实际上就是JS对象的一个属性)如:text : 3(#text), p : 1(p)
console.log(pList[0].nodeName); // p
console.log(pList[0].nodeType); // 1
// attribute------>>> 获取一个HTML标签的属性信息(设置和修改)
var a = document.getElementsByTagName('a')[0];
console.log(a.getAttribute('data-origin'));
console.log(a.getAttribute("href_name")); // 可以给一个HTML标签设置任意的属性名称,无论这个属性内部是否存在
a. setAttribute('sex', 'male')
// 区别:
// (JS对象&HTML标签)property实际上是一个普通JS对象本身的基本属性,但是attribute实际上是一个HTML标签上面的属性信息
[!NOTE]
区别:(JS对象&HTML标签)property实际上是一个普通JS对象本身的基本属性,但是attribute实际上是一个HTML标签上面的属性信息
2.2 BOM操作
2.2.1 如何检测浏览器的类型?
var ua = navigator.userAgent;
var isChrome = ua.indexOf('Chrome');
console.log('is Chrome?', isChrome > 0, navigator.userAgent);
console.log('电脑屏幕大小:', screen.width, screen.height)
2.2.2 如何拆解URL的各个部分?
// location
console.log(location.href); // 完整的url地址,http://localhost:8080/JS-Professional/begin/02-%E5%9F%BA%E7%A1%80%E8%BF%9B%E9%98%B6/01-%E4%BB%8E%E5%9F%BA%E7%A1%80%E5%88%B0%E8%BF%9B%E9%98%B6.html?_ijt=i8ctmkc87dvh03tdaf51rn5v1i
console.log(location.protocol) // http/https
console.log(location.host, location.hostname) // www.52tech.tech
console.log(location.pathname); // host之后的全部内容,JS-Professional/begin/02-%E5%9F%BA%E7%A1%80%E8%BF%9B%E9%98%B6/01-%E4%BB%8E%E5%9F%BA%E7%A1%80%E5%88%B0%E8%BF%9B%E9%98%B6.html
console.log(location.search); // search就是?之后的全部内容,?_ijt=i8ctmkc87dvh03tdaf51rn5v1i(包括?)
console.log(location.hash); // #后面的内容(包括#)
2.3 事件操作
2.3.1 编写一个通用的事件监听函数
function bindEvent(ele, type, selector, fn){
if (fn == null) {
fn = selector;
selector = null;
}
// addEventListener 的最后一个参数默认是false, 表示的是事件冒泡,自下向上去捕获事件,true:表示事件捕获,表示事件自外向里的方式
ele.addEventListener(type, function(e){
if (selector) {
// 使用的是代理的方式的话
if (e.target.matches(selector)){ // 这里需要去判断当前点击的那个对象是不是我点击的那个对象
fn.call(e.target, e);
}
} else {
// 不使用代理的话
fn(e);
}
});
}
// 这里表示对这个div1 内部的所有的a标签使用事件冒泡
bindEvent(document.getElementById('div4'), 'click', 'p', function (e) {
console.log(this.innerHTML + 'hahaah')
})
版本2:
/**
* 实现一个通用的事件绑定函数(代码简洁,减少了浏览器的占用)
* @param element
* @param type
* @param selector
* @param fn
*/
function bindEvent(element, type, selector, fn) {
// if (fn === null || fn === undefined) // 这里可以直接优化为fn == null
if (fn == null){
// 只有3个参数的话
fn = selector;
selector = null;
}
element.addEventListener(type, function (e) {
var target;
// 如果selector有的话,说明此事element就是一个代理
if (selector) {
target = e.target;
// 如果当前的target满足这个选择器的话
// 如果元素被指定的选择器字符串选择,Element.matches() 方法返回true; 否则返回false。
// document.getElementById('div1').matches('div') true
// matches里面的参数实际上是一个HTML标签:a, p, div …………, 内容也是不区分大小写的,有点类似于nodeName 或者nodeType 这样的判断
if (target.matches(selector)){
// 修改this的指向
fn.call(target, e);
}
}else {
fn(e);
}
});
}
2.3.2 描述事件冒泡的流程
[!NOTE]
"DOM2级事件”规定的事件流包含三个阶段:事件捕获阶段,处于目标阶段和事件冒泡阶段。首先发生的是事件捕获,然后是实际的目标接收到事件,最后阶段是冒泡阶段。
- 事件冒泡:
按照DOM树形结构向上冒泡(p --- >>> div --- >>> body --- >>> document),- 事件捕获
(document—>—>—>的顺序进行传播的)2.3.3 对于一个无线下拉图片的页面,如何给每一个图片绑定一个事件
// 代理(div3里面的所有a标签都需要进行事件的监听)
var div3 = document.getElementById('div3');
bindEvent(div3, 'click', function (e) {
e.preventDefault();
e.stopPropagation()
// 可以获取真实触发的那个元素
var target = e.target;
console.log(target.nodeName, target.nodeType); // 每一种页面标签实际上都有一个自己专属的nodeName
// 这里的目的主要是用于过滤,只处理a标签的事件处理
if ('A' === target.nodeName) {
// 如果当前点击的a标签就是自己
alert(target.innerHTML)
}
})2.4 Ajax操作
2.4.1 手动编写一个ajax,不依赖第三方库
2.4.2 跨域的几种实现方式以及底层的实现原理
- 服务器端的使用:response.setHeader(Access-Control-Allow-Origin, "http://www.baidu.com, http://www.52tech.tech")允许跨域
- 使用JSONP
2.4.3 JSONP的实现原理
[!NOTE]
跨域:浏览器有同源策略,不允许ajax访问其他域接口
- 跨域条件:协议、域名、端口,有一个不同就是跨域
可以跨域加载资源的3个标签:
<img src="">, <link href="">, <script src="">
- img用途:主要用于打点统计,统计网站可能是其他域
- link, script用途:可以使用CDN,可以使用其他域
- script用途:可以用于JSONP
2.4.3.1 跨域注意事项:
- 所有的跨域请求都必须经过信息提供方的允许才可以获取
- 如果未经允许就可以直接获取,就是浏览器的同源策略出现漏洞
2.4.3.2 浏览器端实现(提前定义一个回调函数)
//封装一个jsonp请求的函数
function query(opt) {
let str = ""
for (let key in opt) {
str += key + "=" + opt[key] + "&"
}
return str
}
//设置默认回调函数的名字
const defaultOptions = {
callbackName: "callback"
}
function jsonp(url, opt, options = defaultOptions) {
//参数解析 URL为访问的接口 opt为传播的数据 option 为接受参数的回调函数
return new Promise((resolve, reject) => {
//判断下这个?是不是存在
let index = url.indexOf("?");
url += index != -1 ? query(opt) : "?" + query(opt);
url = url + `${options.callbackName}=${options.callbackName}`;
//首先创造一个标签 带有src的
const scriptDom = document.createElement("script");
//设置其src属性
scriptDom.setAttribute("src", url);
//在window系统上创建一个回调函数用来接受数据
window[options.callbackName] = (res) => {
//在接受到了参数动态删除这个script节点和window上面的方法
delete window[options.callbackName];
document.body.removeChild(scriptDom)
//接受成功后调用resolve
if (res) {
resolve(res)
} else {
reject("服务器暂没有获取到数据")
}
}
//动态创建script标记,错误的监听
scriptDom.addEventListener('error', () => {
delete window['jsonpCallback'];
document.body.removeChild(script);
reject('服务器加载失败!');
});
document.body.append(scriptDom)
})
}
2.4.3.3 后端实现
const url = require("url") router.get("/api", (req, res, next) => {
//将script标签的src的URL请求转成对象
const opj = url.parse(req.url, true).query;
//然后原理就是调用这个回调函数来进行传参
let {
callback
} = opj;
//如果这个回调函数存在证明是jsonp请求
if (callback) {
let resault = JSON.stringify({
code: 1,
msg: "express框架传回去的参数"
});
res.send(`${callback}(${resault})`)
}
})
2.5 本地存储
2.5.1 cookie, sessionStorage, localStorage 的区别
Cookie
- 存储量,只有4kb
- 所有的http请求都会带有cookie,会直接影响获取资源效率
- API,document.cookie
localstorage
- localstorage.setItem(key, value);localstorage.getItem('key');
- 存储量5MB
- sessionStorage:会话级别
[!WARNING]
【坑】IOS safari的隐藏模式下,使用localStorage.getItem('key') 会报错,建议使用try{}catch(e){} 来实现可以防止报错【前端知识体系-JS相关】JS-Web-API总结的更多相关文章
- 【前端知识体系-CSS相关】CSS工程化方案
1.如何解决CSS的模块化问题? 使用Less,Sass等CSS预处理器 使用PostCSS插件(postcss-import/precss) 使用webpack处理CSS(css-loader + ...
- 前端知识体系-NodeJS相关】NodeJS基础知识全面总结
NodeJS基础知识 1. Node的全局对象和全局变量 1.1 全局对象:所有模块都可以调用的 global:表示Node所在的全局环境,类似于浏览器的window对象. process:该对象表示 ...
- 【前端知识体系-NodeJS相关】NodeJS高频前端面试题整理
1. 为什么JavaScript是单线程? 防止DOM渲染冲突的问题: Html5中的Web Worker可以实现多线程 2.什么是任务队列? 任务队列"是一个先进先出的数据结构,排在前面的 ...
- 【前端知识体系-HTML相关】HTML基础知识强化总结
1.如何理解HTML? HTML类似于一份word"文档" 描述文档的"结构" 有区块和大纲 2.对WEB标准的理解? Web标准是由一系列标准组合而成.一个网 ...
- 【前端知识体系-CSS相关】CSS预处理器
1.常见的CSS预处理器有哪些? [!NOTE] css预处理器:用一种专门的编程语言,为CSS增加了一些编程的特性,将CSS作为目标生成文件,然后开发者就只要使用这种语言进行编码工作,可以让你的CS ...
- 【前端知识体系-NodeJS相关】对NodeJS模块机制的理解
1. CommonJS模块规范 1.1 模块引用 var math = require('math'); 1.2 模块定义 [!NOTE] 上下文提供exports对象用于导出当前模块的方法和变量,并 ...
- 【前端知识体系-CSS相关】Bootstrap相关知识
1.Bootstrap 的优缺点? 优点:CSS代码结构合理,现成的代码可以直接使用(响应式布局) 缺点:定制流程较为繁琐,体积大 2.如何实现响应式布局? 原理:通过media query设置不同分 ...
- 【前端知识体系-CSS相关】CSS特效实现之Transition和Transform对比
CSS效果 1.使用div绘制图形(三角形)? <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 【前端知识体系-NodeJS相关】对于EventLoop(事件轮询)机制你到底了解多少?
EventLoop 1. EventLoop的执行流程图 ┌───────────────────────┐ ┌─>│ timers │<----- 执行 setTimeout().set ...
- 【前端知识体系-NodeJS相关】浅谈NodeJS中间件
1. 中间件到底是个什么东西呢? [!NOTE] 中间件其是一个函数,在响应发送之前对请求进行一些操作 function middleware(req,res,next){ // 做该干的事 // 做 ...
随机推荐
- Redis实战篇
Redis实战篇 1 Redis 客户端 1.1 客户端通信 原理 客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 . 客户端和服务器发送的命令或数据一律以 \r\n ...
- opencv::直方图均衡化
直方图均衡化 图像直方图: 是指对整个图像像在灰度范围内的像素值是指对整个图像像在灰度范围内的像素值(~)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图. 直方图反映了图像灰度的分布情况. ...
- Pycharm中Python Console与Terminal的区别
1.Python Console是Python交互式模式,可以直接输入代码,然后执行,并立刻得到结果 2.Terminal是命令行模式,与系统的CMD(命令提示符)一样,可以运行各种系统命令
- 20.Linux进程管理-企业案例
1.管理进程状态 当程序运行为进程后,如果希望停止进程,怎么办呢? 那么此时我们可以使用linux的kill命令对进程发送关闭信号.当然除了kill.还有killall,pkill 1.使用kill ...
- 线性回归 python 代码实现
本代码参考自:https://github.com/lawlite19/MachineLearning_Python#%E4%B8%80%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%B ...
- 基于STM32F103和Cube的输入捕获例程
1.开发环境 (1)Cube5.24 (2)Keil5 (3)STM32F103 2.Cube配置 Cube配置很简单,只要打开TIM4通道1的引脚,设置为输入捕获模式,在配置是高或低电平沿触发 TI ...
- 中国大学MOOC-数据结构与算法实战 P6 括号匹配 (15 分)
检查一段C语言代码的小括号( ). 中括号 [ ] 和大括号{ } 是否匹配. 输入格式: 在一行中输入一段C语言代码,长度不超过1000个字符(行末以换行符结束). 输出格式: 第一行输出左括号的数 ...
- C加加学习之路 1——开始
C++是一门古老而复杂的语言,绝不是一门可以速成的语言,学习它需要有意识的刻意练习和长时间的持续不断的磨练.而大多数人不太能耐得住寂寞,喜欢速成,所以像<21天学通C++>这种书就比较受欢 ...
- javascript函数前面加~波浪线的作用
如下,在函数前加上波浪号,其作用是把函数声明转换为表达式,这样就可以直接运行. ~function sayHello(){ console.log('hello'); }() 测试: 在console ...
- python模块的导入详解
一:一个小问题:什么是模块? 我的理解是:有通用功能的文件的集合. 二:为什么要使用模块? 我们通常为了使自己以前写的东西保存下来,会把东西写入文件中保存下来,必要时我们把这些文件当脚本去执行,也可以 ...