摘要:源碼獲取中光標坐標獲取中光標位置獲取光標位置獲取焦點前坐標中插入文本輸入元素獲取焦點獲取光標位置在光標位置插入值輸入元素獲取焦點獲取焦點前坐標獲取焦點后坐標插入文字設置中光標位置設置話題顏色例如部分為紅色暫未用到獲取所有話題中文本
源碼
// 獲取 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
}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104222.html
摘要:還沒結束上述例子中,在輸入框中表情只能以文本的形式呈現。如果想在輸入框中呈現輸入的表情,該怎么辦呢使用屬性為的容器代替是必須的,因為中只能顯示文本。 在普通的 textarea 中,只能顯示普通的文本。如果簡單的輸入文本,textarea 便足以勝任。但是實際情況往往要復雜得多。 簡單版本的插入表情 常見的版本一般都是使用 textarea,然后表情使用某種約定的文本格式代替,比如你好...
摘要:項目中文字由進行渲染。待觸發時,取消中文輸入標記,將文字渲染到上。而其中一些有趣的細節實現如文本渲染,對中文筆畫分割實現有趣的動畫等并沒有描寫。 導言 目前富文本編輯器的實現主要有兩種技術方案:一個是利用contenteditable屬性直接對html元素進行編輯,如draft.js;另一種是代理textarea + 自定義div + 模擬光標實現。對于類似word的經典富文本編輯器,...
摘要:最近為實現一個新功能弄的焦頭爛額的實現,在實現后寫下些心得,供以后會跳入這坑的同志們參考。選人實現主要涉及步驟為。需要修改的代碼,保存選區以及光標信息,用于獲取在光標焦點離開前,光標的位置刪除符號。這樣就完成這一功能了。 最近為實現一個新功能弄的焦頭爛額 @xxx 的實現,在實現后寫下些心得,供以后會跳入這坑的同志們參考。 首先,當讓是考慮使用范圍,由于項目僅僅需要考慮在 WEBKIT...
摘要:希望在做所有事情之前,操作文檔。不受層級限制子選擇器在給定的父元素下匹配所有子元素。相鄰選擇器匹配所有緊接在元素后的元素。判斷當前對象中的某個元素是否包含指定類名,包含返回,不包含返回下標過濾器精確選出指定下標元素獲取第個元素。 原文鏈接 http://blog.poetries.top/2016... 首先,來了解一下jQuery學習的整體思路 showImg(https://seg...
閱讀 2650·2021-11-25 09:43
閱讀 670·2021-11-12 10:36
閱讀 4615·2021-11-08 13:18
閱讀 2168·2021-09-06 15:00
閱讀 3106·2019-08-30 15:56
閱讀 924·2019-08-30 13:57
閱讀 1985·2019-08-30 13:48
閱讀 1413·2019-08-30 11:13