花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 175|回复: 83

range进度条播放器+LRC歌词同步教程(三)

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2024-2-3 08:27 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    上一讲,《range进度条播放器+LRC歌词同步教程(二)》,我们探讨了关键帧动画的反复运行,以双动画来回替换的形式驱动歌词模拟lrc同步,但还没有加入歌词,本节就解决歌词问题、以及歌词如何真正模拟lrc同步。

    我创建的花潮格式lrc歌词数组是一个二维数组,结构如下:

    geci = [
    	[2,"歌词1",3],
    	[6,"歌词2",4.2],
    	[12.41,"歌词N",3.1]
    ];
    

    各行歌词自身就是一个数组,它有三个数组元素:第一个是数据(number)格式,记录当句歌词起唱时间(秒);第二个是字符串(string)格式,用引号包裹起来,是要显示的歌词;第三个是数据(number)格式,记录的是当句歌词用时(秒)。这些,它们是子维数组元素,是子数组,它们整体放在一个中括号 [] 内,外围中括号是父维数组。geci,是歌词数组变量名,我们要读取第一行歌词信息,就通过 geci[0] 来操作,geci[0] 将会得到 [2,"歌词1",3],,是一个数组。数组通过下标读取数字子项目的内容,下标从 0 起算,0 小标对应第一个数组元素,1对应第二个,依此类推。看下面的读取举例:

    let ar1 = geci[0]; /* ar1 会得到一个数组格式的数据 → [2,"歌词1",3], */
    let gc1 = ar1[1]; /* gc1 会得到一个字符串 → 歌词1 */
    
    /* 可以一次性读取第N句歌词(N是一个具体数字) */
    let gc2 = geci[N][1]; /* gc2 的值 → 歌词1 */
    

    对二维数组的读取,第一个下标 [N] 读到第N个子数组,第二个下标 [1] 的子数组的下标,指向子数组的第 2 个元素。

    弄懂了读取歌词机制,下来就是如何让歌词显示出来并模拟lrc同步。我们应该还有印象,audio音频控件的timeupdate事件会返回播放器的 currentTime 信息,currentTime 是音频播放器当前的播放位置(以秒计),我们就在这里做文章:在 audio 的 timeupdate 事件中,将 currentTime 和 歌词数组记录的每一句歌词的起唱时间进行比对,符合我们设定的条件就把歌词显示出来。条件怎么设定?比如现在timeupdate事件返回的currentTime为2.5秒,geci数组里头,第一句的起唱时间是2秒、说明现在正在唱“歌词1”,即将唱“歌词2”,歌词2起唱时间是6秒,待timeupdate事件返回大于等于6秒的恰那,我们就处理相关事宜让lrc元素显示歌词2、执行关键帧动画。请看代码样板来加以理解:

    /* audio timeupdate 监听事件 */
    aud.addListener('timeupdate', () => {
    	/* ... 这里是进度驱动等代码 */
    	for (let j = 0; j < geci.length; j ++) {
    		if (aud.currentTime >= geci[j][0]) {
    			/* ... 这里的代码将实现歌词显示机制 */
    		}
    	}
    });
    

    for循环放在timeupdate监听事件里,这意味着audio每返回一次 currentTime,我们都要循环一次歌词数组,然后,如上已述,我们在这里要比对 currentTime 和 geci[j][0],如果 currentTime 大于等于数组下标为 j 的子数组的起唱时间记录,就处理歌词显示及执行动画等工作。处理机制我们写成一个 showLrc(time) 函数,time 是个传参,将有 timeupdate 监听等事件传给:

    /* 声明一个全局变量 lrcKey : 用来记录处理的歌词序号 */
    var lrcKey = 0;
    
    /* 显示lrc歌词函数 */
    var showLrc = (time) => {
    	lrc.textContent = lrc.dataset.lrc = geci[lrcKey][1].replace(/<br>/, '\n'); /* ① */
    	lrc.style.setProperty('--ani', ['lrcGo0','lrcGo1'][aniIdx]); /* ② */
    	lrc.style.setProperty('--duration', time + 's'); /* ③ */
    	papa.style.setProperty('--state', 'running'); /* ④ */
    	aniIdx = aniIdx === 0 ? 1 : 0; /* ⑤ */
    	lrcKey ++; /* ⑥ */
    };
    

    函数的第 ① 行,令 lrc 的文本(lrc.textContent)和标签携带的 data-lrc 属性值都等于 geci 数组第 lrcKey 子项的第二子项 geci[lrcKey][1] 即歌词字符串,对歌词还做了替换处理,<br> 替换为换行符,这是兼顾双语歌词用的,花潮格式的歌词数组约定,双语歌词用<br>标签隔开双语歌词,而这里使用文本性质赋值给lrc标签,所以有必要转换一下(歌词中没有<br>标签不影响赋值语句的执行)。

    函数的第 ②、③、④ 行,用 setProperty 改变几个针对lrc元素和papa元素的CSS变量;① --ani 动画名称,它依据 aniIdx 变量值从数组 ['lrcGo0','lrcGo1'] 获得应执行的动画名;② --duration 歌词动画运行时长,它依据函数的唯一传参(传递过来的参数)time 赋值,time 值则是在 audio 控件的 timeupdate 监听事件中调用本函数时传来的,CSS事件变量要加上单位 s 即秒;③ 前两个针对lrc元素,最后一个针对papa元素,--state 关键帧动画运行状态,这里赋的值是 running —— 要模拟lrc歌词,动画自然要运行。

    第 ⑤ 行,处理 aniIdx 变量,该变量是变换动画名称的依据,两次间的运行不同相同,但它的值非0即1,所以用一句三元运算简洁地解决问题:当前 aniIdx 若等于 0,则它现在等于 1,否则它现在等于 0,如此就能保证两句之间运行的动画不会重复,CSS动画的反复调用就没有障碍,lrc歌词模拟才可能实现。

    最后,第 ⑥ 行,lrcKey 自增,数值变量名后面来个 ++ 等同于 数值 = 数值 + 1,用 ++ 显得更简洁。这一句至关重要,是歌词序列往后推进所在,也是 timeupdate 监听事件正常工作的依托:for循环语句里,先比对时间,时间相符后再比对当前的 lrcKey 值是否也相符,如果也相符就执行本函数,本函数完成相应工作后,令 lrcKey 加 1 ,timeupdate 监听事件在下一句歌词开唱前for循环中就不会重复比对 j 和 lrcKey 的值(重复比对就不能推进歌词序列,就像原地踏步走一样)。

    根据 lrcKey 变量和以上 showLrc(time) 函数,timeupdate监听事件此时需要加入另一个条件判断语句,currentTime 和 歌词起唱时间匹配后,将循环步进 j 和 lrcKey 变量进行比对,下面是前述 timeupdate 代码样板的改进:

    /* audio timeupdate 监听事件 */
    aud.addListener('timeupdate', () => {
    	/* ... 这里是进度驱动等代码 */
    	for (let j = 0; j < geci.length; j ++) {
    		if (aud.currentTime >= geci[j][0]) {  /* 第一个 if */
    			if (j === lrcKey) showLrc(geci[j][0]); /* 第二个 if */
    		}
    	}
    });
    

    第一个 if 语句是第一个前提,如果播放器的currentTime和歌词的起唱时间信息比对成功,则运行嵌套在里面的第二个 if 语句,第二个 if 语句拿 j 和 lrcKey 比对,若等于就运行 showLrc(time) 函数,一旦运行 lrcKey 就变为了 lrcKey + 1,这样,当句正在播放时的余下 for 循环 j 和 lrcKey 匹配不上,就不会再操作歌词显示机制,直到第一个前提再次成立、要播放唱下一句歌词,如此反复。

    lrck加1的机制解决了新的问题,同时也创造一个新的问题:一路加下去的话 lrcKey 值会大于歌词数组总数,所以我们要处理它。实际上,lrcKey 是否大于歌词总数我们都要处理的,考虑一下:我们的播放器是可以手动调整进度的,当用户调整了进度,歌词序号总得重新计算。进度调整会触发 audio 的 onseeked 事件,包括循环播放机制的重新播放也会触发此事件,所以本节,只需在 seeked 监听事件中令 lrcKey 等于 0 即可。

    下面,是时候将 range 播放器代码的时机了,以下代码,修改过的或新的代码会用红色标记,和歌词相关的地方会有简要的注释说明:

    <!--***** CSS代码 *****-->
    <style>
    	#papa { margin: auto; width: 800px; height: 360px; background: linear-gradient(tan,gray); box-shadow: 3px 3px 20px #000; position: relative; display: grid; place-items: center; }
    	#lrc { position: absolute; font: bold 2.4em sans-serif; color: lightblue; text-shadow: 1px 1px 1px rgba(0,0,0,.45); }
    	#lrc::before { position: absolute; content: attr(data-lrc); width: 100%; height: 100%; color: transparent; background: linear-gradient(rgba(250,0,0,.7),rgba(0,0,180,.8)); background-clip: text; -webkit-background-clip: text; clip-path: inset(0 100% 0 0); animation: var(--ani) var(--duration) linear forwards var(--state); border-bottom: 1px solid navy; }
    	#mplayer { position: absolute;  bottom: 20px; text-align: center; }
    	#mplayer::before { position: absolute; content: attr(data-tt); left: 0; bottom: 25px; width: 100%; text-align-last: justify; }
    	#mprog { width: 240px; accent-color: darkgreen; outline: none; cursor: pointer; }
    	#btnplay { width: 80px; height: 80px; cursor: pointer; animation: rotating 6s infinite linear var(--state); }
    	@keyframes rotating { to { transform: rotate(360deg); } }
    	@keyframes lrcGo0 { to { clip-path: inset(0 0 0 0); } }
    	@keyframes lrcGo1 { to { clip-path: inset(0 0 0 0); } }
    </style>
    
    <!--***** HTML代码 *****-->
    <div id="papa">
    	<audio id="aud" src="https://music.163.com/song/media/outer/url?id=212524" autoplay loop></audio>
    	<div id="lrc" data-lrc="HuaChao LRC">HuaChao LRC</div>
    	<div id="mplayer" data-tt="0:00 0:00">
    		<img id="btnplay" src="https://638183.freep.cn/638183/small/002_133507167677724892.png" title="播放/暂停" alt="" /><br>
    		<input id="mprog" type="range" min="0" max="100" step="any" value="0" title="调节进度" />
    	</div>
    </div>
    
    <!--***** JavaScript代码 *****-->
    <script>
    
    /* 增加两个全局变量 : aniIdx - 动画名称索引;lrcKey : 当前唱到的lrc歌词序号 */
    var mseek = false, aniIdx = 0, lrcKey = 0;
    
    /* 按钮、歌词等状态函数 :父元素 papa 掌控 --state 变量,控制歌词同步与按钮 */
    var mState = () => aud.paused ?
    	( papa.style.setProperty('--state', 'paused'), btnplay.title = '点击播放' ) :
    	( papa.style.setProperty('--state', 'running'), btnplay.title = '点击暂停' );
    
    /* 秒数变分秒函数 */
    var toMin = (val) => { if(!val) return '0:00'; var min = parseInt(val / 60), sec = Math.floor(val) % 60; if(sec < 10) sec = '0' + sec; return min + ':' + sec; };
    
    /* 显示歌词函数 :time 参数为动画运行时长 */
    var showLrc = (time) => {
    	lrc.textContent = lrc.dataset.lrc = geci[lrcKey][1].replace(/<br>/, '\n');
    	lrc.style.setProperty('--ani', ['lrcGo0','lrcGo1'][aniIdx]);
    	lrc.style.setProperty('--duration', time + 's');
    	papa.style.setProperty('--state', 'running');
    	aniIdx = aniIdx === 0 ? 1 : 0;
    	lrcKey ++;
    };
    
    /* 计算歌词索引函数 :用于 onseeked 监听事件,本节处理lrcKey归零问题,其余内容待补充 */
    var calcKey = () => lrcKey = 0;
    
    /* audio timeupdate 监听事件 */
    aud.addEventListener('timeupdate', () => {
    	if (!mseek) mprog.value = aud.currentTime / aud.duration * mprog.max;
    	mplayer.dataset.tt = toMin(aud.currentTime) + ' ' + toMin(aud.duration);
    	/* 循环歌词 */
    	for (let j = 0; j < geci.length; j ++) {
    		if (aud.currentTime >= geci[j][0]) { /* 比对当前播放位置时间和歌词起唱时间 : 若成立 */
    			if (j === lrcKey) showLrc(geci[j][2]); /* 再比对上述条件成立时的 j 和 lrcKey,成立则运行函数 show(time)驱动新歌词运行 */
    		}
    	}
    });
    
    aud.addEventListener('pause', () => mState()); /* 监听onpause事件 */
    aud.addEventListener('playing', () => mState()); /* 监听playing事件 */
    aud.addEventListener('seeked', () => calcKey()); /* 监听 onseeked 时间,重新播放时运行 calcKey() 函数重新计算 lrcKey(这里归零) */
    
    mprog.onmousedown = () => mseek = true;
    mprog.onmouseup = () => mseek = false;
    mprog.onchange = () => aud.currentTime = aud.currentTime = mprog.value / mprog.max * aud.duration;
    
    btnplay.onclick = () => aud.paused ? aud.play() : aud.pause();
    
    /* 声明歌词数组 */
    var geci = [ [2,"陈瑞 - 雨巷",4], [8,'诗 :戴望舒',6], [35.01,"撑着油纸伞",2.4], [38.31,"独自",1.9], [42.64,"彷徨在悠长 悠长",5.1], [49.9,"又寂寥的雨巷 我希望逢着",6.3], [57.11,"一个丁香一样地结着",3.1], [60.17,"愁怨的姑娘 撑着油纸伞",7.2], [68.36,"独自",2.0], [72.68,"彷徨在悠长 悠长",5.1], [79.94,"又寂寥的雨巷 我希望逢着",6.4], [87.23,"一个丁香一样地结着",2.8], [90.14,"愁怨的姑娘",3.2], [94.32,"她是有 丁香一样的颜色",5.4], [101.03,"丁香一样的芬芳 丁香一样的忧愁",6.5], [108.93,"在雨中哀怨 哀怨又彷徨",6.4], [116.95,"她彷徨在这寂寥的雨巷",6.5], [154.9,"撑着油纸伞",2.2], [158.37,"独自",1.8], [162.6,"彷徨在悠长 悠长",5.2], [169.45,"又寂寥的雨巷 我希望逢着",6.9], [177.04,"一个丁香一样地结着",3.0], [180.11,"愁怨的姑娘",3.0], [184.26,"她是有 丁香一样的颜色",5.8], [191.16,"丁香一样的芬芳 丁香一样的忧愁",7.2], [198.9,"在雨中哀怨 哀怨又彷徨",6.5], [206.94,"她彷徨在这寂寥的雨巷",6.2], [214.11,"她是有 丁香一样的颜色",5.8], [221.05,"丁香一样的芬芳 丁香一样的忧愁",7.0], [228.8,"在雨中哀怨 哀怨又彷徨",6.8], [236.59,"她彷徨在这寂寥的雨巷",7.7] ];
    
    </script>
    

    以上代码还不是range+lrc播放器的终结版,但已经可以正常运行,可以到 pencil code 运行,或存为本地html文档后运行以查看效果。

    本节理解起来有一定的难度,用心领会,做到全理解,将有助于提升解决细节问题的能力乃至编程思想,做不到全理解也没关系,学会将已经业已编写好的函数用到自己的程序中也很不错,能根据自己的需要修改一下函数则更好。下一讲,我们将完善 calcKey 函数,以便手动调整音频播放进度时lrc歌词同步能更好地工作。

    评分

    参与人数 1威望 +50 金钱 +100 经验 +50 收起 理由
    红影 + 50 + 100 + 50 赞一个!

    查看全部评分

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-2-3 10:57 | 显示全部楼层
    原来整个歌词同步的电脑一直在运算和比较着,能驱动电脑运算得到想要的歌词,黑黑太厉害了
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-2-3 11:04 | 显示全部楼层
    let gc2 = geci[N][1]; 以前对这样的读取方式不熟,看了帖子明白了,原来第一个下标是按次序去找到那个想要的数组,第二个下标进一步告诉想要数组里的谁。就像将军发令:来呀,去把第二排的第三个士兵给我抓来,那家伙敢瞪我。数组就是那一排排的士兵,当然,他们只有3列
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-12-15 11:29
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    824

    主题

    811

    回帖

    3万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪奔放热烈春风拂面缤纷心情王者至尊大将风范金剪刀音画大师天籁妙音妙笔生花

    发表于 2024-2-3 11:14 | 显示全部楼层
    太详细了,老师懂得太多了,我们只会吃现成的饭!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-2-3 11:21 | 显示全部楼层
    两个嵌套的 if 语句很巧妙,不管是风动心动,第一个动,第二个必须动,而且第二个瞬生瞬死。保证了歌词能在自己的时间段里被留在那,时间一到就走人。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-2-3 12:18 | 显示全部楼层
    红影 发表于 2024-2-3 10:57
    原来整个歌词同步的电脑一直在运算和比较着,能驱动电脑运算得到想要的歌词,黑黑太厉害了

    编程就是做算法,广义的算法指设计好机制后布置代码,将代码交给计算机执行。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-2-3 12:18 | 显示全部楼层
    红影 发表于 2024-2-3 11:04
    let gc2 = geci[N][1]; 以前对这样的读取方式不熟,看了帖子明白了,原来第一个下标是按次序去找到那个想要 ...

    理解正确
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-2-3 12:19 | 显示全部楼层
    亚伦影音工作室 发表于 2024-2-3 11:14
    太详细了,老师懂得太多了,我们只会吃现成的饭!

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-2-3 12:19 | 显示全部楼层
    红影 发表于 2024-2-3 11:21
    两个嵌套的 if 语句很巧妙,不管是风动心动,第一个动,第二个必须动,而且第二个瞬生瞬死。保证了歌词能在 ...

    机巧,紧凑
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-2-3 14:12 | 显示全部楼层
    马黑黑 发表于 2024-2-3 12:18
    编程就是做算法,广义的算法指设计好机制后布置代码,将代码交给计算机执行。

    而计算机能一丝不苟地直行好每个代码要求
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-2-3 14:12 | 显示全部楼层

    机制理解了,还需要记住这个顺序是从0开始的,不是从1.
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-2-3 14:13 | 显示全部楼层

    嵌套通常不容易懂,却是非常技巧
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-2-3 17:41 | 显示全部楼层
    红影 发表于 2024-2-3 14:13
    嵌套通常不容易懂,却是非常技巧

    条件语句的嵌套,就是一层限制一层,外层条件符合,里头那层才会检测
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-2-3 17:41 | 显示全部楼层
    红影 发表于 2024-2-3 14:12
    机制理解了,还需要记住这个顺序是从0开始的,不是从1.

    数组元素下标从零起算,这个应该知道了的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-2-3 17:46 | 显示全部楼层
    红影 发表于 2024-2-3 14:12
    而计算机能一丝不苟地直行好每个代码要求

    具体地说,是计算机按编好的预设去一步一步执行。JS是单线程执行任务,它确实会一丝不苟地去执行预设程序,然后可能会卡壳(术语叫阻塞),就会出错,所以复杂机制的程序设计里,需要编程人员知道会不会阻塞、用不用异步编程。我们加载第三方外部JS资源时,用 onload 事件就属于异步执行该事件内的代码,就是说,要加载的文档必须加载好后再运行onload事件内的代码,加载资源和执行事件内代码有个时间差,这就是异步。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-2-3 18:24 | 显示全部楼层
    马黑黑 发表于 2024-2-3 17:41
    条件语句的嵌套,就是一层限制一层,外层条件符合,里头那层才会检测

    嗯嗯,记得你讲过的。这里打算是复习呢
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-2-3 18:25 | 显示全部楼层
    马黑黑 发表于 2024-2-3 17:41
    数组元素下标从零起算,这个应该知道了的

    知道,我是提醒自己必须记着
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-2-3 18:26 | 显示全部楼层
    马黑黑 发表于 2024-2-3 17:46
    具体地说,是计算机按编好的预设去一步一步执行。JS是单线程执行任务,它确实会一丝不苟地去执行预设程序 ...

    这个时间差感觉不到的吧。而实际加载是有先后顺序的
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-2-3 19:43 | 显示全部楼层
    红影 发表于 2024-2-3 18:26
    这个时间差感觉不到的吧。而实际加载是有先后顺序的

    不去处理它就能明显感觉得到:它因为出错不工作了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-2-3 19:44 | 显示全部楼层
    红影 发表于 2024-2-3 18:25
    知道,我是提醒自己必须记着

    这个不必要提醒的,这是规定
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-16 04:51 , Processed in 0.082960 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表