JavaScript方法无法识别HTML实体编码,吉他指板工具升降音切换遇阻
解决吉他指板工具升降音切换的HTML实体识别问题
问题根源
你切换升音时用includes('U+0266D;')判断完全错误——浏览器会把HTML实体♭解析成实际的降号字符♭(Unicode编码U+266D),此时ball.innerHTML里存的是这个字符本身,而非实体字符串,所以用实体编码或Unicode格式字符串去匹配肯定找不到。
修复方案
直接用实际的降号字符♭做判断,同时优化升音切换逻辑,还原回带#的音符:
function nextChar(char) { return String.fromCharCode(char.charCodeAt(0) + 1); } function prevChar(char) { return String.fromCharCode(char.charCodeAt(0) - 1); } flatNote.addEventListener('click', flatFunc); function flatFunc() { ballArray.forEach(function(ball) { // 带#的音符转降音:比如G# → A♭ if (ball.innerHTML.includes('#')) { const baseNote = ball.innerHTML.replace('#', ''); ball.innerHTML = nextChar(baseNote) + '♭'; } // 处理特殊情况H → A♭(德语体系里H对应B) if (ball.innerHTML === 'H') { ball.innerHTML = 'A♭'; } }); } sharpNote.addEventListener('click', sharpFunc); function sharpFunc() { ballArray.forEach(function(ball) { // 直接判断降号字符♭ if (ball.innerHTML.includes('♭')) { const baseNote = ball.innerHTML.replace('♭', ''); // 降音转回升音:比如A♭ → G# ball.innerHTML = prevChar(baseNote) + '#'; } // 特殊情况还原:A♭ → H if (ball.innerHTML === 'A♭') { ball.innerHTML = 'H'; } }); }
关键优化点
- 直接用实际字符
♭判断,避开HTML实体解析的坑 - 拆分音符的基础字符和修饰符(#/♭),逻辑更清晰,避免
nextChar直接处理带修饰符的字符串 - 还原
prevChar函数,用于从降音反向推导升音
内容的提问来源于stack exchange,提问作者Steven Brooks
相关产品推荐
相关产品推荐

