【问题标题】:Trying to replace a string on the fly, whats the best way?尝试即时替换字符串,最好的方法是什么?
【发布时间】:2015-01-01 09:43:17
【问题描述】:

我正在尝试通过用跨度包围来动态替换一些文本。

例子:

一个人正在打字,当他们输入“backwards”这个词和后面的空格时,它会使整个句子或包含该词的行变为粗体。

现在我已经为它设置了一个 CSS 类,我一直在尝试将它放入一个跨度中,但我不确定它是否有效......它也会在任何新的事情发生时重置,所以光标会跳回来到开始,它不让我前进。

这是我目前所拥有的(我的正则表达式现在也是错误的):

function replace(e) {
  if (e.keyCode == 13) {
    element = document.getElementById("script");
    rg = /^INT/;
    element.innerHTML = element.innerHTML.replace(
      rg,
      '<span id="bold">$1</span>'
    );
  };
};
<div contenteditable="true" id="script" style="width: 100%; height: 500px; border: 1px solid black;" onkeydown="replace(event)">
  Replace
</div>

【问题讨论】:

  • 由于^,您的正则表达式会在字符串的开头查找 INT。通过将 INT 包裹在括号中来捕获它。您的替换功能现在仅在返回后触发。这是故意的?

标签: javascript html css regex


【解决方案1】:

正如@Mouser 所述,您的正则表达式将在开头查找 INT 字符串。

这是正确的代码。您只需要根据需要修复您的 RegEx。我已经对其进行了测试,并且可以正常工作。

function replace(e) {
  if (e.keyCode == 13) {
    element = document.getElementById("script");
    var _str = element.innerHTML.trim("")
    rg = /INT/;
    element.innerHTML = _str.replace(
      rg,
      function($1) {
        console.log($1)
          return '<h1><span id="bold">' + $1 + '</span></h1>'
      } 
    );

    //Set cursor position
    var range = document.createRange()
    var _lastDom = element.childNodes[element.childNodes.length - 1];
    var end = '';
    if(_lastDom && _lastDom.innerHTML == undefined) {
        end = _lastDom.length
    } else {
        _lastDom
        end = 1
    }
    range.setStart(_lastDom,end)
    range.setEnd(_lastDom,end)
    sel = document.getSelection()
    sel.removeAllRanges()
    sel.addRange(range)
  };
};

【讨论】:

  • $1 在原始代码中是正确的。这将产生错误@HarpreetSingh
  • 替换中的匿名函数是不必要的:'&lt;h1&gt;&lt;span id="bold"&gt;$1&lt;/span&gt;&lt;/h1&gt;' 应该足以作为替换字符串。
  • @Mouser,其实我不熟悉那个方法
【解决方案2】:

可能是一种更好的方法,但这样的事情可能会有所帮助

var thepara=document.getElementById('thepara').innerHTML;

document.getElementById('thetext').addEventListener('keyup',function(e){
 var thetext=this.value;
 var thelength=this.value.length;
 
  var thestart=thepara.indexOf(thetext);
  var found=thepara.substr(thestart,thelength);
  if(found != "n" ){
    var newstring="<span class='bolded'>"+found+"</span>";
      document.getElementById('thepara').innerHTML=thepara.replace(found,newstring);
  }
  });
.bolded{font-weight:bold;}
<input type="text" id="thetext" />
<div id="thepara">It was a nice sunny day in the suburbs of South East London</div>

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 2018-10-05
    • 2011-05-27
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多