如何在页面中一个一个的出现10个数,从0到9?从最简单的开始javascript
连接css
=> 稍加改进html
连接java
=> 把result 改成cssweb
连接面试
=> 一个问题:html会忽略全部的空格和回车变成一个空格,解决办法,用pre标签包起来ajax
连接promise
=> 代码虽然写到页面上了,可是没有生效,解决办法,除了在pre里面写result,同时在style标签里也写一份resultbash
连接app
到这路为止,思路就通了,咱们能够在页面中也任何css代码而且生效,code里面的代码是往页面中添加内容,style中的代码是给页面中的内容添加样式
=> 给页面中添加一些内容
但这是这样写,就同时往style标签里写文字了,怎么办?把文字用注释标记起来。那么又如何让代码高亮?好比:将html代码高亮为红色怎么办?有一个办法就是给这个html加上一个span标签,而后给sapn标签上加上内联样式。为何不能在style标签中去控制呢?选不到html这个文本,style只能操做标签。那能够<span style="color:red">html</span>
这样吗?这样是能够,可是有没有想过style标签你怎么能够加标签呢?那怎么办呢?咱们能够在code.innerHTML以后作一下替换
pre标签里还能够有标签,并且这些标签是不会当作页面内容去展现的,只会把他们当作html标签
如今咱们知道只须要给须要高亮的代码添加一个span标签再添加一个行内样式便可,那咱们得经过正则去分析哪些是选择器,很麻烦,可是不用担忧,开源世界确定已经解决了这个问题,谷歌:js Syntax Highlight,会有一个Prism.js它能把一个字符串的关键字加上span
凡是用到别人的东西,就用CRM套路
文档中说明,若是要使用Prism就要引入它的css和js
下载最小版,往下滚动有个下载js文件和下载css文件
根据文档知:咱们只要在项目里引入了Prism.js和Prism.css2个文件,而后在main.js里加上:
var text = "html{background: rgb(222,222,222);font-size: 16px;}"
var css = Prism.highlight(x, Prism.languages.javascript, 'javascript');
console.log(css)
复制代码
咱们就会发先每一个字符串都被加上了span标签
让代码高亮的代码:
var n = 0
var id = setInterval(()=>{
n+=1
code.innerHTML = result.substring(0,n)
code.innerHTML = Prism.highlight(code.innerHTML, Prism.languages.css);
style.innerHTML = result.substring(0,n)
if(n >= result.length){
window.clearInterval(id)
}
},10)
复制代码
为了显示出高的b格,咱们能够在style.css里用黑色先覆盖以前代码高亮,而后再在#style里把原来代码高亮的颜色找回来再覆盖上去,而后说:‘我须要一点代码高亮’
css代码:
breathe-div {
width: 50%;
height: 50%;
margin: 26px;
border: 1px solid #2b92d4;
cursor: pointer;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);-webkit-animation-timing-function: ease-in-out;
-webkit-animation-name: breathe;-webkit-animation-duration: 1500ms;
-webkit-animation-iteration-count: infinite;-webkit-animation-direction: alternate;
}
@-webkit-keyframes breathe {
0% {
opacity: .4;
box-shadow: 0 1px 2px rgba(0, 147, 223, 0.4), 0 1px 1px rgba(0, 147, 223, 0.1) inset;
}
100% {
opacity: 1;
border: 1px solid rgba(59, 235, 235, 0.7);
box-shadow: 0 1px 30px #0093df, 0 1px 20px #0093df inset;
}
}
复制代码
html代码:
<pre id='code' class="breathe-div"></pre>
复制代码
#code{
-webkit-transform: translateX(0%) rotateX(15deg) rotateY(15deg);
margin: 25px;
}
复制代码
//css
.breathe-div {overflow-y: scroll;}
//js
code.scrollTop = code.scrollHeight;
复制代码
function fn2() {
var paper = document.createElement('div')
paper.id = 'paper'
document.body.appendChild(paper)
}
复制代码
因为是追加内容因此不能是下面的代码,不然就把以前的全部内容都覆盖了
code.innerHTML = result.substring(0, n)
复制代码
应该是追加,是下面这样吗
code.innerHTML = code.innerHTML + result.substring(0, n)
复制代码
这样也不对,这样每次不是一只添加一个字符,而是基于上次的添加,不该该每次都从0开始,而是应该从n-1开始,每次只添加一个字符:
code.innerHTML = code.innerHTML + result.substring(n-1, n)
复制代码
合并以后的写法:
code.innerHTML = Prism.highlight(code.innerHTML + result.substring(n-1, n), Prism.languages.css)
复制代码
这样写发现有bug,由于以前的code里面的代码是已经被span包裹了(Prism作的事情),如今等于又加了一层span,怎么办呢,就是在调用fn3的时候,拿到以前的结果result并传进去,fn3用preResult接收,由于以前的结果result是没有span标签包裹的,这样Prism就能够对以前的内容加上如今追加的内容一块儿加上span并给予代码高亮
var n = 0
var id = setInterval(() => {
n += 1
code.innerHTML = result.substring(0, n)
code.innerHTML = Prism.highlight(code.innerHTML, Prism.languages.css);
style.innerHTML = result.substring(0, n)
if (n >= result.length) {
window.clearInterval(id)
fn2()
fn3(result)
}
code.scrollTop = code.scrollHeight;
}, 1)
function fn2() {
var paper = document.createElement('div')
paper.id = 'paper'
document.body.appendChild(paper)
}
function fn3(preResult) {
var result = `#paper{width: 200px;height: 200px;background: red;}
`
var n = 0
var id = setInterval(() => {
n += 1
code.innerHTML = code.innerHTML + result.substring(n-1, n)
code.innerHTML = Prism.highlight(preResult + result.substring(0, n),
Prism.languages.css);
style.innerHTML = preResult+ result.substring(0, n)
if (n >= result.length) {
window.clearInterval(id)
}
})
}
复制代码
style.innerHTML = preResult+ result.substring(0, n)
复制代码
// main.js
var result = `/*面试官你好,我是xxx
我将以动画的形式介绍本身
只用文字的形式太单调了
我就用代码来介绍吧
首先准备一些样式
*/
*{padding: 0; margin: 0;transition: all 1s;}
html{background: #1F2242;
font-size: 16px;
}
#code{background:#303030;
width: 50%;
border: 1px solid #2b92d4;
padding: 16px;
}
/*我须要一点代码高亮*/
#code{color: #75C732;}
.token.selector{color: #C39745}
.token.punctuation{color: rgba(255,255,255,.4)}
.token.property{color: #23E5E3};
.token.function{color: #EF2C1B}
/*内容多了,来个滚动条吧*/
.breathe-div {overflow-y: scroll;}
/*来点呼吸灯的效果吧*/
.breathe-div {
width: 50vw;
height: 80vh;
border: 1px solid #2b92d4;
cursor: pointer;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
-webkit-animation-timing-function: ease-in-out;
-webkit-animation-name: breathe;
-webkit-animation-duration: 1500ms;
-webkit-animation-iteration-count: infinite;
-webkit-animation-direction: alternate;
}
@-webkit-keyframes breathe {
0% {
opacity: .5;
box-shadow: 0 1px 20px rgba(0, 147, 223, 0.4), 0 1px 1px rgba(0, 147, 223, 0.1) inset;
}
100% {
opacity: 1;
border: 1px solid rgba(59, 235, 235, 0.7);
box-shadow: 0 1px 15px #0093df, 0 1px 10px #0093df inset;
}
}
/*来点动画效果吧*/
#code{
-webkit-transform: rotateX(15deg) rotateY(15deg);
margin: 25px;
}
/*下面请容许我介绍一下本身*/
/*我须要一张白纸*/
`
var n = 0
var id = setInterval(() => {
n += 1
code.innerHTML = result.substring(0, n)
code.innerHTML = Prism.highlight(code.innerHTML, Prism.languages.css);
style.innerHTML = result.substring(0, n)
if (n >= result.length) {
window.clearInterval(id)
fn2()
fn3(result)
}
code.scrollTop = code.scrollHeight;
}, 1)
function fn2() {
var paper = document.createElement('div')
paper.id = 'paper'
document.body.appendChild(paper)
}
function fn3(preResult) {
var result = ` #paper{width: 200px;height: 200px;background: red;}
`
var n = 0
var id = setInterval(() => {
n += 1
code.innerHTML = code.innerHTML + result.substring(n-1, n)
code.innerHTML = Prism.highlight(preResult + result.substring(0, n), Prism.languages.css);
style.innerHTML = preResult+ result.substring(0, n)
if (n >= result.length) {
window.clearInterval(id)
}
})
}
// style.css
.token.selector{color: black}
.token.punctuation{color: black}
.token.property{color: black}
.token.function{color: #AB2B9A}
//html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./vendor/prism/prism.css">
<link rel="stylesheet" href="./css/style.css">
<style id = 'style'></style>
</head>
<body>
<pre id='code' class="breathe-div"></pre>
<script src="./vendor/prism/prism.js"></script>
<script src="./js/main.js"></script>
</body>
</html>
复制代码
把类似的代码写成一个函数
函数fn2()和函数fn3()不属于函数writeCode的逻辑,它们要调,让它们本身调也就是后面说的回调
下面看一个问题:先往#code里面写代码然writeCode()后就再准备paper调用fn2()能够这样写吗?
writeCode(result)
console.log('开始执行fn2'); fn2()
/*将code写到#code和style标签里 */
function writeCode(code) {
let domCode = document.querySelector('#code')
let n = 0
console.log('设置闹钟')
let id = setInterval(() => {
console.log('开始写代码')
n += 1
domCode.innerHTML = Prism.highlight( code.substring(0, n), Prism.languages.css);
style.innerHTML = code.substring(0, n)
domCode.scrollTop = domCode.scrollHeight;
if (n >= result.length) {
window.clearInterval(id)
}
}, 1)
}
function fn2() {
var paper = document.createElement('div')
paper.id = 'paper'
document.body.appendChild(paper)
}
function fn3(preResult) {
var result = ` #paper{width: 200px;height: 200px;background: red;} `
}
复制代码
不行,由于writeCode()是定闹钟执行的
writeCode(),至关于如今不是当即执行全部代码,而是定个闹钟50毫秒以后开始写第一行代码, 世界上writeCode()作了这么几件事:
1.定闹钟,闹钟定完就结束了,闹钟里面的代码尚未被调,何时会被调?10毫秒以后 2.writeCode返回 3.执行fn2() 4.闹钟时间到 5.执行闹钟里面的代码,也就是往#code里写第一行代码
咱们经过打log便知道真正的顺序
fn2会在写代码以前就已经执行了,也就是尚未往#code里面写代码,页面的paper已经准备好了,这不是咱们想要的,咱们想要的是等咱们把code都写到#code里面以后才出现paper,咱们想要的之心顺序是,往#code里面把代码写完再调用fn2(),就比如是:
定闹钟明天早上6点起床() 玩游戏()
是先玩游戏仍是先起床?固然是先玩游戏,再起床
上面的函数writeCode就是一个异步的操做,由于咱们再它尚未写完代码就当即执行了函数fn2
划重点:异步就是不等结果,直接进行下一步,理解异步的精髓就是【不等结果】
那怎么解决上面的问题呢? 得经过回调来解决
再以买黄牛票为例子:
有2种情景:
1.让黄牛去买票,而后本身站着等(同步的过程) 2.让黄牛去买票(告诉黄牛,你买到票就call我),而后本身去作别的
同步的过程就是我必定要等到这个解结果,不然我就不吃饭不睡觉 而异步就是我不等结果,我先去作别的事情
精髓就是: 等结果就会同步,不等结果就是异步
你是选择哪种?固然是选择第二种
同步的好处就是必定能拿到结果可是效率会很低 异步的好处就是效率很高,可是当时是拿不到结果的(那怎么办?咱们须要把回调放到异步里),得等回调函数执行了,才能拿到结果
既然异步就是不等结果,那若是这个结果是咱们想要的结果,咱们该如何拿到这个结果?我想知道writeCode何时结束,咱们怎么知道?有一个办法回调能够
划重点: 回调能够拿到异步的结果,也能够拿到同步的结果,也就是说异步和回调能够同时出现,也能够不一样时出现,每每异步会和回调同时出现,可是不表明它们2是同一种东西,不少人搞不清楚什么是异步什么是回调,有的人把异步当成回调,也有人把回调当异步
异步的关键词:不等结果; 回调的关键词: 拿到异步结果的一种方式
若是不想等结果,可是以后又向拿到结果怎么办?答案是用回调,(告诉黄牛,你买到票就call我)这就至关于回调
划重点: 回调是拿到异步结果的一种方式,可是注意回调也能够拿同步的结果
把:告诉黄牛,你买到票就call我,这句话翻译成英文就是:when you get the ticket call me back, 回到的callback就是这么来的,由于异步的时候就至关于失去了联系,只能让黄牛拿到票的时候给咱们回电话
writeCode(result, () => {
createPaper() // 至关于黄牛回电话说买到票了
})
/*将code写到#code和style标签里 */
function writeCode(code, callback) {
let domCode = document.querySelector('#code')
let n = 0
let id = setInterval(() => {
n += 1
domCode.innerHTML = Prism.highlight(code.substring(0, n), Prism.languages.css);
style.innerHTML = code.substring(0, n)
domCode.scrollTop = domCode.scrollHeight;
if (n >= result.length) {
window.clearInterval(id)
callback.call() // 这里就至关于给黄牛打电话问是否买到票
}
}, 1)
}
function createPaper() {
var paper = document.createElement('div')
paper.id = 'paper'
document.body.appendChild(paper)
}
function fn3(preResult) {
var result = ` #paper{width: 200px;height: 200px;background: red;} `
}
复制代码
问题来了函数createPaper是异步的函数同步的? 就得看它是等结果仍是不等结果,很明显这里没有关于等的代码(如定闹钟),都是平铺直叙的因此是同步的,同步的代码也能够加回调,我么能够往createPaper()再加回调函数createPaper也就是继续往页面中添加内容
writeCode是会覆盖以前的代码的有没有办法不覆盖?
writeCode(result, () => {
createPaper(()=>{
writeCode() // writeCode是会覆盖以前的代码的有没有办法不覆盖
})
})
/*将code写到#code和style标签里 */
function writeCode(code, callback) {
let domCode = document.querySelector('#code')
let n = 0
let id = setInterval(() => {
n += 1
domCode.innerHTML = Prism.highlight(code.substring(0, n), Prism.languages.css);
style.innerHTML = code.substring(0, n)
domCode.scrollTop = domCode.scrollHeight;
if (n >= result.length) {
window.clearInterval(id)
callback.call()
}
}, 1)
}
function createPaper(callback) {
var paper = document.createElement('div')
paper.id = 'paper'
document.body.appendChild(paper)
callback()
}
function fn3(preResult) {
var result = ` #paper{width: 200px;height: 200px;background: red;} `
}
复制代码
告诉咱们一个以前的代码是什么,加一个前缀,prefix, prefix为以前往#code里面写的内容,第一次writeCode的时候prefix为空字符换,由于此时尚未往#code里面添加内容
var result2 = ` #paper{width: 200px;height: 200px;background: red;} `
writeCode('',result, () => { // 第一次writeCode的时候prefix为空字符换,由于此时尚未往#code里面添加内容
createPaper(()=>{
writeCode(result,result2)
})
})
/*将code写到#code和style标签里 */
function writeCode(prefix,code, callback) { // prefix为以前往#code里面写的内容
let domCode = document.querySelector('#code')
domCode.innerHTML = prefix || ''
let n = 0
let id = setInterval(() => {
n += 1
domCode.innerHTML = Prism.highlight(prefix + code.substring(0, n), Prism.languages.css);
style.innerHTML = prefix + code.substring(0, n)
domCode.scrollTop = domCode.scrollHeight;
if (n >= code.length) {
window.clearInterval(id)
callback.call()
}
}, 1)
}
function createPaper(callback) {
var paper = document.createElement('div')
paper.id = 'paper'
document.body.appendChild(paper)
callback()
}
复制代码
看一下代码的逻辑:
writeCode('',result, () => {
createPaper(()=>{
writeCode(result,result2)
})
})
复制代码
先去执行writeCode往页面#code中添加n内容,等writeCode执行完了以后再执行createPaper即建立一张纸,等createPaper执行完了后再执行writeCode往#code里面一行一行的添加内容,writeCode(result,result2)
这里的result必需要有,这是#code以前的全部内容必需要有,result2是基于result再往里面添加内容
再来讲下什么是异步:
function 异步作事(){
setTimeout(function(){
console.log('异步作事')
},1000)
}
function 同步作事(){
console.log('同步作事')
}
异步作事()
console.log(1)
// 因为异步作事,不等结果,因此先打1
同步作事()
console.log(1)
// 因为同步作事,等结果,全部要等作完事再执行1
// 若是是作完事再打1就是同步
// 若是事没作完就打1就是异步
复制代码
注意: 异步是拿不到结果的
var promise = $.get('./xxxx')
promise.then(success,fail)
复制代码
ajax是异步的,不等结果,直接进行下一步,n秒后拿到结果,promise不是结果而是一个承诺,承诺会拿到结果但不是如今,若是承诺兑现了就执行success,若是承诺没有执行就调fail,Promise就像打的白纸借条