你几乎不知道的浏览器内置对象/事件/ajax

news2024/11/15 8:54:20

浏览器内置对象/事件/ajax

浏览器是⼀个 JS 的运⾏时环境,它基于 JS 解析器的同时,增加了许多环境相关的内容。⽤⼀张图表示各个运⾏环境和 JS 解析器的关系如下:在这里插入图片描述
我们把常⻅的,能够⽤ JS 这⻔语⾔控制的内容称为⼀个 JS 的运⾏环境。常⻅的运⾏环境有 Node.js,浏览器,⼩程序,⼀些物联⽹设备等等。所有的运⾏环境都必须有⼀个 JS 的解释器,在解释器层⾯符合ECMAScript 规范,定义了 JS 本身语⾔层⾯的东⻄⽐如关键字,语法等等。在每个环境中,也会基于 JS 开发⼀些当前环境中的特性,例如 Node.js 中的 global 对象,process 对象;浏览器环境中的 window 对象,document 对象等等,这些属于运⾏环境在 JS 基础上的内容。这也就解释了为什么在 node.js 和浏览器中都能使⽤数组,函数,但是只能在 node.js 使⽤ require 加载模块,⽽不能在浏览器端使⽤的原因,因为 require 是 node.js 特有的运⾏环境中的内容。

内置对象属性

Window

window 是在浏览器中代表全局作⽤域,所有在全局作⽤域下声明的变量和内容最终都会变成 window对象下的属性。⽐如:

var num = 123;
console.log(window.num); // 123

访问未声明的变量时,如果直接访问则会报错,⽽如果使⽤ window 进⾏访问,就像通过对象访问那样,会返回 undefined。

var name = oldName; // 报错
var name2 = window.oldName; // undefined

setTimeout 和 setInterval

setTimeout 和 setInterval 他们都可以接受两个参数,第⼀个参数是⼀个回调函数,第⼆个参数是等待执⾏的时间。在等待时间结束之后,就会将回调函数放到 event loop 中进⾏执⾏。他们都返回⼀个id,传⼊ clearTimeout 和 clearInterval 能够清除这次的定时操作。

var id = setTimeout(function() {
	console.log('hello world');
}, 2000);
clearTimeout(id);

可视化⼯具⽹站
重点:如果此时队列中没有内容,则会⽴即执⾏此回调函数,如果此时队列中有内容的话,则会等待内容执⾏完成之后再执⾏此函数。(所以即使等待时间结束,也不是⽴刻执⾏这个回调函数的!)
因为 setInterval 执⾏时间的不可确定性,所以⼤部分时候,我们会使⽤ setTimeout 来模拟setInterval。
假设我们点击事件之后会触发 setInterval(func, 500) ,那么每隔 500ms 就会将 func 放⼊⼀次消息队列,如果此时主栈中有其他代码执⾏的话,就会等待其他代码执⾏之后再读取消息队列中的函数执⾏。但对于 setInterval,仅当没有该定时器的任何其他代码实例时,才将定时器代码添加到队列中,所以就会造成某个瞬间有次回调函数没有加进事件队列中去,造成丢帧。在这里插入图片描述
使⽤ setTimeout 模拟之后的样⼦,每次执⾏完成之后再将下次的事件推⼊事件队列中:在这里插入图片描述
alert,confirm,prompt 等交互相关 API

alert 会弹出⼀个警告框,⽽ confirm 和 prompt 则可以与⽤户交互,confirm 会弹出⼀个确认框,最终返回 true (⽤户点击确定)返回 false (⽤户点击取消)⽽ prompt ⽤户则可以输⼊⼀段⽂字,最终返回⽤户输出的结果。
这⾥使⽤了这类 API 之后,会导致⻚⾯ JS 停⽌执⾏,需要我们格外慎重。

Location

https://baidu.com:8010/api/getSearchResule?foo=bar#hash

在这里插入图片描述
属性

hash:返回⼀个URL的锚部分。
host:返回⼀个URL的主机名和端⼝
hostname:返回URL的主机名
href:当前 url
pathname: 返回的URL路径名。
port: 返回⼀个URL服务器使⽤的端⼝号
protocol:返回⼀个URL协议
search:返回⼀个URL的查询部分

⽅法

reload:重新载⼊当前⻚⾯
replace:⽤新的⻚⾯替换当前⻚⾯

Document

⽅法:选择器
选择器是考察浏览器相关知识点的重中之重,⼀般会结合实际场景进⾏考察。
getElementById , getElementsByClassName , getElementsBytagName 等早期规范定义的API,还有新增的 querySelector querySelectorAll 等新规范增加的选择器
重点: getElementsByTagName 等返回多个 node 节点的函数返回值并不是数组,⽽是浏览器实现的⼀种数据结构。
⽅法:创建元素
document.createElement 能够创建⼀个 dom 元素,在新增多个元素时,可以先在内存中拼接出所有的 dom 元素后⼀次插⼊。

var fruits = ['Apple', 'Orange', 'Banana', 'Melon'];
var fragment = document.createDocumentFragment();
	fruits.forEach(fruit => {
const li = document.createElement('li');
	li.innerHTML = fruit;
	fragment.appendChild(li);
});
document.body.appendChild(fragment);

属性

title: document.title 可以设置或返回当前⻚⾯标题
domain: 展示当前⽹站的域名
url: 当前⽹站的链接
anchors: 返回所有的锚点,带 name 属性的 a 标签
forms: 返回所有的 form 标签集合
images: 返回所有的 img 标签集合
links: 返回所有带 href 属性的 a 标签

Element

Element 元素的 nodeType 均为 1 ,⼤多数标签都是⼀个 Element 实例
属性

tagName:返回当前元素的标签名

⽅法

getAttribute:获取当前节点属性的结果
setAttribute: 设置当前节点属性

Text 类型

Text 类型包含所有纯⽂本内容,他不⽀持⼦节点,同时他的 nodeType 为 3

History

History 对象包含⽤户(在浏览器窗⼝中)访问过的 URL。在 HTML 5 中,history 还与客户端路由息息相关。
属性

length: 返回历史列表中的⽹址数

⽅法

back:加载 history 列表中的前⼀个 URL
forward:加载 history 列表中的下⼀个 URL
go: 加载 history 列表中的某个具体⻚⾯
pushState:替换地址栏地址,并且加⼊ history 列表,但并不会刷新⻚⾯
replaceState:替换地址栏地址,替换当前⻚⾯在 history 列表中的记录,并不刷新⻚⾯

总结(⾯试常考点 & 易错点)
全局定义的变量均可以通过 window 来进⾏访问。使⽤ setInterval 需要注意,有可能代码并不是以相同间隔执⾏。使⽤ alert 等 API 需要注意,JS 代码可能会被阻塞。

location 对象需要明确对于 URL 来说,每⼀个类型代表的具体值是什么。
document 对象主要衔接 JS 和我们的 DOM 元素。需要注意这⾥很多选择的结果是 array-like 的类数组元素。以及使⽤ createFragment 代码⽚段等优化,来防⽌浏览器多次重排造成性能问题。
Element 和 Text 是两个我们常⻅且易考易⽤的两个 DOM 对象。熟悉常⻅的⽅法和 debug ⽅式(console.dir)其次写代码时需要明确我们当前的⽅法究竟是 JS 层⾯的,还是环境层⾯的。
history 因为和前端路由息息相关,我们需要熟悉新增的 pushState 和replaceState ⽅法。

浏览器内置对象需要我们多看多练,以上是我们总结的⼀些常考点、易错点,对于基础的属性作⽤和⽤途,就需要同学们多在动⼿中打印熟悉确定了。

事件

事件是浏览器中的⼀个⾮常重要的内容,⽆论是⾯试还是⼯作中都是重点考察和使⽤的内容。

定义事件

我们可以通过多种⽅式对 DOM 元素定义⼀个事件:

<!-- 点击 p 标签弹出 alert -->
<p>点击后弹出 alert </p>

第⼀种⽅式,直接在 dom 元素中添加,不过这种⽅式⼀般不推荐,过分的将视图与逻辑部分的代码耦合。

<script>
function showAlert() {
	alert('hello event');
}
</scripts>
<p onclick="showAlert()">点击后弹出 alert </p>

第⼆种⽅式,纯 JS 解决,获取 dom 元素之后通过设置其 onclick 属性

document.getElementsByTagName('p')[0].onclick = function() {
	alert('hello world');
}
// 取消事件只需要设置 onclick 属性为 null 即可
document.getElementsByTagName('p')[0].onclick = null;

优点:纯 JS 实现,视图与逻辑解耦。
缺点:⼀个 dom 元素仅能设置⼀个 onclick 事件

第三种⽅式,纯 JS 解决,DOM2 级规范实现新的 API, addEventListener 和removeEventListener 两个 API

var onClickFunc = function() {
	alert('hello world');
};
document.getElementsByTagName('p')[0].addEventListener('click', onClickFunc);
// 取消事件,使⽤ removeEventListener 即可
document.getElementsByTagName('p')[0].removeEventListener('click',onClickFunc);

优点:
纯 JS 实现,视图与逻辑解耦;
通过 addEventListener 可以对 click 设置多个事件回调函数,他们会依次触发
缺点:
removeEventListener 删除的事件函数必须与设置时保持相同的函数引⽤,所以设置事件时尽量不使⽤匿名函数。
在 IE 中,为保证兼容性,我们需要通过 attachEvent 和 detachEvent 定义和删除事件,第⼀个参数接受事件名,第⼆个参数接受触发事件时的回调函数。
与 DOM2 规范定义的⽅法有区别的是,attachEvent 的事件名参数(第⼀个参数),需要加上 on 的前缀,例如:

var btn = document.getElementById('btn');
var onClickFunc = function() {
	alert('hello attachEvent');
}
btn.attachEvent('onclick', onClickFunc);
btn.detachEvent('onclick', onClickFunc);

同时,如果多次对同⼀个元素设置相同事件,attachEvent 会按照相反的顺序来进⾏执⾏。与 DOM2 事件规范相似的是,移除⼀个事件时还必须保证着事件的相同引⽤,否则⽆法清除事件。

事件捕获及冒泡

DOM 是⼀个嵌套性的树形树状结构,在浏览器中的表现就是叠加在⼀起的,所以在浏览器中点击⼀个区域,在 DOM 结构中会依次遍历多个 dom,⾃顶向下我们称为「事件捕获」,⾃下⽽上称为 「事件冒泡」。
DOM2 事件规范规定,⼀个标准的事件流分为三个阶段。⾸先是⾃上⽽下的「事件捕获」状态,然后是到达真正触发事件的元素,最后再从这个元素回到顶部的「事件冒泡」。在这里插入图片描述
DOM2 级事件规范新增的事件定义函数 addEventListener,就可以通过第三个参数来指定究竟是在捕获阶段触发事件还是在冒泡阶段出发事件。第三个参数为 true 则在捕获阶段触发,第三个参数为 false则在冒泡阶段触发。
IE 中的 attachEvent 不⽀持捕获或冒泡阶段的选择,仅⽀持在冒泡阶段触发。

事件对象

触发事件之后,浏览器会传⼊⼀个事件对象进⼊事件回调函数本身。

document.getElementsByTagName('p')[0].onclick = function(event) {
	console.log(event);
	alert('hello event');
};
document.getElementsByTagName('p')[0].addEventListener('click',
function(event) {
	console.log(event);
	alert('hello event');
});

event 对象下的属性

bubbles:表明事件是否冒泡
cancelable:表示是否可以取消事件的默认⾏为
currentTarget:事件当前正在处理的元素
defaultPrevented:为 true 则代表已经调⽤了 preventDefault 函数
detail:事件细节
eventPhase:事件所处阶段,1 代表捕获 2 代表在事件⽬标 3 代表冒泡
type:事件类型(click 等)

event 对象下的⽅法

preventDefault:取消事件的默认⾏为
stopImmediatePropagation:取消事件的进⼀步捕获或冒泡,同时阻⽌事件处理程序调⽤
stopPropagation:取消事件的进⼀步捕获或冒泡IE 对象下的 event 有些许不同,如果通过 DOM0 规范定义的事件,是通过 window 来获取 event 内容,如果是 attachEvent 定义事件,同样也是通过传⼊回调函数中去。

var btn = document.getElementById('btn');
// DOM0 ⽅式定义事件
btn.onclick = function() {
	var event = window.event;
};
btn.attachEvent('onclick', function(event) {
	console.log(event.type); // click
});

IE 下的 event 的属性⽅法

cancelBubble:默认为 false,设置为 true 及取消了事件冒泡
returnValue:默认为 true,设置 false 就会取消事件默认⾏为
srcElement:事件的⽬标
type:被触发的类型

事件委托

<ul id="ul">
	<p>1234</p>
	<li>1</li>
	<li>2</li>
	<li>3</li>
	<li>4</li>
</ul>
document.getElementById('ul').onclick = function(event) {
	var target = event.target;
	if (target.nodeName.toLowerCase() === 'li') {
		alert(target.innerHTML);
	}
}

⼀个通⽤的事件模型

通⽤的事件模型主要是为了兼容多个 DOM 等级间设置事件的区别及 IE 和主流规范的不同,同时需要兼容 event 事件本身的内容。

var addEvent = function(element, eventType, handler) {
	if (element.addEventListener) {
		element.addEventListener(eventType, handler, false);
	} else if (element.attachEvent) {
		element.attachEvent('on' + eventType, handler);
	} else {
		element['on' + eventType] = handler;
	}
	}
	var removeEvent = function(element, eventType, handler) {
		if (element.removeEventListener) {
			element.removeEventListener(eventType, handler, false);
		} else if (element.detachEvent) {
			element.detachEvent('on' + eventType, handler);
		} else {
			element['on' + eventType] = null;
		}
	}
	var getEvent = function(event) {
		return event ? event : window.event;
	}
	var getTarget = function(event) {
		return event.target || event.srcElement;
	}
	var preventDefault = function(event) {
		if (event.preventDefault) {
			event.preventDefault();
		} else {
			event.returnValue = false;
		}
	}
	var stopPropagation = function(event) {
		if (event.stopPropation) {
			event.stopPropation();
		} else {
			event.cancelBubble = true;
		}
	}
}

ajax

2005 年开始,ajax 作为⼀项新兴的交互技术开始影响 web 的发展。ajax 的核⼼是 XMLHttpRequest对象。

var xhr = new XMLHttpRequest();
// xhr.open 接受三个参数,要发送的请求类型 get post、请求的 url、是否异步发送的布尔值
xhr.open('get', '/ajax.json', true);
// 调⽤ send 函数发送这个请求,参数为携带的参数
xhr.send(null);

⽐较常⻅的是发送 get 请求和 post 请求。
发送 get 请求时,我们⼀般把参数放置在 url 路径中,以 ?foo=bar&bar=foo 这样的形式。
发送 post 请求时,数据放在 body 中,⼀般我们会以 form 表单的形式发送或者以 json 的形式发送数据。
get 请求发送数据:

var xhr = new XMLHttpRequest();
// xhr.open 接受三个参数,要发送的请求类型 get post、请求的 url、是否异步发送的布尔值
xhr.open('get', '/ajax?foo=bar&bar=foo', true);
// 调⽤ send 函数发送这个请求,参数为携带的参数
xhr.send(null);

post 请求发送 form 数据和 json 数据的示例:

var xhr = new XMLHttpRequest();
xhr.open('post', '/ajaxPost', true);
// 设置 request 的 content-type 为 application/x-www-form-urlencoded
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var data = new FormData();
data.append('foo', 'bar');
data.append('bar', 'foo');
xhr.send(data);
var xhr = new XMLHttpRequest();
xhr.open('post', '/ajaxPost', true);
// 设置 request 的 content-type 为 application/json
xhr.setRequestHeader('Content-Type', 'application/json');
var data = JSON.stringify({
	foo: 'bar',
	bar: 'foo'
});
xhr.send(data);

上⾯这个例⼦中我们通过 setRequestHeader 向后端发送⼀些⾃定义 header,除了浏览器默认发送的header 以外,也会带上我们⾃定义的 header 头部,后端同学收到这些内容就可以进⾏处理。
同样的,我们可以通过 onreadystatechange 事件,监听当前 xhr 实例的阶段,通过判断xhr.readyState 的阶段,来判断当前请求的状态。
readyState 状态如下:

0:未调⽤ open ⽅法
1:已调⽤ open ⽅法但未调⽤ send ⽅法
2:已调⽤ send ⽅法但尚未收到返回
3:收到部分响应数据
4:收到所有响应数据

同时 xhr 实例上还有 xhr.responseText 代表响应主体返回的⽂本, xhr.status 代表响应的 HTTP状态码, xhr.statusText HTTP 状态说明

var xhr = new XMLHttpRequest();
	xhr.onreadystatechange = function() {
		if (xhr.readystate !== 4) return;
		if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
			alert(xhr.responseText);
		} else {
			alert("错误:状态码 " + xhr.status + xhr.statusText);
		}
	}
	xhr.open('get', '/ajax?foo=bar&bar=foo', true);
	xhr.send(null);
}

我们也可以通过 xhr.getRequestHeader 来获取服务端返回的 header

ES6 之后的 fetch API

在 ES6 之后,浏览器端新增了⼀个 fetch api, 他有以下的⼏个特点:
fetch api 返回⼀个 promise 的结果默认不带 cookie,需要使⽤配置 credentials: "include"当⽹络故障时或请求被阻⽌时,才会标记为 reject。否则即使返回码是 500,也会 resolve 这个promise

fetch('/ajax?foo=bar')
.then(function() {
	console.log('请求发送成功');
})

这就是⼀个简单的请求,发送之后就会进⼊ resolve 状态。与普通的 ajax 请求不同的是,在服务端返回内容时,我们还需要调⽤⼀些⽅法才能拿到真正返回的结果。

fetch('/ajax?foo=bar')
.then(function(response) {
	response.text(); // 返回字符串
	response.json(); // 返回 json
	response.blob(); // ⼀般指返回⽂件对象
	response.arrayBuffer(); // 返回⼀个⼆进制⽂件
	response.formData(): // 返回表单格式内容
});

常⻅的 json 请求,我们需要再调⽤⼀次 response.json 来让 fetch API 返回的结果序列化为 json

fetch('/ajaxPost')
.then(function(response) {
return response.json();
})
.then(function(result) {
	console.log(result);
});

封装的通⽤ ajax 请求

function fetch(url, config = {}) {
	if (window.fetch) return window.fetch(url, config);
		return new Promise((resolve, reject) => {
		function createXHR() {
			if (typeof XMLHttpRequest !== undefined) {
				return new XMLHttpRequest();
		}
	// 兼容早期 IE
	if (typeof ActiveXObject !== undefined) {
		if (typeof arguments.callee.activeXString !== 'string') {
		var versions = ['MSXML2.XMLHttp.6.0',
		'MSXML2.XML2.XMLHttp.3.0', 'MSXML2.XMLHttp'];
		for (var i = 0; i < versions.length; i++) {
			try {
				new ActiveXObject(versions[i]);
				arguments.callee.activeXString = versions[i];
				break;
		} catch (e) {}
	}
	}
	return new ActiveXObject(arguments.callee.activeXString);
	}
	throw new Error('不⽀持 xhr 相关内容');
	}
	var xhr = createXHR();
	xhr.onreadystatechange = function() {
	console.log(xhr);
	if (xhr.readyState !== 4) return;
	var options = {
		status: xhr.status,
		statusText: xhr.statusText
	};
	var body = 'response' in xhr ? xhr.response : xhr.responseText;
	var response = {
	status: options.status || 200,
	statusText: options.statusText || 'ok',
	ok: options.status >= 200 && options.status < 300,
	text() {
		if (typeof body === 'string') {
			return Promise.resolve(body);
		}
},
		json() {
			return this.text().then(JSON.parse);
		}
	};
	resolve(response);
}
		xhr.open(config.method || 'get', url, true);
		xhr.send();
	});
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode—环形链表

前言&#xff1a;给定一个链表&#xff0c;判断是否为循环链表并找环形链表的入口点 首先我们需要知道什么是双向循环链表&#xff0c;具体如下图所示。 对于链表&#xff0c;我们如何去判断链表是循环链表呢&#xff1f;又寻找入环点呢&#xff1f;我们可以利用快慢指针的方法…

Meta CTO:Quest 2生命周期或比预期更久

前不久&#xff0c;Meta未来4年路线图遭曝光&#xff0c;泄露了该公司正在筹备中的一些AR/VR原型。除此之外&#xff0c;还有消息称Quest Pro或因销量不佳&#xff0c;而不再迭代。毫无疑问&#xff0c;Meta的一举一动持续受到行业关注&#xff0c;而面对最近的爆料&#xff0c…

关于指针运算的一道题

目录 刚看到这道题的时候我也和大多数小白一样感到无从下手&#xff0c;但是在我写这篇博客的前几分钟开始我对这道题有了一点点的理解。所以我就想着趁热打铁&#xff0c;写一篇博客来记录一下我的想法。 题目如下&#xff1a; 画图&#xff1a; 逐一解答&#xff1a; 题一…

笔记:二叉树

学习了二叉树&#xff0c;今天来整理一下笔记吧&#xff01;一&#xff1a;树的理解树的度是不限制的&#xff0c;一个双亲结点可以有很多子节点&#xff0c;但是子节点是不能交叉的&#xff0c;也就是不能有环。树的的最大层次叫做这棵树的深度或者高度&#xff1b;树的代码表…

高三应该怎么复习

高三是学生们备战高考的重要一年&#xff0c;正确有序的复习可以有效地提高复习效率&#xff0c;下面是一些高效复习的方法和建议&#xff1a;1. 制定合理的学习计划和目标高三的学生要制定合理的学习计划和目标&#xff0c;适当的计划和目标可以使学习更有针对性和效率。建议根…

本地部署dynamics

打开虚拟机的dynamics部署管理&#xff0c;点击组织再点击浏览 进入网址&#xff0c;输入账号密码 登录成功 点销售旁边的下箭头&#xff0c;选择设置中的系统作业 成功进入到系统作业 进入这个网址 Dynamics 365 客户参与快速入门&#xff08;本地&#xff09;&#xff08;Dy…

VRRP与BFD联动配置

VRRP与BFD联动配置 1. 实验目的 熟悉VRRP与BFD联动的应用场景掌握VRRP与BFD联动的配置方法2. 实验拓扑 实验拓扑如图14-13所示: 图14-13:VRRP与BFD联动配置 3. 实验步骤 配置IP地址PC1的配置 PC1的配置如图14-14所示:

Python 协程详解,都在这里了

什么是协程 协程&#xff08;co-routine&#xff0c;又称微线程、纤程&#xff09; 是一种多方协同的工作方式。 协程不是进程或线程&#xff0c; 其执行过程类似于 Python 函数调用&#xff0c; Python 的 asyncio 模块实现的异步IO编程框架中&#xff0c; 协程是对使用 asy…

毕设常用模块之舵机介绍以及使用方法

舵机 舵机是一种位置伺服的驱动器&#xff0c;主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由接收机或者单片机发出信号给舵机&#xff0c;其内部有一个基准电路&#xff0c;产生周期为 20ms&#xff0c;宽度为 1.5ms 的基准信号&#xff0c;将获…

易优cms user 登录注册标签

user 登录注册标签 user 登录注册入口标签 [基础用法] 标签&#xff1a;user 描述&#xff1a;动态显示购物车、登录、注册、退出、会员中心的入口&#xff1b; 用法&#xff1a; {eyou:user typeuserinfo} <div id"{$field.htmlid}"> …

如何用项目管理软件,帮助项目经理监控进度?

项目无论规模大小&#xff0c;都要处理许多任务&#xff0c;管理项目文档&#xff0c;监控任务进度等。 有一个方法可以帮助项目经理在制定计划和项目推进时确保一切保持井井有条。 项目管理软件是最有用的工具之一&#xff0c;通常被用于项目计划、时间管理等&#xff0c;能在…

我国近视眼的人数已经超过了六亿,国老花眼人数超过三亿人

眼镜是一种用于矫正视力问题、改善视力、减轻眼睛疲劳的光学器件&#xff0c;在我们的生活中不可忽略的一部分&#xff0c;那么我国眼镜市场发展情况是怎样了&#xff1f;下面小编通过可视化互动平台对我国眼镜市场的状况进行分析。我国是一个近视眼高发的国家&#xff0c;据统…

【MFA】windows环境下,使用Montreal-Forced-Aligner训练并对齐音频

文章目录一、安装MFA1.安装anaconda2.创建并进入虚拟环境3.安装pyTorch二、训练新的声学模型1.确保数据集的格式正确2.训练声音模型-导出模型和对齐文件3.报错处理1.遇到类似&#xff1a; Command ‘[‘createdb’,–host‘ ’, ‘Librispeech’]’ returned non-zero exit sta…

我一个普通程序员,光靠GitHub打赏就年入70万,

一个国外程序员名叫 Caleb Porzio在网上公开了自己用GitHub打赏年入70万的消息和具体做法。 Caleb Porzio 发推庆祝自己靠 GitHub 打赏&#xff08;GitHub Sponsors&#xff09;赚到了 10 万美元。 GitHub Sponsors是 GitHub 2019 年 5 月份推出的一个功能&#xff0c;允许开发…

SpringBatch简介

参考&#xff1a;https://cloud.tencent.com/developer/article/1456757简介SpringBatch主要是一个轻量级的大数据量的并行处理(批处理)的框架。作用和Hadoop很相似&#xff0c;不过Hadoop是基于重量级的分布式环境(处理巨量数据)&#xff0c;而SpringBatch是基于轻量的应用框架…

mac安装vue脚手架失败及解决方法

大家好&#xff0c;这里是 一口八宝周 &#x1f44f;欢迎来到我的博客 ❤️一起交流学习文章中有需要改进的地方请大佬们多多指点 谢谢 &#x1f64f;最近想学前端的心又开始躁动了&#xff0c;于是说干就干&#xff0c;先搞个vue脚手架谁知道上来就失败了说说我的步骤吧&#…

2017年MathorCup数学建模A题流程工业的智能制造解题全过程文档及程序

2017年第七届MathorCup高校数学建模挑战赛 A题 流程工业的智能制造 原题再现&#xff1a; “中国制造 2025”是我国制造业升级的国家大战略。其技术核心是智能制造&#xff0c;智能化程度相当于“德国工业 4.0”水平。“中国制造 2025”的重点领域既包含重大装备的制造业&…

mybatis小demo讲解(详细demo版)

这篇是mybatis的demo演示版噢&#xff0c;如果要了解理论的可以参考这篇哈mybatis从入门到精通好了&#xff0c;我们开始咯 MyBatis小demo1.简单的mybatis小案例1. 创建项目、准备环境2. mybatis的两种实现方式2.1 映射文件Mapper.xml实现1.简单的mybatis小案例 1. 创建项目、…

ESP8266与手机App通信(STM32)

认识模块 ESP8266是一种低成本的Wi-Fi模块&#xff0c;可用于连接物联网设备&#xff0c;控制器和传感器等。它具有小巧、高度集成和低功耗的特点&#xff0c;因此在物联网应用中被广泛使用。ESP8266模块由Espressif Systems开发&#xff0c;具有单芯片的封装和多种功能&#x…

Linux--磁盘存储管理 分区工具 fdisk 了解

对于磁盘存储&#xff0c;既然要管理&#xff0c;要分区&#xff0c;那必然就少不了要 分区的工具对于分区工具&#xff0c;常用的有三个&#xff0c;fdisk 、gdisk、parted ~&#xff01;&#xff01;本次&#xff0c;先介绍下 fdisk 分区工具 在介绍 fdisk 工具之前&#xff…