Using contenteditable = "true" can be tricky, but this is a possible solution:
Text is bold when preceded by a word #
- Example: hello #world , this is #sample
HTML:
<div id="divEditable" contenteditable="true"></div>
We're going to split the code, but it's actually wrapped in 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) {
$(document).on("keyup.editable", '.divEditable', function (e) { var dom = $(this), newText = dom.data("_newText"), innerHtml = this.innerHTML, html;
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") {
Here you can play with live code: jsbin.com/zisote
source share