vue-contenteditable
adding characters to specify position
HTML
<script src="https://cdn.bootcss.com/vue/1.0.26/vue.min.js"></script>
<div id="app">
<div id="why" contenteditable="true">
这是一个非常矬的实现,完全有赖于高手来优化了
</div>
<button @click="addFuck">Add Fucking</button>
</div>
JavaScript
var getCaretPosition = function(oField) {
var iCaretPos = 0;
var doc = oField.ownerDocument || oField.document;
var win = doc.defaultView || doc.parentWindow;
var sel;
if (typeof win.getSelection != "undefined") {
sel = win.getSelection();
if (sel.rangeCount > 0) {
var range = win.getSelection().getRangeAt(0);
var preCaretRange = range.cloneRange();
preCaretRange.selectNodeContents(oField);
preCaretRange.setEnd(range.endContainer, range.endOffset);
iCaretPos = preCaretRange.toString().length;
}
} else if ( (sel = doc.selection) && sel.type !== 'Control') {
var textRange = sel.createRange();
var preCaretTextRange = doc.body.createTextRange();
preCaretTextRange.moveToElementText(oField);
preCaretTextRange.setEndPoint('EndToEnd', textRange);
iCaretPos = preCaretTextRange.text.length;
}
return (iCaretPos);
};
new Vue(
el: '#app',
methods: {
addFuck: function() {
var $why = this.$el.querySelector('#why');
var index = getCaretPosition(this.$el.querySelector('#why'));
$why.innerHTML = $why
.innerHTML
.split('')
.splice(index, 0, '[Fucking]')
.join('');
}
}
});