从张鑫旭大佬文章中发现了我前端知识的匮乏
大厂技术 高级前端 Node进阶
点击上方 程序员成长指北,关注公众号
回复1,加入高级Node交流群
最近翻看张鑫旭大佬的博客,发现了一篇叫《前端原生API实现条形码二维码的JS解析识别》[1]的文章,觉得很不错,于是就把大佬的代码拷贝下来学习了下,结果就是看的我一脸懵,自信息大大受打击了。痛定思痛,于是把其中觉得有意思的地方记录下,整理成此文。
我们先看下页面是怎么样的:
功能很简单,就是复制下面的二维码图片,然后粘贴到文本框中,最后点击识别按钮,把识别二维码的结果展示到下面。
源代码:
js
复制代码
qrcode 方便大家复制的示意图:
背景交代完成,现在就一点一点的来分析其中代码的精妙之处。
CSS部分
tabindex = -1
js
复制代码
当我看到tabindex这个属性时,完全不知道它的用法,于是我继续在张鑫旭大佬的博客中搜索,找到一篇叫《HTML tabindex属性与web网页键盘无障碍访问》[2]的文章,这里简要说下这个属性的用法和作用。
tabindex属性是一个全局属性,也就是所有 HTML 标签都可以用的属性,比方说id,class属性等。所以,可以在div上使用。同时,这个属性是一个非常老的属性,没有兼容性问题,放心使用。
tabindex属性是一个与键盘访问行为息息相关的属性。平常可能感觉不到它的价值,但是一旦我们的鼠标坏掉了或者没电了,我们就只能使用键盘。亦或者在电视机上,或者投影设备上访问我们的网页的时候,我们只能使用遥控器。就算设备都完全正常,对于资深用户而言,键盘访问可以大大提高我们的使用效率。
当一个元素设置tabindex属性值为-1的时候,元素会变得focusable,所谓focusable指的是元素可以被鼠标或者JS focus,在 Chrome 浏览器下表现为会有outline发光效果,IE浏览器下是虚框,同时能够响应focus事件。默认的focusable元素有, , 。
但是,tabindex = -1不能被键盘的tab键进行focus。这种鼠标可以focus,但是键盘却不能focus的状态,只要tabindex属性值为负值就可以了。
因此,我们可以设置div被focus的样式,当鼠标点击div时,我们可以改变它的边框,如下:
js
复制代码
.area:focus {border-style: solid;} tabindex属性值是一个整数,它来决定被tab键focus的顺序,顺序越小越先被focus,但是 0除外,如下div被focus的顺序依次是:1,2,3。
js
复制代码
那tabindex="0"又是怎么回事呢?
元素设置tabindex="-1",可以鼠标和JS可以focus,但键盘不能focus;
tabindex="0"和tabindex="-1"的唯一区别就是键盘也能focus,但是被focus的顺序是最后的。或者你可以这么理解,设置了tabindex="0",从键盘访问的角度来讲,相对于元素变成了元素。
垂直居中
垂直居中是一个常用的需求了,我经常使用flex来完成:
js
复制代码
display: flex;
align-items: center;
justify-content: center; 在大佬的文章中使用了一个新的用法:
js
复制代码
display: grid;
place-items: center; place-items 属性是以下属性的简写:align-items、justify-items。
:empty::before
当div元素没有内容时,.area:empty样式会生效,同时为了显示一段提示内容,使用了伪元素::before,在content写入提示内容。
js
复制代码
.area:empty::before {content: '或粘贴图片到这里';color: gray;
} JS部分
copy paste 事件
js
复制代码
document.addEventListener('paste', function (event) {var items = event.clipboardData && event.clipboardData.itemsvar file = nullif (items && items.length) {// 检索剪切板itemsfor (var i = 0; i < items.length; i++) {if (items[i].type.indexOf('image') !== -1) {file = items[i].getAsFile()break}}}// 此时file就是剪切板中的图片文件if (file) {reader.readAsDataURL(file)}
}) 这两个事件都属于ClipboardEvent事件(剪切板事件) ,还有一个cut剪切事件。
js
复制代码
wrap.oncopy = function(event){}
wrap.oncut = function(event){}
wrap.onpaste = function(event) {} 任何软件上的内容,可以被复制粘贴,是因为软件对操作系统复制粘贴操作的实现,软件都会把复制剪切的内容存入操作系统的剪切板上。同样,浏览器也对操作系统的剪切板进行了实现,属于浏览器的自身的实现。
浏览器复制操作的默认行为是触发浏览器的 copy 事件,将 copy 的内容存入操作系统的剪切板中。
那如何干预浏览器的这种默认的复制粘贴操作呢?
可以通过event.preventDefault阻止事件的默认行为,即当触发这三个事件时,阻止对系统剪切板的数据操作。然后,我们对数据进行加工后,重新写入到剪贴板。
比如,当用户复制我们网站的内容时,可以在数据后面加一个版权的相关信息。
js
复制代码
这是复制的复制内容 ClipboardEvent 事件有个最重要的属性clipboardData,该属性值是DataTransfer对象,这个对象在拖拽场景中经常使用,后面会专门写一篇文章来说说这个对象。
new BarcodeDetector解析二维码
js
复制代码
// 创建检测器
const barcodeDetector = new BarcodeDetector({formats: ['qr_code']
})
barcodeDetector.detect(eleImg).then(barcodes => {console.log('barcodes', barcodes)barcodes.forEach(barcode => {result.innerHTML = `解析成功,结果是:${barcode.rawValue}`})}).catch(err => {result.innerHTML = `解析出错:${err}`}) 浏览器提供了原生的API来解析二维码和条形码,即 Barcode Detection API。
formats表示要解析那种码,如下图所示:
总结
通过学习上面的代码,可以发现自己在 css,js 方面上的不足,原因是缺乏探索性,老是用已有的知识来解决问题,或者直接去 github 上找第三方库,其实可以使用最简单的方式实现。
作者:小p
链接:https://juejin.cn/post/7248874230862233655
来源:稀土掘金
结语
Node 社群
我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。

“分享、点赞、在看” 支持一下
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
