最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 解决 Codemirror 5 快速点击导致光标定位不准的问题

    正文概述 掘金(蛇山之巅)   2021-05-08   1334

    需求说明

    数据浏览器对象浏览页面中,鼠标随意快(慢)速点击SQL编辑区,记住鼠标最后一次点击的位置,双击左侧表名(字段名)时自动复制表名(字段名)到最后一次点击的位置。

    解决 Codemirror 5 快速点击导致光标定位不准的问题

    解决方案

    1、刚开始走了一些弯路,以为在编辑器中监听获取焦点 focus 事件记录光标最后的位置,然后在左侧双击时自动填充名称到已记录的光标处,这个的确实现了所需功能,但是在后来测试中发现如果鼠标随意快速点击编辑区,记住的最后一次光标位置并不准确,且没有任何规律性,猜测是因为点击过快 focus 监听事件无法实时记录光标位置导致的。

    2、在重新查阅官方文档 codemirror.net/ 后发现应该用 cursorActivity 监听事件: Will be fired when the cursor or selection moves, or any change is made to the editor content.(当光标或选区移动或对编辑器内容进行任何更改时,将触发该事件。) 因为官方文档是全英文的,查阅起来有点困难,费了一些时间。

    3、在 cursorActivity 事件中就可以实时记录光标的位置了,再也不用担心鼠标的任性快慢操作了,然后双击左侧名称就可以自动填充到最后一次光标记录的位置了,下面贴出部分代码片段仅供参考,需要根据自己项目情况有选择使用。

    代码片段

    codeEditor.vue 组件中:

    <template>
      <div class="code-editor-container">
        <textarea ref="mycode" v-model="curCode" class="code-w"></textarea>
      </div>
    </template>
    
    <script>
    import CodeMirror from 'codemirror/lib/codemirror'
    import "codemirror/theme/ambiance.css"
    import "codemirror/lib/codemirror.css"
    require("codemirror/mode/javascript/javascript");
    require("codemirror/mode/sql/sql");
    require("codemirror/addon/edit/matchbrackets");
    require("codemirror/addon/selection/active-line");
    require("codemirror/addon/hint/show-hint");
    require("codemirror/addon/hint/sql-hint");
    import "codemirror/addon/hint/show-hint.css"
    import sqlFormatter from "sql-formatter"
    import bus from '@/utils/bus'
    
    export default {
      components: {},
      data() {
        return {
          curCode: '',
          codeE: '',
          cmOptions: {
            value: '',
            mode: "text/x-mariadb",
            indentWithTabs: true,
            smartIndent: true,
            lineNumbers: true,
            autoRefresh: true,
            matchBrackets: true,
            styleActiveLine: true,
            lineWrapping: true,
            hintOptions: {
              completeSingle: false
            }
          }
        }
      },
      mounted() {
        this._initialize();
      },
      methods: {
        _initialize() {
          // 初始化编辑器实例,传入需要被实例化的文本域对象和默认配置
          this.codeE = CodeMirror.fromTextArea(this.$refs.mycode, this.cmOptions);
          this.codeE.on('focus', (code) => {
            // 记录光标位置的代码不写在这里
          });
          this.codeE.on('cursorActivity', (e) => {
            // console.log('eee === ', e);
            let codeData = {
              getCursor: { // 获取光标位置
                line: e.doc.getCursor().line,
                ch: e.doc.getCursor().ch
              },
              codeE: this.codeE
            };
            // console.log('codeData.getCursor === ', codeData.getCursor);
            bus.$emit('codeEditorGetCursor', codeData);
          })
        },
      }
    }
    
    

    对象浏览 objectBrowse.vue 组件中:

    bus.$on('codeEditorGetCursor', (codeData) => { // 获取编辑器焦点
      this.codeData = codeData
    });
    
    // 双击事件函数中
    let pos1 = this.codeData.getCursor;
    let pos2 = {};
    // console.log('setCode pos1 === ', pos1);
    if (pos1) {
      pos2.line = pos1.line;
      pos2.ch = pos1.ch;
      this.codeData.codeE.setCursor(pos2); // 设置光标位置
      this.codeData.codeE.replaceRange('这里是你要填充的内容', pos2) // 替换光标位置的内容
    }
    
    
    
    

    至此,实现所需需求。

    如有侵权,请联系我删除! 转载请注明出处!仅供学习交流!


    起源地下载网 » 解决 Codemirror 5 快速点击导致光标定位不准的问题

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    这个好像解决不了啊
    回复(0)

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元