使用 contenteditable = "true"
可能会比较棘手,但以下是一种可能的解决方案:
当一个单词前面有#时,该文本将会被加粗
HTML:
<div id="divEditable" contenteditable="true"></div>
我们将要拆分这段代码,但实际上它被包裹在一个IIFE(立即调用函数表达式)中。
var _break = /<br\s?\/?>$/g,
_rxword = /(#[\w]+)$/gm,
_rxboldDown = /<\/b>$/gm,
_rxboldUp = /<\/b>(?!<br\s?\/?>)([\w]+)(?:<br\s?\/?>)?$/,
_rxline = /(<br\s?\/?>)+(?!<b>)(<\/b>$)+/g;
$(document).on("keydown.editable", '.divEditable', function (e) {
var html = this.innerHTML.replace(_break, ""),
key = (e.which || e.keyCode),
dom = $(this);
if (key == 32 || key == 13) {
if (_rxword.test(dom.text()))
dom.data("_newText", html.replace(_rxword, "<b>$1</b> "));
if (_rxboldDown.test(html))
dom.data("_newText", html + " ");
}
dom.attr("contenteditable", false).attr("contenteditable", true);
});
$(document).on("keyup.editable", '.divEditable', function (e) {
var dom = $(this),
newText = dom.data("_newText"),
innerHtml = this.innerHTML,
html;
if (!dom.text().length || innerHtml == '<br>') {
dom.empty();
return false;
}
if (!newText && _rxboldUp.test(innerHtml))
newText = innerHtml.replace(_rxboldUp, "$1</b>");
if (!newText && _rxline.test(innerHtml)) html = innerHtml;
else if (newText && _rxline.test(newText)) html = newText;
if (html) newText = html.replace(_rxline, "$2$1");
if (newText && newText.length) {
dom.html(newText).removeData("_newText");
placeCaretAtEnd(this);
}
});
function placeCaretAtEnd (dom) {
var range, sel;
dom.focus();
if (typeof window.getSelection != "undefined"
&& typeof document.createRange != "undefined") {
range = document.createRange();
range.selectNodeContents(dom);
range.collapse(false);
sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
} else if (typeof document.body.createTextRange != "undefined") {
range = document.body.createTextRange();
range.moveToElementText(dom);
range.collapse(false);
range.select();
}
}
您可以在这里体验实时编码:
jsbin.com/zisote。
.text()
иҖҢдёҚжҳҜ.val()
гҖӮ - crush**
粗体文本**
= 粗体文本。这种方式更容易确定在某些字符之间的一些文本,而不是你的想法,因为你没有确定粗体应该在哪里结束,这可能并不完全符合你的要求(?)。或者至少使用类似#加粗文本# 正常字重...
的方式。 - Roko C. Buljan