javascript - 如果所选文本在输入范围内,则触发输入事件的功能

标签 javascript jquery

我已经 built a page 您可以在其中通过在输入框中键入内容来过滤结果。

基 native 制是:

  • 开始输入,触发输入事件,没有匹配文本的元素开始隐藏
  • 如果输入变空(或者如果您单击重置按钮),所有元素将再次显示

不过,在突出显示文本时,我注意到了一个问题。假设我在输入中输入“apple”。然后我突出显示它,并输入“橙色”。

如果页面上存在包含“orange”的元素,但由于我过滤了“apple”,它已被隐藏,它不会显示。我收集到这是因为输入永远不会真正清空;相反,在继续使用“r-a-n-g-e”之前,我只是将“apple”替换为 orange 中的“o”。这意味着我得到了包含“orange”的“apple”结果子集,就好像我输入了“apple orange”一样。

我真正想做的是在隐藏不匹配的元素之前清除“orange”中“o”的按键输入,这样我就可以有效地在整个页面中搜索“orange”。

到目前为止我尝试了什么

1:在 select 事件上将输入值设置为 '':

$('.myinput').on('select', function(){
  $(this).val('');
});

这不起作用,因为它只是删除了我突出显示的文本,这是意外的。我只想在突出显示后重置按键上的输入。

2:在我的输入事件中包含一个 if 语句,检查输入中是否有选择:

$('.myinput').on('input', function(){
  var highlightedText = window.getSelection();

  if($(highlightedText).parent('.myinput')) {
    //reset my input
  }
});

这不起作用,因为它似乎在每次按键时都会触发,无论是否有任何实际选择。 (用户输入是否始终被视为选中?)

3:给input元素添加一个select事件监听器,如果有选择则设置一个变量为true。然后,在我的输入事件中,检查按键时变量是否为真。

$(function(){
  var highlightedText = false;

  $('.myinput').on('input', function(){
    if(highlightedText = true) {
      //reset my input
    }

    //do stuff

    highlightedText = false;
  });

  $('.myinput').on('select', function(){
    highlightedText = true;
  });
});

我真的认为这个会起作用,因为选择功能中的基本控制台日志只会在我想要的时候触发——当输入中的文本被突出显示时,但不会在其他文本被突出显示时,而不是当文本被突出显示时进入输入。但是,遗憾的是,当我将其更改为可变切换时,它似乎再次在每次按键时触发。

所以问题是:如何仅当输入中的文本被突出显示时才触发输入函数?

我找到了 this question这表明绑定(bind)到 mouseup 事件,但是当我只担心一个非常特殊的情况时,检查每一次点击似乎有点过分了。此外,该解决方案依赖于 window.getSelection(),到目前为止它对我不起作用。

我还找到了 another question这建议使用 window.selectionEnd 而不是 window.getSelection() 因为我正在处理文本输入。我尝试将其合并到上面的选项 2 中,但它似乎也会在每次按键时触发,而不是在突出显示时触发。

最佳答案

这个答案根本不是关于文本选择的。

但是当高亮文本被新输入替换时,仍然可以解决重新过滤文本的问题。

var input = document.getElementById('ok');
var character = document.getElementById('char');
var previousCount = 0;
var currentCount = 0;

input.addEventListener('input', function(){
    currentCount = this.value.length;
    if (currentCount <= previousCount){
        /*
            This will detect if you replace the highlighted text into new text.
            You can redo the filter here.
        */
        console.log('Highlighted text replaced with: ' + this.value);
    }
    previousCount = currentCount;
    char.innerHTML = this.value;
});
<input type="text" id="ok">

<div id="char"></div>

关于javascript - 如果所选文本在输入范围内,则触发输入事件的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45381083/

相关文章:

jquery - 如何阻止 child 传播由实时/委托(delegate)监听器触发的事件?

javascript - 如何按顺序选择具有多个类的元素

javascript - Aurelia 将数据传递到模板的可绑定(bind)值中

javascript - Jquery 中转不工作

Javascript 条件分割

javascript - 当插入符位于输入末尾的输入内时,在 contenteditable 中输入后立即移动插入符

javascript - 输入字段的 PHP 计数器

jquery - 如何防止 jquery mobile 将其类添加到 html 元素?

javascript - Mongoose 重复索引

javascript - 100% 固定宽度/高度的 iFrame 缺少滚动条