【问题标题】:Firing event when caret moves between lines in textarea当插入符号在 textarea 中的行之间移动时触发事件
【发布时间】:2011-11-17 16:20:22
【问题描述】:

如果用户更改插入符号所在的行(例如,通过单击或使用向上/向下箭头),是否有办法让 textarea 触发事件?或者这在 Javascript 中是不可能的?我找到了查找/设置插入符号当前位置的方法,但这不是我需要的......

【问题讨论】:

  • @AndyE \n 与用户在文本区域中看到的行之间存在相当大的差异。例如,这条评论没有一个换行符,但我已经在 textarea 的第三行了 :)
  • @Esailija:OP 对我们来说不够具体,但值得标记以防万一他正在寻找。这就是为什么评论说“可能重复...”
  • 抱歉含糊不清。我的意思是“\ n”。不,我不相信我的问题是“查找当前行的值”问题的重复:我需要一些能够触发事件并更改页面上的某些内容以响应用户移动到不同行的内容。
  • 我为我的问题中的任何愚蠢表示歉意:我几乎是一个 Javascript 的新手,尽管我是一个非常有经验的其他语言程序员。事实上,在我花更多时间学习 Javascript 之前,我主要是想看看这是否可行。

标签: javascript events textarea


【解决方案1】:

听起来您需要为您的文本区域注册几个事件。在我的脑海中,一个点击事件和一个具有多个键码值的按键事件。您需要使用纯 javascript,还是有一些 javascript 库可以使用?

您需要帮助注册活动吗?或者您需要帮助在其中一项活动中找到插入符号的位置吗? (请参阅安迪的链接)或者我的两个问题的答案都是“是”?


编辑

好的,因为你是 cmets,所以你可以使用 jquery,fieldselection 插件可以防止你重新发明轮子。

  1. 识别任何键盘键、鼠标点击、复制粘贴?可以在文本字段中移动插入符号的事件。 Navigate and select portions of text, wikipedia
  2. 在活动期间,使用 fieldselection 插件获取新的插入符号位置。
  3. 使用当前插入符号位置 && 字体大小 && 文本框物理大小 && 换行数来确定您是否已切换到新行。
  4. 如果您确实切换了行,请触发自定义 jQuery 事件来完成您想要的工作。

//jQuery 1.7

$(document).ready(function(){
  var currentLine = -1;
  $("#textAreaID").on("keypress", function(evt){
   if(evt.which === 40 || ...){
//down arrow key, enter key, page down key, all will move the caret to a newline
     $(this).trigger("newline");
   }else{
//a ton of text in a fixed width textarea will move the cursor to a newline
     $(this).trigger("checkForNewline");
   }
  }).on("click checkForNewline", function(evt){
    var jqElem = $(this);
//fieldSelection plugin call
    var range = jqElem.getSelection();
    if(range["row"] && range["row"] !== currentLine){
      currentLine = range["row"];
      jqElem.trigger("newline");
   }else{
      var handTypedNewlines = jqElem.val().split(/\r\n|\r|\n/);
      var userTypedRowcounts = Math.floor(wholeString.length / jqElem.cols) + (handTypedNewlines instanceof 'object')?handTypedNewlines.length:0;
      if(userTypedRowcounts != currentLine){
         currentLine = userTypedRowcounts;
         jqElem.trigger("newline");
      }
   }
  }).on("newline", function(evt){
   // do your work, caret is on a newline.
  });
});

引用的堆栈溢出。

reference to get .split() regex

【讨论】:

  • 看我上面的 cmets... 所以,听起来应该是可行的,方法是跟踪点击和按键,然后比较上一行和当前行,看看是否有变化吗?一旦我看到策略,我应该能够弄清楚。
  • 是的,我对图书馆没有异议。我几乎肯定会在项目的其他方面使用 jQuery(如果我选择将其作为 web 应用程序......)
  • @dinkorlitz 查看我为我认为需要做的事情所做的修改。
  • 太棒了!谢谢。当我处理项目的那一部分时,将保留您的代码。
猜你喜欢
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
相关资源
最近更新 更多