【问题标题】:Modify Character or Word after typing it JavaScript输入后修改字符或单词 JavaScript
【发布时间】:2011-10-24 23:30:51
【问题描述】:

假设我在文本区域中输入单词“hello”。在我输入 hello 之后,我将如何选择我刚刚输入的单词并进行修改。例如,在我键入单词 hello 后,没有按空格键,识别出单词是 hello,并在单词前后添加 <b></b>。所以最终结果将是<b>hello</b> 我知道textarea 不采用HTML,但为了争论。我能想到的唯一方法是每次用户按下一个键时运行一个函数,并将 textarea 的内容添加到一个数组中,在空格处打破它。但这需要空格,而且必须交叉引用数组需要时间。有没有办法轻松做到这一点?

【问题讨论】:

  • 为了清楚起见,您需要这样的功能,即在文本区域中键入字母 o,文本 I said hell 更改为 I said <b>hello</b>
  • 是的。确切地。但在内容可编辑的 div 中

标签: javascript jquery dom textarea


【解决方案1】:

如果您希望它在您键入时进行替换,您肯定必须捕获每个按键,但您不必测试空格。当我在 IE 中测试它时,以下工作:

$(function() {
   $("#yourtextareaidhere").keyup(function(e) {
      var updatedText = this.value.replace(
                               /(^|[^>])(hello)($|[^<])/gi, "$1<b>$2</b>$3");
      if (updatedText != this.value)
         this.value = updatedText;
   });
});

基本上在每次按键时都会进行字符串替换,以获取尚未被“>”和“"<b>hello</b>"。如果字符串替换的结果与字段中的结果不同(即确实发生了一些替换),那么新值将被写回 textarea - 我不只是每次都直接写回它,因为这会丢失光标这对用户来说很烦人,我懒得想出比这个简单的“if”测试更好的解决方法。 (我的理由是我为您提供了一个“起点”,其余的交给您。)

这种方法允许用户可能没有一次性输入单词“hello”,例如,如果他们打错字并且最初输入“I say hello to you”,然后返回并添加“e ” 那么你(大概)想要替换“你好”,即使它不是在最后。我还进行了全局替换,这样如果用户粘贴“hello hello hello”,它们都会被替换。如果您需要不区分大小写的替换,请自行决定。

如果您还想替换其他单词,如果它们都只需要粗体标记,则可以将它们添加到同一个正则表达式中,否则如果每个特殊单词都有自己所需的格式,请定义一组搜索正则表达式和替换字符串并在函数内循环它们。

请注意,我的正则表达式有点生疏,所以如果有更好的方法来做同样的事情,我一点也不感到惊讶,但我会将任何改进留给读者作为练习。

【讨论】:

  • 是的,我不太了解你的 RegExp。因为我以&lt;b&gt; 为例。它可能最终会成为&lt;span&gt;&lt;p&gt;
  • 你对 contenteditable div 有什么了解吗?因为我也想在其中一个中使用它,而且效果很好!但是在它改变文本之后,它失去了焦点
  • 如果你想要 &lt;span&gt;&lt;p&gt; 而不是 &lt;b&gt; 那么(你为什么不在问题中这么说,并且)只需将它们放入而不是 &lt;b&gt; 在这个我的代码中的字符串:"$1&lt;b&gt;$2&lt;/b&gt;$3"。至于 RegEx 的工作原理,我相信您可以通过 Google 找到很多教程,或者查看 what MDN says about Regex in JS - 请注意“捕获括号”以了解 $1 语法在替换字符串中的含义.我对可编辑的 div 所做的很少,但我的回答已经提到将焦点问题留给您...
  • 它在 textarea 中工作正常,但在可编辑的 div 中,它的行为真的很奇怪。真的很奇怪。
  • 抱歉,我很少接触可编辑的 div,所以我不知道可能是什么问题。我相信我已经对最初提出的问题给出了合理的答案,因此要获得有关可编辑 div 焦点问题的进一步帮助,您应该发布另一个问题(或更新这个问题)。
【解决方案2】:

你可以使用JQuery.keyup函数来监听空格键的按下。

$("textarea").keyup(function(event)
{ 
    var c= String.fromCharCode(event.keyCode);
    var isWhiteSpace = c.match(/\s/);
});

您也可以使用splitjoin 函数来完成您在问题后半部分中描述的内容。

编辑:这里有更多关于这个想法的信息:http://jsfiddle.net/ingenu8/ukkwM/

<div class="formatted"></div>
<textarea class="observed"></textarea>

和 JS:

$(document).ready(function() {
    function hasHtml(str)
    {
        return str.match(/<b>.*?<\/b>/);
    }

    function formatStr(str)
    {
        var bits = str.split(/\s+/);
        var last = bits.pop();
        if(!last.match(/^\s*$/))
        {
            if(!hasHtml(last))
            {
                bits.push('<b>'+last+'</b>');
            }
        }
        return bits.join(' ');
    }

    setInterval(function() {
        var str = formatStr($('.observed').val());
        $('.formatted').html(str);
    }, 1000);
});

【讨论】:

  • 我明白你在说什么,但这并不能回答我的问题。我知道如何听太空新闻,但这就是我想要避免的。我希望能够在必须按下空格键之前识别字符串
  • @JonahAllibone 您可以使用 setInterval 执行函数并充当字段的观察者。您可以跟踪字段的长度,以检查是否应该格式化字符串。
  • @JonahAllibone 我发布了一个我正在谈论的例子。如果需要存储格式化的位,可以使用api.jquery.com/jQuery.data
  • 啊,现在你很接近了。但我希望更新后的值显示在您输入的同一个文本框中。基本上,它会在您输入时更改您输入的单词
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多