我想像这样在textarea上制作哈希标签
<textarea> hi #hash </textarea>
并像推特一样改变#hash的颜色
我为此做了一个插件,因为我遇到了同样的问题。看这里: http: //ponjimon.github.io/jquery-hashtags/
一个简单的建议(未经测试):
由于您无法格式化 textarea,您可以通过使用带有contenteditable
属性的 div 和简单的 CSS 格式来模仿它:
<div id='textarea' contenteditable style="overflow: scroll; border: 1px solid black; width: 200px; height: 100px;"></div>
然后,几行 JavaScript(和 jQuery):
// when user finished editing
$('#textarea').blur(function() {
// replace hashtags (parsing should prob. be enhanced)
$(this).html($(this).html().replace(/(#\S+)/, '<span style="color: blue">$1</span>');
});
如果您只想突出显示 textarea 中的文本,这没问题 - 在这种情况下jquery-hashtags做得很好。
然而改变文本的颜色是另一回事,因为你不能直接设置文本区域的样式。我已经设法通过组合的、有点hacky的解决方案来完成它:
<div>
with 属性contenteditable
而不是<textarea>
要自动突出显示文本,您必须使用另一个可以设置样式的内联 html 元素来包装所有 #hashtag 提及,例如<span style="...">
. RegEx 在这里很好地解决了这个问题:
//Bind this on keyup event
var text = text.replace(/<\/?span>/g, '').replace(/([#]+[A-Za-z0-9-_]+)/g, '<span>$1</span>');
但是,在 keyup 上替换文本会产生另一个问题 - 它会重置您的文本光标,因此几乎不可能键入。为了解决这个问题,Rangy来帮忙。它是文本选择库,提供一些实用程序来操作文本字段中的光标位置。要将光标保持在原位,您必须在应用文本替换之前保存它并在它发生后重置它。这是完整的代码:
$("#notes-editor").on("keyup", function(){
var text = $(this).html();
text = text.replace(/<\/?span>/g, '').replace(/([#]+[A-Za-z0-9-_]+)/g, '<span>$1</span>');
savedSel = rangy.getSelection().saveCharacterRanges(this);
$(this).html(text);
rangy.getSelection().restoreCharacterRanges(this, savedSel);
});
你不能在<textarea>
. 您需要在 a 中执行此操作<div>
并编写一组键盘处理程序以在用户键入时更新内容。这不是一项简单的任务。看看使用类似CKEDITOR的东西,虽然我怀疑这不是你工作的真正工具。
由于 textareas 不支持允许您为特定单词或表达式着色的标记,因此您需要做的是创建一个<div>
您可以在 javascript 或 jQuery 中将 keyup 事件绑定到的标记。通过使用这个 keyup 事件,您可以将键入的字母插入到 div 中,就像有人在文本区域中键入一样。接下来,要为特定的主题标签着色,您需要创建一个正则表达式,然后使用该replace
函数将其包装在<a>
标签中并添加所有必要的属性。
我发现了这个关于解析类似 twitter 的用户名和主题标签的酷教程:http ://www.simonwhatley.co.uk/parsing-twitter-usernames-hashtags-and-urls-with-javascript
我认为CodeMirror或类似的编辑器可以解决您的问题——只需添加一个自定义荧光笔。唯一的问题是编辑器可能应该支持可变宽度字体,但我认为 CodeMirror 支持。