javascript - 在文本区域或预输入中输入时设置颜色格式

标签 javascript jquery html textarea pre

我正在尝试创建一个评论部分,让用户@某人。当用户输入 @random 然后输入空格时,我希望它突出显示。所以我创建了一些搜索和替换字符串的东西,但是当替换 html 时,它将光标放在开头。有办法解决这个问题吗?还有其他方法可以做这样的事情吗?

$('#textarea').keyup(function() {
  txt = this.innerText.split(" ")
  new_txt = this.innerText
  for (var i = txt.length - 1; i >= 0; i--) {
    if (txt[i].startsWith('@') == false) {
      delete txt[i]
    }
  }
  txt = txt.sort().join(" ").trim().split(" ")
  console.log(txt)
  if (txt.length > 0 && txt[0] != "") {
    for (var i = 0; i < txt.length; i++) {
      new_txt = new_txt.replace(txt[i], '<mark>' + txt[i] + '</mark>')
    }
    $('#my_console_log').text(new_txt)
    this.innerHTML = new_txt
  }
});
pre {
  border: solid black 1px;
}

mark {
  background: blue;
  color: red;
}
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<title>Test page</title>
<form>
  <pre id='textarea' contentEditable='true'></pre>
  <div id="my_console_log"></div>
</form>

最佳答案

这是一个简单的 plugin可用这对您有用, 下载插件并编辑文件 jquery.hashtags.js 并删除 # 的条件。您还可以根据您的要求更改样式。

(function($) {
$.fn.hashtags = function() {
    $(this).wrap('<div class="jqueryHashtags"><div class="highlighter"></div></div>').unwrap().before('<div class="highlighter"></div>').wrap('<div class="typehead"></div></div>');
    $(this).addClass("theSelector");
    autosize($(this));
    $(this).on("keyup", function() {
        var str = $(this).val();
        $(this).parent().parent().find(".highlighter").css("width",$(this).css("width"));
        str = str.replace(/\n/g, '<br>');
        if(!str.match(/(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?#([a-zA-Z0-9]+)/g) && !str.match(/(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?@([a-zA-Z0-9]+)/g) && !str.match(/(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?#([\u0600-\u06FF]+)/g) && !str.match(/(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?@([\u0600-\u06FF]+)/g)) {

            // Remove below condition for hashtag.
            if(!str.match(/#(([_a-zA-Z0-9]+)|([\u0600-\u06FF]+)|([ㄱ-ㅎㅏ-ㅣ가-힣]+)|([ぁ-んァ-ン]+)|([一-龯]+))#/g)) { //arabic support, CJK support
                str = str.replace(/#(([_a-zA-Z0-9]+)|([\u0600-\u06FF]+)|([ㄱ-ㅎㅏ-ㅣ가-힣]+)|([ぁ-んァ-ン]+)|([一-龯]+))/g,'<span class="hashtag">#$1</span>');
            }else{
                str = str.replace(/#(([_a-zA-Z0-9]+)|([\u0600-\u06FF]+)|([ㄱ-ㅎㅏ-ㅣ가-힣]+)|([ぁ-んァ-ン]+)|([一-龯]+))#(([_a-zA-Z0-9]+)|([\u0600-\u06FF]+)|([ㄱ-ㅎㅏ-ㅣ가-힣]+)|([ぁ-んァ-ン]+)|([一-龯]+))/g,'<span class="hashtag">#$1</span>');
            }

            // Keep this condition.
            if(!str.match(/@(([a-zA-Z0-9]+)|([\u0600-\u06FF]+)|([ㄱ-ㅎㅏ-ㅣ가-힣]+)|([ぁ-んァ-ン]+)|([一-龯]+))@/g)) {
                str = str.replace(/@(([a-zA-Z0-9]+)|([\u0600-\u06FF]+)|([ㄱ-ㅎㅏ-ㅣ가-힣]+)|([ぁ-んァ-ン]+)|([一-龯]+))/g,'<span class="hashtag">@$1</span>');
            }else{
                str = str.replace(/@(([a-zA-Z0-9]+)|([\u0600-\u06FF]+)|([ㄱ-ㅎㅏ-ㅣ가-힣]+)|([ぁ-んァ-ン]+)|([一-龯]+))@(([a-zA-Z0-9]+)|([\u0600-\u06FF]+)|([ㄱ-ㅎㅏ-ㅣ가-힣]+)|([ぁ-んァ-ン]+)|([一-龯]+))/g,'<span class="hashtag">@$1</span>');
            }
        }
        $(this).parent().parent().find(".highlighter").html(str);
    });
    $(this).parent().prev().on('click', function() {
        $(this).parent().find(".theSelector").focus();
    });

};
})(jQuery);

关于javascript - 在文本区域或预输入中输入时设置颜色格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60486313/

相关文章:

javascript - 使用位置在图像上添加文本

javascript - 如何使用 javascript、ajax 或 jquery 从第二页启用第一页复选框

javascript - 如何为 slideToggle 指示器使用箭头?

jquery - 如何使我的 svg 元素出现?

javascript - Uncaught ReferenceError : execute is not defined

javascript - 在Javascript中,如何重构一些重复的匿名函数?

javascript - 如果服务器 http 状态不是 200,则启用 CORS

javascript - 强制 iframe 链接在同一 iframe 中打开

javascript - Chrome 和 Safari 中的 CKEditor 文本区域超出框范围

javascript - HTML标签嵌套问题