【发布时间】:2014-01-20 00:50:20
【问题描述】:
如何在用户键入时将内容可编辑 div 中以 # 字符开头的所有单词的颜色更改为蓝色。它现在所做的就是为所有匹配着色,但前提是它们出现在不匹配的单词之后。像这样:
#liferandomness #deathmore nothing #trees
但这不起作用:
我吃了一个苹果#yum#doctoraway#healthy#diet
这是一个小提琴: http://jsfiddle.net/GEm75/
我现在的做法是将每个匹配项包装在一个跨度中,然后使用 css 对其进行样式设置。我遇到了一个问题,主题标签后的不匹配文本仍然与主题标签颜色相同。我解决了这个问题,但效率很低,我非常想要一个替代方案。 这是我的代码:
<div id="box" style="border: 1px solid black; height: 10em" contenteditable="true">
</div>
function placeCaretAtEnd(el) {
el.focus();
if (typeof window.getSelection != "undefined"
&& typeof document.createRange != "undefined") {
var range = document.createRange();
range.selectNodeContents(el);
range.collapse(false);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
} else if (typeof document.body.createTextRange != "undefined") {
var textRange = document.body.createTextRange();
textRange.moveToElementText(el);
textRange.collapse(false);
textRange.select();
}
}
var inp = $('#box');
//select the box div
var text = '';
//#box's default value
inp.on('keyup', function(e) {
text = inp.html();
var matches_hash = text.match(/(^|\s)#(\w+)/g);
if (matches_hash) {
text = text.replace(/(^|\s)#(\w+)/g, "</span><span class='hashtag'> #$2</span><span class='else'>");
inp.html(text);
placeCaretAtEnd(document.getElementById('box'));
}
});
</script>
我想知道是否有更有效的方法来做到这一点。还有主题标签必须用非主题标签文本分隔的问题。我通过一个正则表达式测试器运行了我的正则表达式,它运行良好。
函数placeCaretAtEnd(el) 是别人做的,我没做。但它所做的只是将插入符号放在可编辑 div 的末尾。
如果你有任何问题,请给我留言
请帮帮我。
【问题讨论】:
-
这个问题非常非常非常非常笼统。根本没有答案。你在做什么?你的架构是什么?您要为此提供“语言”吗?你做过什么吗?
-
恕我直言,如果您不确定自己需要哪种语言,那么 a) 不确定我们要指导您的方向 b) 您的技能水平可能不够高,抱歉!您可能想开始学习 PHP....
-
我编辑了我的问题,现在它更相关且更容易回答。请解开我的问题。
标签: javascript php jquery contenteditable hashtag