当焦点在另一个输入框时,Handsontable单元格还在对焦(Handsontable cell is focusing, when focus in another input )
问题描述:
当我右键handsontable中的某一个单元格,在右键菜单里面有一项可以弹出对话框,在弹出对话框的时候使用了jquery的focus方法让我对话框中的输入框获取到了焦点,此时光标也在输入框中闪烁,当我敲击键盘输入内容时,居然直接修改了handsontbale单元格的内容。
github上相似的issue
但是当我用鼠标点击对话框的时候,我就可以正常在我的对话框中输入内容,不得不说,这很神奇,也很坑爹。
那么如何解决呢?
被handsontable虐了千百遍的我,再一次打开了handsontable的源码,近3万行的代码,每次打开都是一脸的懵逼。
首先,我用最笨的方法来定位问题所在的地方,在js文件中全局搜索有keydown事件的地方,因为不管怎样,handsontable肯定是监听了keydown事件的。
然后,打上断点,开始测试and调试,当你给handsontable打上断点后,就不难发现当你触发keydown事件的时候,会进入到哪个代码块中。
调试了几遍后,定位到了位于6633行的function onKeyDown(event)中,那么问题来了,这个事件是在哪里绑定的呢?
接着往下找,在6776行的位置,有一个document的keydown绑定,代码如下:
function init() {instance.addHook('afterDocumentKeyDown', onKeyDown);eventManager.addEventListener(document.documentElement, 'keydown', function(event) {instance.runHooks('afterDocumentKeyDown', event);});function onDblClick(event, coords, elem) {if (elem.nodeName == 'TD') {_this.openEditor();if (activeEditor) {activeEditor.enableFullEditMode();}}}instance.view.wt.update('onCellDblClick', onDblClick);instance.addHook('afterDestroy', function() {destroyed = true;});}
版本不同,可能所在的位置也会有差异,可以直接在js文件中搜索“afterDocumentKeyDown”来定位。
既然找到了,就直接改呗,怎么改呢?这又是个问题,如果直接改了事件监听,你会发现handsontable正常的输入行为也会有问题,那我们在事件触发的时候增加判断逻辑?这样的话,你又会发现handsontable的事件被我们阻止了,但是我们自己对话框的输入事件还是没有,想来想去,还是从源头修改:
既然handsontable监听了document的 keydown事件,那么我们想办法把事件监听迁移到handsontable本身不就行了?
仔细观察上面代码,不难发现,handsontable通过eventManager.addEventListener来绑定事件,我们找到这个方法所在的位置,8730行,修改绑定事件的逻辑:
addEventListener: function(element, eventName, callback) {**if(element.nodeType == 9 || (element.nodeType == 1 && (eventName == "keydown" || eventName == "keyup"))){element = this.context.rootElement ? this.context.rootElement : this.context.wtTable.wtRootElement.parentElement;}**var $__3 = this;var context = this.context;function callbackProxy(event) {if (event.target == void 0 && event.srcElement != void 0) {if (event.definePoperty) {event.definePoperty('target', {value: event.srcElement});} else {event.target = event.srcElement;}}if (event.preventDefault == void 0) {if (event.definePoperty) {event.definePoperty('preventDefault', {value: function() {this.returnValue = false;}});} else {event.preventDefault = function() {this.returnValue = false;};}}event = extendEvent(context, event);callback.call(this, event);}this.context.eventListeners.push({element: element,event: eventName,callback: callback,callbackProxy: callbackProxy});if (window.addEventListener) {element.addEventListener(eventName, callbackProxy, false);} else {element.attachEvent('on' + eventName, callbackProxy);}Handsontable.countEventManagerListeners++;return (function() {$__3.removeEventListener(element, eventName, callback);});}
好了,我们再尝试一下,是不是发现问题已经解决了,perfect!
当焦点在另一个输入框时,Handsontable单元格还在对焦(Handsontable cell is focusing, when focus in another input )相关推荐
- Java黑皮书课后题第8章:*8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1。让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了
*8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1.让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了 题目 题目描述与运行示例 破题 代码 题目 题 ...
- 【EasyExcel】EasyExcel列表填充数据时指定单元格合并
EasyExcel列表填充数据时指定单元格合并 package com.susing.security.handler;import com.alibaba.excel.metadata.CellDa ...
- ruoyi导出excel时合并单元格
ruoyi版本 3.8.2 首先第一步 增加注解 /*** 合并行* 参数1合并第一个参数为合并基准列,其他列用逗号拼接,依据基准列进行当前单元行合并 参数:如1,7, 8*/ public Stri ...
- 使用EasyExcel导出表格时合并单元格
背景 现在需要将一个导出列表数据到Excel表格的功能进行改造,将指定列相同数据自动合并单元格. 如上图所示,指定A.B两列自动合并,如图所示(6.7),(8.9),(13.14.15)要自动合并单元 ...
- 【Word / WPS文字】快速和方便地选择单个一个很小的单元格(而不是选择其中的文字)的技巧
一.问题背景 当我们需要对整个单元格进行操作(例如调整表格属性)时,需要选中这个单元格,而非其中的文字. 选单元格中的文字非常简单,选中多个位置相邻地单元格也很简单,都可以直接用鼠标左键拖拽解决. 难 ...
- EasyExcel填充时合并单元格
由于填充时第二行开始,easyexcel不会自动合并单元格,所以需要自定义handler根据上一行的合并信息自行合并 public class MyHandler extends AbstractMe ...
- POI读取excel时,单元格内容转化字符串
最近项目需要使用POI解析excel,但在获取每个单元格时,遇到了把单元格内容转为字符串过程中出现各种问题,整数类型后面带小数点.时间格式变为整数形式等等. 最后通过判断Cell的类型进行分别处理,话 ...
- java导出csv文件 为解决导出excel时每个单元格的限制(32767)
此实现方法仅供参考 因为本人导出数据量不大所采取的方法 如数据量大,会到至内存溢出请知晓 在这还提下:导出时内容自己换行 只需在内容前尾各加双引号就行. 如图: 1.准备导出工具类 // An hig ...
- 怎样移动方向键时在单元格之间移动光标
<body οnkeydοwn="mm()"> <table id=table1 border=1 cellspacing=0 width=300> < ...
最新文章
- Leetcode 173. 二叉搜索树迭代器 解题思路及C++实现
- 深入Java核心 探秘Java垃圾回收机制
- NetFramework各个版本的特性笔记
- 笨鸟学Android开发(1):HelloWorld
- 华为专家助你1个月拿下物联网高工认证,首次提供全方位就业指导!
- python中break和continue的区别_python中break和continue的区别
- PyTorch 1.9发布!移动端疯狂更新
- Coco2dx-3.0中怎样调用LUA
- 基于scikit-learn的随机森林调参实战
- c语言实现一个编译器生成语法树,运用JavaScript构造C语言子集的编译器
- cgroup学习(七)——cpu子系统
- python 协程进阶
- uipath数据爬取(结构化数据)
- NLPIR词性标记集
- CDR真实图片转水墨画效果制作教程
- 小学计算机应用技术学院官网,成都信息技术学院官网
- OpenSSL 把cer证书链以及key文件生成keystore,tomcat https配置
- ios plist文件创建和简单读写
- 构建更好Web客户端,Taylor Hughes讲述Skit框架背后的故事
- 改造一台可以计算滤芯使用寿命的智能空气净化器——嵌入式功能实现篇
热门文章
- 2021 Shopee AP( Apprentice Program)领航实习生项目(非coding方向):线上笔试总结
- 业务开发时,接口不能对外暴露该如何实现?
- 零基础入门金融风控数据分析
- 用MindNode描述了一个小项目思路
- Android Studio自带的图标以及一些免费的切图素材网页
- api查询所有记录 zabbix_利用zabbix—API查询zabbix监控项历史数据、均值、峰值详细讲解...
- [ERROR]: Kinematics solver xxx does not support joint group endeffector This plugin only support ...
- 南开大学计算机刘云,王靖-南开大学软件学院官网
- 机器学习---数学基础(一、微积分)
- stm32 独立看门狗时钟配置