jQuery或JavaScript如何突出显示文本区域中选定的文本

jQuery或JavaScript如何突出显示文本区域中选定的文本,javascript,jquery,css,Javascript,Jquery,Css,我想知道Facebook是如何做到这一点的。我知道他们使用textarea的in-there评论和状态功能,但如果我在帖子或其他内容中标记某人,它将以浅蓝色背景突出显示textarea中的文本选择。我知道textarea的,或者至少我上次知道的,这在这种类型的元素中是不可能的,那么他们是如何做到的呢?技术是什么?有人知道吗?我指望有人能告诉我怎么做,但不知道怎么做?这不是用经典的文本区来完成的。我知道这听起来很疯狂,但当你打字时,它会生成html,在那里它可以标记/突出显示关键字并移动输入,这样

我想知道Facebook是如何做到这一点的。我知道他们使用textarea的in-there评论和状态功能,但如果我在帖子或其他内容中标记某人,它将以浅蓝色背景突出显示textarea中的文本选择。我知道textarea的,或者至少我上次知道的,这在这种类型的元素中是不可能的,那么他们是如何做到的呢?技术是什么?有人知道吗?我指望有人能告诉我怎么做,但不知道怎么做?

这不是用经典的文本区来完成的。我知道这听起来很疯狂,但当你打字时,它会生成html,在那里它可以标记/突出显示关键字并移动输入,这样你就有了一个打字的地方。您可以使用Firebug查看它是如何实时发生的。

这不是使用经典文本区域完成的。我知道这听起来很疯狂,但当你打字时,它会生成html,在那里它可以标记/突出显示关键字并移动输入,这样你就有了一个打字的地方。您可以使用Firebug查看它是如何实时发生的。

我已经根据html5演示制作了一个示例,让您可以这样做。检查一下,这只是告诉浏览器使部分可编辑,它了解基本的html功能。这可能不是facebook的做法,但鉴于html5是“未来”,它可能值得玩玩。

我已经根据html5演示制作了一个示例,让您可以这样做。检查一下,这只是告诉浏览器使部分可编辑,它了解基本的html功能。这可能不是facebook的做法,但考虑到html5是“未来”,它可能值得玩玩。

尽管它以某种方式使用了
文本区域,但大部分魔法是通过
div
s和CSS实现的。我从Safari的Web Inspector中提取了以下信息:

<div class="inputContainer">
  <div class="uiMentionsInput" id="up84fa_5">
    <div class="highlighter" style="direction: ltr; text-align: left; ">
      <div style="width: 499px; ">
        <span class="highlighterContent"><b>Brandan Lennox</b> is the coolest.</span>
      </div>
    </div>

    <div class="uiTypeahead composerTypeahead mentionsTypeahead" id="up84fa_9" style="height: auto; ">
      <div class="wrap">
        <input type="hidden" autocomplete="off" class="hiddenInput">
        <div class="innerWrap">
          <textarea class="uiTextareaAutogrow input mentionsTextarea textInput" title="What's on your mind?" name="xhpc_message_text" placeholder="What's on your mind?" onfocus="return wait_for_load(this, event, function() {if (!this._has_control) {  new TextAreaControl(this).setAutogrow(true);  this._has_control = true; } return wait_for_load(this, event, function() {JSCC.get('j4f3584ff4f90d07867222385').init(JSCC.get('j4f3584ff4f90d07867222386'));;JSCC.get('j4f3584ff4f90d07867222386').init([&quot;buildBestAvailableNames&quot;,&quot;hoistFriends&quot;]);JSCC.get('j4f3584ff4f90d07867222383').init({&quot;max&quot;:10}, null, JSCC.get('j4f3584ff4f90d07867222385'));;;});});" autocomplete="off" style="height: 48px; direction: ltr; ">What's on your mind?</textarea>
        </div>
      </div>
    </div>
    <input type="hidden" autocomplete="off" class="mentionsHidden" name="xhpc_message" value="@[815490222:Brandan Lennox] is the coolest.">
  </div>
  <div class="attachmentMetaArea"></div>
</div>

布兰登·伦诺克斯是最酷的。
你在想什么?
重要内容包括:

  • div.highlighter
    及其后代
    span.highlighterContent
    。请注意,它将
    b
    元素设置为高亮显示的内容
  • 实际
    textarea
    元素的凌乱
    onfocus
    处理程序。在其中的某个地方,它创建了一个
    TextAreaControl
    对象,该对象似乎在DOM中的其他地方创建了一个对象,因为
    textarea
    内容本身没有被更新
  • 输入[type=hidden].Referenceshidden
    将自定义数据提交到服务器,以便服务器知道您实际提到的人

这完全是Facebook特有的,但可能会给你一些你想做的事情的想法。

虽然它以某种方式使用了
textarea
,但大部分的魔法都是通过
div
s和CSS实现的。我从Safari的Web Inspector中提取了以下信息:

<div class="inputContainer">
  <div class="uiMentionsInput" id="up84fa_5">
    <div class="highlighter" style="direction: ltr; text-align: left; ">
      <div style="width: 499px; ">
        <span class="highlighterContent"><b>Brandan Lennox</b> is the coolest.</span>
      </div>
    </div>

    <div class="uiTypeahead composerTypeahead mentionsTypeahead" id="up84fa_9" style="height: auto; ">
      <div class="wrap">
        <input type="hidden" autocomplete="off" class="hiddenInput">
        <div class="innerWrap">
          <textarea class="uiTextareaAutogrow input mentionsTextarea textInput" title="What's on your mind?" name="xhpc_message_text" placeholder="What's on your mind?" onfocus="return wait_for_load(this, event, function() {if (!this._has_control) {  new TextAreaControl(this).setAutogrow(true);  this._has_control = true; } return wait_for_load(this, event, function() {JSCC.get('j4f3584ff4f90d07867222385').init(JSCC.get('j4f3584ff4f90d07867222386'));;JSCC.get('j4f3584ff4f90d07867222386').init([&quot;buildBestAvailableNames&quot;,&quot;hoistFriends&quot;]);JSCC.get('j4f3584ff4f90d07867222383').init({&quot;max&quot;:10}, null, JSCC.get('j4f3584ff4f90d07867222385'));;;});});" autocomplete="off" style="height: 48px; direction: ltr; ">What's on your mind?</textarea>
        </div>
      </div>
    </div>
    <input type="hidden" autocomplete="off" class="mentionsHidden" name="xhpc_message" value="@[815490222:Brandan Lennox] is the coolest.">
  </div>
  <div class="attachmentMetaArea"></div>
</div>

布兰登·伦诺克斯是最酷的。
你在想什么?
重要内容包括:

  • div.highlighter
    及其后代
    span.highlighterContent
    。请注意,它将
    b
    元素设置为高亮显示的内容
  • 实际
    textarea
    元素的凌乱
    onfocus
    处理程序。在其中的某个地方,它创建了一个
    TextAreaControl
    对象,该对象似乎在DOM中的其他地方创建了一个对象,因为
    textarea
    内容本身没有被更新
  • 输入[type=hidden].Referenceshidden
    将自定义数据提交到服务器,以便服务器知道您实际提到的人

这完全是Facebook特有的,但可能会给你一些想法,让你知道你想做什么。

他们可能正在使用ContentSee。这将允许您更改部分场景的背景text@dstarh有趣的是,他们实际上并不是,似乎……是的,我看到了@mazzucci的答案。我仍然认为使用contenteditable可以达到同样的效果。他们可能正在使用contenteditable。这将允许您更改部分场景的背景text@dstarh有趣的是,他们实际上并不是,似乎……是的,我看到了@mazzucci的答案。我仍然认为使用contenteditable可以达到同样的效果。。。但也许它隐藏在一个神奇的HTML生成的东西后面?的确很疯狂。是的,这是我问题的基础,在查看了firebug的twitter、linkedin、facebook和其他类似实体的功能后,我看到了经典的textarea标签。但是在听了你的格式副本后,我猜有一个div是有意义的,当你依次设置焦点时,它会将焦点设置在这个隐藏的textarea上,而textarea会反映出你使用键事件在div的html中键入的内容。。某些事件会触发其他事件,例如@symbol..Firebug显示文本区域。。。但也许它隐藏在一个神奇的HTML生成的东西后面?的确很疯狂。是的,这是我问题的基础,在查看了firebug的twitter、linkedin、facebook和其他类似实体的功能后,我看到了经典的textarea标签。但是在听了你的格式副本后,我猜有一个div是有意义的,当你依次设置焦点时,它会将焦点设置在这个隐藏的textarea上,而textarea会反映出你使用键事件在div的html中键入的内容。。某些事件触发了其他事件,例如@符号。。