【问题标题】:highlight text on single click (javascript jquery html)单击时突出显示文本(javascript jquery html)
【发布时间】:2012-03-28 07:31:27
【问题描述】:

当您在所有浏览器中双击某个单词时,它们会自动突出显示单击下的单词。但是有没有可能找到一种方法让完全相同的事情发生在单击一次?

我想这涉及的事情可能是: - 文本范围的东西; - 对所有段落(或整个正文或 div)的 onclick 做出反应,......但我还没有找到任何地方说明如何告诉浏览器:

“嘿!请在鼠标正下方突出显示文本……现在……尽管我只是单击,而不是双击。”

只是为了澄清:我不是要求突出显示 div 或段落中的整个文本(这相当简单,在 stackoverflow 上给出了许多解释)。我也不想为每个单词插入十亿个跨度。我希望找到与在浏览器中双击文本时获得的完全相同的功能,但只需单击一次。

是的,我打算然后对选定的文本做一些事情。

【问题讨论】:

    标签: javascript html text highlight textrange


    【解决方案1】:

    与@Sindre 的概念相同,当鼠标悬停在

    上时,将文本拆分为单词,并用于渲染它们。当点击这些时,高亮它们。

    在我下面的jsfiddle中,单击一个单词,所有相同的单词都会突出显示。 您可以更改与选择的设置进行比较的方式,例如。与索引而不是单词本身进行比较,以单独突出显示单个单词。

    此外,我没有使用鼠标悬停,而是单击。所以你应该点击

    来选择(激活,使颜色为红色)它,然后选择一个单词。 jsfiddle here

    // main code
      <div 
        @click='select'
        :class='cls'>
        <p v-if='!split'> {{data}} </p>
        <p v-else>
          <span
            v-for='word in spdata'
            :class='chosen(word)'
            @click='choose'>
          {{word}}
          </span>
        </p>
      </div>
    // --------------------
      methods: {
        select (e) {
          this.split = true
        },
        choose (e) {
          let el = e.srcElement
          this.chosenWord = el.innerText
          console.log(this.chosenWord)
        },
        chosen (word) {
            if (word.trim() === this.chosenWord.trim()) {
            return ['chosen']
          } else {
            return []
          }
        }
      },
      computed: {
        spdata () {
            return this.data.split(' ')
        }
      }
    

    【讨论】:

      【解决方案2】:

      有点凌乱的方法,但使用这种方法你可以听到点击每个单词然后模拟行为。我不认为 dblclick() 会模拟本机双击,但使用这种方法你可能能够实现你想要的。

      脚本:

          var words = $("p:first").text().split(" ");
          var text = words.join("</div> <div>");
          $("p:first").html("<div>" + text + "</div>");
          $("div").click(function () {
             $(this).css("background-color","yellow");
          });
      

      HTML

          <p> word1 word2 word3 </p>
      

      小提琴

      http://jsfiddle.net/tbpJT/1/

      【讨论】:

      • 有趣的方法,我用 spans 更新了它jsfiddle.net/kumiau/tbpJT/2
      • 谢谢。但是我真的很想改变页面(在引擎盖下)以添加无数跨度或不添加什么。尽管如此,我并不擅长 jQuery,但我还是从那个函数式示例中学到了一些东西。
      【解决方案3】:

      我会继续说这是不可能的。

      Javascript 与 DOM 树交互,您可以与元素交互,但不能与文本本身交互。我认为远程可能的唯一方法(除了淹没你的 html 代码在 span 标签中)是动态地做到这一点:读取文本节点并在 span 中拆分单词。

      【讨论】:

      • 但是不要忘记这里的想法:所有的浏览器都可以在双击时完美地做到这一点,所以它们绝对有能力。我确定浏览器本身实际上是处理突出显示文本的东西,而不是操作系统(在这种情况下,事情会更加模糊)。因此,根据鼠标指针的位置,他们显然有一个命令来执行此操作。不过,我理解这种情绪。我看了又看……
      • 浏览器是一个应用程序,你可以用原生应用程序做很多用javascript做不到的事情。我已经在其他应用程序中尝试过双击并以相同的方式工作,所以我认为更多的是在操作系统方面而不是在浏览器本身。
      【解决方案4】:
      $('#content').click(function() {
          $(this).dblclick();
      });
      

      浏览器可能会限制这种行为。例如,如果您试图通过转移或执行另一个事件来 .click() 不同的元素。以下答案也可能对此有所帮助:

      Javascript with jQuery: Click and double click on same element, different effect, one disables the other

      【讨论】:

      • 感谢 Aram,非常有趣(而且简单)。不幸的是,对我不起作用。我在调试时确实看到每次单击都会调用该函数,所以这不是问题。所以它只是不起作用(在 Chrome 和 IE 中尝试过)。这可能与 Mantion 下面所说的有关:“我认为 dblclick() 不会模拟原生双击。”敏锐的观察,可能是为什么它不起作用。有没有办法模拟原生双击?
      • 在该答案中,它会延迟双击事件。我认为当同时调用两个事件处理程序时,浏览器会怀疑犯规。
      猜你喜欢
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 2011-06-11
      • 2015-03-14
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多