js & 快捷键 & vue bind bug
js & 快捷键 & vue bind bug
how to prevent addEventListener bind many times
solution
dataset & once flag
// flag
// shortcut keys
keyboardShortcutKeys() {
    let that = this;
    let body = document.querySelector(`body`);
    let bindFlag = body.dataset.bindFlag;
    // console.log(`bindFlag =`, bindFlag);
    if (bindFlag === "true") {
        console.log(`only need binding once!`);
    } else {
        body.dataset.bindFlag = "true";
        // bind once
        body.addEventListener("keyup", function(e) {
            let key = e.which || e.keyCode;
            if(e.which === 17) {
                // init
                this.isCtrlPressed = false;
            }
        });
        body.addEventListener("keydown", function(e) {
            let key = e.which || e.keyCode;
            if(e.which === 17) {
                this.isCtrlPressed = true;
            }
            let isCtrl = this.isCtrlPressed;
            if(e.which === 83 && isCtrl) {
                console.log(`you pressed Ctrl + S`);
                if (that.onClickButton) {
                    that.onClickButton(`save`);
                } else {
                    console.log(`typeof(that.onClickButton) =`, typeof(that.onClickButton));
                    console.log(`typeof(that.xyz) =`, typeof(that.xyz));
                }
            }
            if(e.which === 68 && isCtrl) {
                console.log(`you pressed Ctrl + D`);
                if (that.clickGetNewsInfos) {
                    that.clickGetNewsInfos(`prev`);
                }
            }
            if(e.which === 70 && isCtrl) {
                console.log(`you pressed Ctrl + F`);
                if (that.clickGetNewsInfos) {
                    that.clickGetNewsInfos(`next`);
                }
            }
            if(e.which === 88 && isCtrl) {
                console.log(`you pressed Ctrl + X`);
                if (that.clickShowResureModal) {
                    that.clickShowResureModal(`passed`);
                }
            }
        });
    }
},
    // shortcut keys
    keyboardShortcutKeys() {
        let that = this;
        let body = document.querySelector(`body`);
        let bindFlag = body.dataset.bindFlag;
        // console.log(`bindFlag =`, bindFlag);
        if (bindFlag === "true") {
            console.log(`only need binding once!`);
        } else {
            body.dataset.bindFlag = "true";
            // bind once
            body.addEventListener("keyup", function(e) {
                let key = e.which || e.keyCode;
                if(e.which === 17) {
                    // init
                    this.isCtrlPressed = false;
                }
            });
            body.addEventListener("keydown", function(e) {
                let key = e.which || e.keyCode;
                if(e.which === 17) {
                    this.isCtrlPressed = true;
                }
                let isCtrl = this.isCtrlPressed;
                if(e.which === 83 && isCtrl) {
                    console.log(`you pressed Ctrl + S`);
                    if (that.onClickButton) {
                        that.onClickButton(`save`);
                    }
                }
                if(e.which === 68 && isCtrl) {
                    console.log(`you pressed Ctrl + D`);
                    if (that.clickGetNewsInfos) {
                        if (!that.isFirstNews) {
                            that.clickGetNewsInfos(`prev`);
                        } else {
                            // btn bug
                            console.log(`prev btn bug!`);
                        }
                    }
                }
                if(e.which === 70 && isCtrl) {
                    console.log(`you pressed Ctrl + F`);
                    if (that.clickGetNewsInfos) {
                        if (!that.isLastNews) {
                            that.clickGetNewsInfos(`next`);
                        } else {
                            // btn bug
                            console.log(`next btn bug!`);
                        }
                    }
                }
                if(e.which === 88 && isCtrl) {
                    console.log(`you pressed Ctrl + X`);
                    if (that.clickShowResureModal) {
                        that.clickShowResureModal(`passed`);
                    }
                }
            });
        }
    },
bug
快捷键,与浏览器自带的冲突了
- 保存CTRL + Alt + S;上一条CTRL + Alt + D;下一条CTRL + Alt + F;处理通过CTRL + Alt + X , windows 可以正常使用
 

- 保存CTRL+S;上一条CTRL+D;下一条CTRL+F;处理通过CTRL+X, MacOS 可以正常使用
 

https://codepen.io/webgeeker/full/YBPBOV
js & 快捷键 & vue bind bug的更多相关文章
- vue & lifecycle methods & this bug & ES6 Arrow function & this bind bug
		
vue & lifecycle methods & this bug ES6 Arrow function & this bind bug bad fetchTableData ...
 - iview render bug & vue namespace bug
		
iview render bug https://codepen.io/xgqfrms/pen/gyGjKP https://codepen.io/xgqfrms/full/gyGjKP bug &l ...
 - vue & less bug
		
vue & less bug bezierEasingMixin(); ^ Inline JavaScript is not enabled. Is it set in your option ...
 - vue-cli & plugin:vue/strongly-recommended bug
		
vue-cli & plugin:vue/strongly-recommended bug ESLint plugin:vue/strongly-recommended module.expo ...
 - Vue.js起手式+Vue小作品实战
		
本文是小羊根据Vue.js文档进行解读的第一篇文章,主要内容涵盖Vue.js的基础部分的知识的,文章顺序基本按照官方文档的顺序,每个知识点现附上代码,然后根据代码给予个人的一些理解,最后还放上在线编辑 ...
 - vue.runtime.esm.js:593 [Vue warn]: Invalid prop: custom validator check failed for prop "value".报错解决
		
在uni中使用 picker组件,一直报错 vue.runtime.esm.js:593 [Vue warn]: Invalid prop: custom validator check failed ...
 - js & 快捷键
		
js & 快捷键 demo js-keyboard-shortcuts.html https://codepen.io/webgeeker/pen/MLYrNq let isCtrl = fa ...
 - js原生函数bind
		
/*在javascript中,函数总是在一个特殊的上下文执行(称为执行上下文),如果你将一个对象的函数赋值给另外一个变量的话,这个函数的执行上下文就变为这个变量的上下文了.下面的一个例子能很好的说明这 ...
 - 如何在其他js 引入main.js 中 vue 的实例?
		
1.原因解析 经测试发现,代码先执行了 index.js >> main.js >> Home.vue scr/api/index.js src/main.js src/co ...
 
随机推荐
- burpsuite 抓取https 证书问题
			
一定要按照步骤来,先导入burp初始证书到服务器,这时候初始证书是未验证的,然后导出为crt/cer文件(可能拼写错误,总之是正规证书后缀),再导入到机构. 要代理所有类型包括ssl的才能正常导入机构 ...
 - DNS  DHCP   路由  FTP
			
第1章 网络基础 1.1 IP地址分类 IP地址的类别-按IP地址数值范围划分 IP地址的类别-按IP地址用途分类 IP地址的类别-按网络通信方式划分 1.2 局域网上网原理过程 DHCP原理过程详情 ...
 - asp.net core 发布到docker 极简步骤
			
1.使用dotnet命令发布项目 2.把发布成功的文件通过scp等工具发布到linux服务器上,在当前目录下新建一个dockerfile 3.使用asp.net core镜像为底包构建一个新的镜像 4 ...
 - Linux入门基础(七):Linux软件管理基础
			
源代码形式 绝大多数开源软件都是直接以源代码形式发布 源代码一般会被打包成tar.gz的归档压缩文件 程序源代码需要编译成为二进制形式之后才能够运行 源代码基本编译流程 : ./configure 检 ...
 - Unity3d — — UGUI之Box Collider自适应大小
			
NGUI下给Sprite/image添加collider后能自适应大小,但是在UGUI下Collider是默认在(0,0)位置,size为0 因此写了个简单的脚本,效果如下(最后附代码) 1.如下图添 ...
 - [Processing]在画布上写文本
			
准备工作 这一步只是我强迫症犯了哈,这个随意,画几根线而已.每一小格10个像素,中格50,大格100像素 void setup() { size(,); } void draw() { backgro ...
 - 引用“kernel32”读写ini配置文件
			
引用"kernel32"读写ini配置文件 unity ini kernel32 配置文件 引用"kernel32"读写ini配置文件 OverView ke ...
 - 拒绝滥用golang defer机制
			
原文链接 : http://www.bugclosed.com/post/17 defer机制 go语言中的defer提供了在函数返回前执行操作的机制,在需要资源回收的场景非常方便易用(比如文件关闭, ...
 - XSS跨站脚本
			
1.反射型 非持久化,需要用户自己点击才可以触发 通常出现在搜索框 <?php $id=$_GET['id']; echo $id; ?> http://127.0.0.1/test/sc ...
 - 微信公众号开发笔记1(nodejs开发)
			
本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...