ミニブログを参考にして話題機能を挿入するツールの方法:textareaはカーソル座標を取得し、カーソル位置を取得、設定し、すべて、現在の話題を取得します.
3703 ワード
ソース
// textarea
const textareaCaret = require('textarea-caret');
function getCaretCoordinates($el) {
let caret = textareaCaret($el, $el.selectionEnd);
return {
top: caret.top,
left: caret.left,
height: caret.height
}
}
// textarea
function getCursorPosition($el) {
var cursorPos = 0;
if (document.selection) {
// IE
var fus = document.selection.createRange(); //
fus.moveStart('character', -$el.value.length);
cursorPos = fus.text.length;
}
if ($el.selectionStart || $el.selectionStart == 0) {
var start = $el.selectionStart; //
cursorPos = start;
}
return cursorPos;
}
// textarea
function insertCursorText($el, text) {
var cursorPos = 0;
if (document.selection) {
// IE
$el.focus(); // textara
var fus = document.selection.createRange(); //
fus.moveStart('character', -$el.value.length);
cursorPos = fus.text.length;
fus.text = text; //
$el.focus(); /// textara
} else if ($el.selectionStart || $el.selectionStart == 0) {
var start = $el.selectionStart; //
var end = $el.selectionEnd; //
cursorPos = start;
//
$el.value = $el.value.substring(0, start) + text + $el.value.substring(end, $el.value.length);
} else {
$el.value += text;
}
return {
value: $el.value,
cursorPos: cursorPos
}
}
// textarea
function setCursorPosition($el, pos) {
if($el.setSelectionRange) {
$el.focus();
$el.setSelectionRange(pos, pos);
} else if ($el.createTextRange) {
var range = $el.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
}
// “ ” ( :'#123#' ) 【 】
function setTopicStyle(value) {
var exp = /(#|#)((?!#).)*(#|#)/g
value = value.replace(/]*?>(.*?)/gi, '').replace(/(.*?)]*?>/gi, '').replace(exp, (item) => {
let newVal = '' + item + ''
return newVal
})
return value
}
// , src : textarea
function parse(src) {
return src.split(/(#[^#]+#)/).reduce((res, v, i, a) => {
if (v.length > 1 && v.startsWith('#') && v.endsWith('#')) {
res.list.push({
tag: v.substring(1, v.length-1),
index: res.index,
completed: true
});
} else {
if (i === a.length -1) {
const parts = v.split('#');
if (parts.length > 1) {
res.list.push({
tag: parts.pop(),
index: parts[0].length + res.index,
completed: false
});
}
}
}
res.index += v.length;
return res;
}, {list: [], index: 0});
}
// res: parse(src); caretPos: getCursorPosition($el)
function getCurrent(res, caretPos) {
let current = null;
res.list.some((v, i) => {
if (v.index < caretPos && v.index + v.tag.length + 2 > caretPos) {
current = v;
return true;
}
return false;
});
return current;
}
export default {
getCaretCoordinates,
getCursorPosition,
setCursorPosition,
insertCursorText,
setTopicStyle,
parse,
getCurrent
}