Q1. 在 JavaScript 中,如何求出两个数组的交集和差集
let a = [1, 2, 3];let b = [3, 5, 2]; // 并集let unionSet = new Set([...a, ...b]);//[1,2,3,5]// 交集let intersection = a.filter(v => b.includes(v))// [2,3]// ab差集let difference = a.concat(b).filter(v => !a.includes(v) || !b.includes(v))// [1]
Q2.利用js、css来实现模糊图片先加载后加载高清图
.box{ position: relative;overflow: hidden;height: 300px;width: 300px;}.box img{ width: 100%;height: 100%;}.box .bg{/*缩略图*/ display: block;filter: blur(15px);transform: scale(1);}.box .show_img{/*加载完成显示的实际图*/ position: absolute;opacity: 0;top: 0;left: 0;transition: opacity 1s linear;}<div class="box"> <img src="" class="bg"/> <img src="" class="show_img"/> </div><script>var show_img=document.querySelector('.show_img'),/*图片加载完成*/ show_img.onload = function () { show_img.style.opacity="1";};</script>
Q3.利用Canvans将两张图片合成一张图片
/* 图片的跨域头都必须设置(access-control-allow-origin: *) */ var url = "http://cdn.shareitgames.com/images/gameenroll/01.webp";var picSrc = "http://cdn.shareitgames.com/images/gameenroll/01.webp";const loadImg = src => { const paths = Array.isArray(src) ? src : [src]; // console.log(paths) const promise = []; var i=0; paths.forEach(path => { i++; promise.push( new Promise((resolve, reject) => { var that =this; var timeStamp = +new Date(); let img = new Image(); img.setAttribute('crossOrigin', 'anonymous'); if (i==1) { img.src = that.picSrc; } else { img.src = path; } img.onload = () => { resolve(img); }; img.onerror = err => { console.log("图片加载失败"); }; }) ); }); console.log(promise) return Promise.all(promise); }; const getImageData = (url, src) => { // const imgsrc = qrcode.getQrBase64(url); // 如果为二维码,使用此方法,并下载依赖包(npn install --save jr-qrcode) const imgsrc = url; let canvas = document.createElement("canvas"); const width = document.documentElement.clientWidth; const height = document.documentElement.clientHeight; canvas.width = width * 2; canvas.height = height * 2; let ctx = canvas.getContext("2d"); loadImg([imgsrc, src]).then(([img1, img2]) => { ctx.drawImage(img2, 0, 0, width * 2, height * 2); ctx.drawImage(img1, width - 80, height * 2 - 220, 200, 160); let imageURL = canvas.toDataURL("image/png"); document.getElementById("mix_img").setAttribute("src", imageURL); }); }; getImageData(this.picSrc,this.url)
Q4.解决当前网页多个视频,播放当前视频暂停其余视频
var videos = document.getElementsByTagName('video');for (var i = videos.length - 1; i >= 0; i--) { (function(){ var p = i; videos[p].addEventListener('play',function(){ pauseAll(p); }) })()}function pauseAll(index){ for (var j = videos.length - 1; j >= 0; j--) { if (j!=index) videos[j].pause(); }};
Q5.获取前20周的周五日期
function getBeforeDate(n){ var date = new Date() ; var year,month,day ; var s = ''; date.setDate(date.getDate()-n); year = date.getFullYear(); month = date.getMonth()+1; day = date.getDate() ; s = year + '-' + ( month < 10 ? ( '0' + month ) : month ) + '-' + ( day < 10 ? ( '0' + day ) : day) ; return s ;};var now = new Date(); //当前日期var nowDayOfWeek = now.getDay()-1; //今天本周的第几天for (var i=0;i<20;i++) { var day = (i+1) * (nowDayOfWeek+3) + i + i*3; // 当天距离上周周五的天数 console.log(getBeforeDate(day));};
Q6.将时间戳转换成“几分钟前”“几小时前”“几天前”….的等格式
npm install timeago.js || cnpm install timeago.jsimport { format, render, cancel, register } from 'timeago.js';format('2019/08/30 12:30:00', 'zh_CN', new Date())// 列如<span class="needs_to_be_rendered" :datetime="date2"></span>var nodes = document.querySelectorAll('.needs_to_be_rendered');render(nodes, 'zh_CN') //使用render方法实时渲染节点timeago.cancel() // 取消所有实时渲染任务timeago.cancel(nodes[0]) // 取消特定的实时渲染
Q7.不重复的随机数
function createRandom2(num , from , to){ var arr=[]; var json={}; while(arr.length<num) { //产生单个随机数 var ranNum=Math.ceil(Math.random()*(to-from))+from; //通过判断json对象的索引值是否存在 来标记 是否重复 if(!json[ranNum]) { json[ranNum]=1; arr.push(ranNum); } } return arr; };alert(createRandom2(4,0,19));//生成4个从0-20之间不重复的随机数
Q8.倒计时
<div> <span id="_d">00</span> <span id="_h">00</span> <span id="_m">00</span> <span id="_s">00</span> <span id="_ms">00</span></div>function countTime() { var date = new Date(); var now = date.getTime(); var endDate = new Date("2019-10-24 16:55:00");//设置截止时间 var end = endDate.getTime(); var leftTime = end - now; //时间差 var d, h, m, s, ms; if(leftTime >= 0) { d = Math.floor(leftTime / 1000 / 60 / 60 / 24); h = Math.floor(leftTime / 1000 / 60 / 60 % 24); m = Math.floor(leftTime / 1000 / 60 % 60); s = Math.floor(leftTime / 1000 % 60); ms = Math.floor(leftTime % 1000); if(ms < 100) { ms = "0" + ms; } if(s < 10) { s = "0" + s; } if(m < 10) { m = "0" + m; } if(h < 10) { h = "0" + h; } } else { console.log('已截止') } //将倒计时赋值到div中 document.getElementById("_d").innerHTML = d + "天"; document.getElementById("_h").innerHTML = h + "时"; document.getElementById("_m").innerHTML = m + "分"; document.getElementById("_s").innerHTML = s + "秒"; // document.getElementById("_ms").innerHTML = ms + "毫秒"; //递归每秒调用countTime方法,显示动态时间效果 setTimeout(countTime, 50); } countTime();
Q9.给当前url添加参数
var newurl = updateQueryStringParameter(window.location.href, 'sp', '2');//向当前url添加参数,没有历史记录window.history.replaceState({ path: newurl}, '', newurl);function updateQueryStringParameter(uri, key, value) { if(!value) { return uri; } var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); var separator = uri.indexOf('?') !== -1 ? "&" : "?"; if (uri.match(re)) { return uri.replace(re, '$1' + key + "=" + value + '$2'); } else { return uri + separator + key + "=" + value; }}
Q10.js监听客户端内嵌h5页面切至后台应用
window.addEventListener("visibilitychange", function (event) { event.preventDefault(); // 可以干别的事})
Q11.关于emoji转换
function transEmoji(str) { var patt=/[\ud800-\udbff][\udc00-\udfff]/g; // 检测utf16字符正则 str = str.replace(patt, function(char){ var H, L, code; if (char.length===2) { H = char.charCodeAt(0); // 取出高位 L = char.charCodeAt(1); // 取出低位 code = (H - 0xD800) * 0x400 + 0x10000 + L - 0xDC00; // 转换算法 return "&#" + code + ";"; } else { return char; } }); return str;}console.log(transEmoji('🤪')) //🤪** emoji码位都是U+1F92A这个样子,可以写为 \u{1F92A} 这样就可以直接在标签中使用显示emoji表情