确定标记化html输入中的插入符号位置
Determing caret position in tokenized html input?
(请不要jquery(
给定一个value
被/'s+/g
分割的html输入,如何找到插入符号所在的当前标记?
例如,如果您的输入值是
abc ab monkey
如果你把它拆分,它就会变成
["abc, "ab", "monkey"]
但是,如果您在输入中的插入符号位置在这里。。。
abc ab monk^(caret here)ey
如何确定插入符号当前位于哪个令牌中?
我正在寻找的api应该是类似的东西
var currentToken = getPosition(inputEl.value); // { index: 2, token: "monkey" }
我已经记下了大部分内容,但当我开始用左箭头在输入中回溯时,它会变得一团糟。
http://jsfiddle.net/dlizik/zmbpq5hz/
html
<input id="input" />
<pre id="test"></pre>
cursor at current token: <span id="res"></span>
js
(function($doc) {
"use strict";
var single = /'s/g;
var spacer = /'s+/g;
var disp = $doc.getElementById("test");
var input = $doc.getElementById("input");
var res = $doc.getElementById("res");
function keyListen(e) {
var tokens = this.value.split(spacer);
var tokenLengths = tokens.map(function(i) { return i.length; });
var cumulative = tokenLengths.map(function(i, n) {
return tokenLengths.slice(0, n + 1).reduce(function(a, b) {
return a + b;
});
});
var cursor = caretPos(this);
var currToken = tokens[getPos(cursor, cumulative)];
res.textContent = currToken;
disp.textContent = JSON.stringify(this.value.split(spacer), null, 2);
}
function getPos(curr, arr) {
for (var i = 0; i < arr.length; i++) {
if (curr <= arr[i]) return i;
}
}
function caretPos(el) {
var val = el.value;
var extra = val.match(single);
var whitespace = extra == null ? 0 : extra.length;
var pos = 0;
if ($doc.selection) {
el.focus();
var sel = $doc.selection.createRange();
sel.moveStart('character', -val.length);
pos = sel.text.length;
}
else if (el.selectionStart || el.selectionStart == '0') pos = el.selectionStart;
return (pos - whitespace);
}
input.addEventListener("keyup", keyListen.bind(input), false);
})(document);
好的,这样你就可以使用正则表达式了。。。现在我想起来并没有那么难。你只需要找到插入符号位置剩下的单词数。这将为您提供当前的令牌索引以及字符串本身。然而,您只需要考虑一个插入符号,它的相邻字符串都是空格。
http://jsfiddle.net/dlizik/zmbpq5hz/1/
这是您想要运行的功能
(function($doc) {
"use strict";
var single = /'s/g;
var tokenize = /[^'s+]/g;
var ledge = /['s]*[^'s]+['s]*/g;
var disp = $doc.getElementById("test");
var input = $doc.getElementById("input");
var res = $doc.getElementById("res");
function keyListen(e) {
var tokens = this.value.match(tokenize);
var pos = caretPos(this);
var adj = this.value.substring(pos - 1, pos + 1);
var left = this.value.slice(0, pos + 1).match(ledge).length - 1;
var curr = adj === " " ? null : tokens[left];
res.textContent = curr + "";
disp.textContent = JSON.stringify(this.value.split(spacer), null, 2);
}
function caretPos(el) {
var pos = 0;
if ($doc.selection) {
el.focus();
var sel = $doc.selection.createRange();
sel.moveStart('character', -el.value.length);
pos = sel.text.length;
}
else if (el.selectionStart || el.selectionStart == '0') pos = el.selectionStart;
return (pos);
}
input.addEventListener("keyup", keyListen.bind(input), false);
})(document);
相关文章:
- 插入符号到底是什么
- 将插入符号位置移动到ContentEditable<DIV>
- 为更改的输入返回插入符号位置的逻辑
- 内容可编辑DIV单击/插入符号设置
- 在contentEditable元素中居中占位符插入符号
- 获取插入符号相对于行可见起点的位置
- JavaScript 插入符号位置
- 链接内的内容可编辑块,如何防止重定向,但让文本选择插入符号位置更改
- 如何更改文本区域中闪烁的光标/插入符号
- Caret函数没有'如果插入符号在最后一个位置,就不能正常工作
- 如何使用javascript获取&使用字符偏移量设置插入符号位置
- text使用shift键和箭头键时的区域插入符号位置
- Rangy和IE8-在段落末尾的元素后面放置插入符号
- HTML Texeare 插入符号控件使用左、右、下、上、主页和结束虚拟按钮
- 在插入符号位置获取DOM元素
- 单击时获取文本区域中插入符号的位置
- 正则表达式替换为插入符号
- 我可以使用或打开'插入'现代浏览器中使用javascript的插入符号
- 如何在contenteditable中跟踪插入符号/光标
- tinymce丢失插入符号位置