开发中遇到的问题
移动端兼容问题
1.上传音频的兼容问题
accept 只设置audio/*
,ios 无法选取音频文件
实验发现设置 accept="audio/*, .mp3, .wma, .amr, .wav, .m4a"
,可以兼容 ios 和安卓选取这些音频文件(wma 还是无法选取)
播放兼容情况
场景:通过input
框选取本地音频文件后得到的file
对象,URL.createObjectURL(file)
得到本地文件播放地址 播放器:原生audio
标签
mp3 文件:安卓选取的文件必须带有扩展名,否则file.type
为空、file.name
是文件命本身(没有扩展名) m4a 文件:,安卓、ios 均不支持播放,有可能是URL.createObjectURL(file)
转换后造成的问题
html
<!--安卓可以播放远端的m4a文件,ios不支持-->
<audio class="audio-box" controls autoplay crossorigin="anonymous">
<source src="xxx.m4a" type="audio/mp4" />
</audio>
- wma 文件: ios 无法选取该类型文件,(accept 属性设置了无效,暂时不知道原因)
文件.amr 与 .wav 暂时没有遇到兼容的问题
移动端相关
组件更新问题
在一次做动画跳跃的时候, 每次跳跃需要为空
js
el.style.animation = "";
el.style.animationFillMode = "";
但是 🈶 需要重新设置回来,让其再次跳跃
js
el.style.animation = "jump 1s linear";
el.style.animationFillMode = "both";
这里有一个坑
js
el.style.animation = "";
el.style.animationFillMode = "";
console.log(123);
el.style.animation = "jump 1s linear";
el.style.animationFillMode = "both";
这样子操作会跳跃正常, 触发更新样式 2 次, 因为 console.log 具有 debugger 类似的功能, 让下面内容暂停执行 但是, 如果去掉 console.log,也就是
js
el.style.animation = "";
el.style.animationFillMode = "";
el.style.animation = "jump 1s linear";
el.style.animationFillMode = "both";
这样子的话,跳跃异常, 因为只会触发一次样式更新, 如果没有清空这个 animation, 样式将不发生改变, 页面不会触发更新。
我的做法
因为我们要触发更新, 使 animation 样式发生变化,因此, 每次需要跳跃的时候, 让动画名字发生变化,这样就可以使 animation 样式发生变化,即如下代码展示:
js
// 用时间搓保证每次的动画名都会不重复
const animationName = `animation-${+new Date()}`;
el.style.animation = `${animationName} 1s linear`;
任务的并行处理
js
const task1 = () => {
console.log("task1");
};
const task2 = () => {
console.log("task2");
};
const task3 = () => {
console.log("task3");
};
const task4 = () => {
console.log("task4");
};
function cb() {
console.log("最后才执行的回调");
}
const taskQueue = [];
const maxCount = 2; // 最大运行数量
let runningCount = 0; // 正在运行的数量
// 添加任务
function addTask(fn, time, isFinish) {
const task = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
fn();
resolve(isFinish);
}, time);
});
};
taskQueue.push(task);
}
// 执行任务
function executeTask(callback) {
if (!taskQueue.length || runningCount > 2) return;
runningCount++; // 每执行一个任务++
const task = taskQueue.shift(); // 取出任务, task是一个函数(shift删除最前面一个, 并返回删除的元素)
task().then((isFinish) => {
// .then拿到是否结束
if (isFinish) {
// 结束后我们才执行回调
callback();
return;
}
// then后,说明执行完毕 runningCount --
runningCount--;
executeTask(callback); // 没结束, 执行下一个任务
});
}
function collectTask() {
addTask(task1, 1000, false);
addTask(task2, 3000, false);
addTask(task3, 1000, false);
addTask(task4, 5000, true);
}
// 收集任务
collectTask();
// maxCount === 2
for (let i = 0; i < maxCount; i++) {
console.log(123);
executeTask(cb);
}
我们可以通过上述代码,来并行处理自己的逻辑
地址组件获取上级 code 问题
问题描述
js
const arr = [
{
code: "110000",
name: "北京市",
children: [
{
code: "110100",
name: "市辖区",
children: [
{
code: "110101",
name: "东城区",
},
],
},
],
},
];
const targetCode = "110101";
// 问:如何根据 targetCode 这个字符串找到 arr 数组对应的上级所有的 code, 最终输出['110000',110100,110101']
实现
js
function findCode(codeToFind, arr, path = []) {
for (const item of arr) {
// 当前路径加上当前项目的code
const currentPath = path.concat(item.code);
// 检查当前项目的code是否是我们要找的code
if (item.code === codeToFind) {
// 如果找到了,返回当前路径
return currentPath;
}
// 如果当前项目有子项,递归搜索子项
if (item.children) {
const result = findCode(codeToFind, item.children, currentPath);
// 如果在子项中找到了结果,提前返回结果
if (result) {
return result;
}
}
}
// 如果没有找到匹配项,结果会是undefined
return undefined;
}
⭐️⭐️⭐️ 好啦!!!本文章到这里就结束啦。⭐️⭐️⭐️
✿✿ ヽ(°▽°)ノ ✿
撒花 🌸🌸🌸🌸🌸🌸