- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下代码片段将插入符号设置为给定索引 index
var el = $("#subjectMessage"), index = 9 ;
var range = rangy.createRange();
range.setStart(el[0].childNodes[0], index);
range.collapse(true);
var sel = rangy.getSelection();
sel.setSingleRange(range);
当我将输入元素添加到 contentEditable div
时出现问题,我无法再始终如一地将插入符号设置在所需位置。
我想将这些输入视为 div 中的一个位置(就像它们只是一个字符一样)。
除此之外,我还需要类似的代码来将此 contentEditable div
中的选择替换为我自己的一些文本,而且我不是很熟悉(完全) 以了解如何使这项工作...
非常欢迎所有帮助!
这是一个你可以玩弄的 fiddle :
最佳答案
Rangy 的选择和范围 API 是标准 DOM 选择和范围 API 的超集,因此来自 MDN(Range、Selection)等位置的文档适用。
您遇到的问题是范围边界表示为包含 DOM 节点内的偏移量。例如,在下面的 HTML 中,插入符号表示为竖线字符:
<p>Foo<br>b|ar</p>
...插入符号范围的开始和结束边界相同,并设置为文本节点“bar”中的偏移量 1。
如果您想将位置设置为 <p>
的文本内容中的偏移量元素,则需要进行一些 DOM 遍历。我已经根据 another answer of mine 编写了一个实现.这是天真的实现:它没有考虑任何可能不可见的文本(例如,通过 CSS 或在 or 元素中)并且可能有换行符的浏览器差异(IE 与其他所有内容),并采用没有考虑折叠的空白(例如 2 个或更多连续的空格字符折叠到页面上的一个可见空间)。这是一件很难做对的事情,这就是为什么我通常不推荐它。我计划为 Rangy 编写一个基于文本的模块来处理所有这些,但我还没有开始。
代码:
function setCaretCharIndex(containerEl, index) {
var charIndex = 0, stop = {};
function traverseNodes(node) {
if (node.nodeType == 3) {
var nextCharIndex = charIndex + node.length;
if (index >= charIndex && index <= nextCharIndex) {
rangy.getSelection().collapse(node, index - charIndex);
throw stop;
}
charIndex = nextCharIndex;
}
// Count an empty element as a single character. The list below may not be exhaustive.
else if (node.nodeType == 1
&& /^(input|br|img|col|area|link|meta|link|param|base)$/i.test(node.nodeName)) {
charIndex += 1;
} else {
var child = node.firstChild;
while (child) {
traverseNodes(child);
child = child.nextSibling;
}
}
}
try {
traverseNodes(containerEl);
} catch (ex) {
if (ex != stop) {
throw ex;
}
}
}
关于jquery - Rangy + ContentEditable + 设置插入符和替换选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8489812/
我希望能够将包裹在跨度中的图像插入到可编辑的 div 中。我可以做到这一点没问题,但是当我开始打字时,在图像之后,它会将我的文本插入到图像跨度中。如何在刚刚插入的跨度之后定位光标? Here是我的 f
我正在尝试将一些 MathJax 代码插入到 contentEditable div 中,如下所示: 和 JS $(document).ready(funct
我对父级 contenteditable="true"中的嵌套 contenteditable="false"元素有非常不同的行为: I'm supposed to be edit
问题: 我在 Chrome 和 Opera 中观察到一个不受欢迎的行为,当一个连接两个 p通过删除它们之间的分隔来标记。 Chrome 和 Opera 删除 contenteditable=false
我在渲染我的组件时收到以下警告: Warning: A component is contentEditable and contains children managed by React. It
我们已经使用单列网格实现了 React-Vitualized,其中的行为键盘事件 (onKeyUp/onKeyDown/onKeyPress) 启用。我们正在使用 Arrow-Key-Stepper
我有一个 contenteditable div,它包含几个 dontEdit 类的 span。有没有一种方法可以使 span 不可编辑,而 div 的其余部分保持可编辑。 editable
我正在尝试绑定(bind)一个 vue.js 事件以通过 contenteditable=true 检测元素上的更改。 这触发了我的vue.js vue中的trigger方法,但是我好像抓不到模型值
请参阅以下示例: Codepen example Some more text here not editable Hi this is my content $(document).on(
奇怪的是,这只在 Firefox 和 Opera 中被破坏(IE、Chrome 和 Safari 可以正常工作)。 有什么快速修复的建议吗? http://ajax.googleapis.co
无论如何我可以使用这样的东西: console.log(e)}>Testing 内部react-contenteditable处理 Testing 的点击关键字? 当我使用 html 属性时,它只需
我的插入符不在跨度之间,下面的例子 REPLY||stick together||CONFIRM||stick together||Name||stick together||Office 我所有的跨
我在使用 contenteditable 元素时遇到了不希望的行为。在 contenteditable=true 的父元素中嵌套 contenteditable=false 的 block 元素时,我
我有一个 div,它通过使用 contenteditable 用作“输入”,并且在启用时效果很好。但是在一种情况下,我需要通过设置 contenteditable='false' 来禁用“输入”,这会
目标:将 keydown 事件处理程序附加到作为 contenteditable div 子元素的 contenteditable span。 问题:如果您输入跨度,则会触发父事件而不是子事件。我想要
我有以下 HTML 旨在确保内部 span 不可编辑。这适用于其他浏览器,但不适用于 IE8。 Luke, I am your father. I'm your son?! Ewww!
我的网页中有一个 contenteditable div,但现在我需要的是,当超过 div 的最大高度时,将自动创建相同的新 div。 div 看起来也和之前的一样。不仅一个 div 会出现,它会是
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 8年前关闭。 Improve thi
从我读到的内容来看,浏览器在处理 contenteditable 元素方面存在相当多的差异。 (即 link )。当“contenteditable=true”元素包含“contenteditable
当我清除一个contenteditable div的内容时,光标立即丢失,我无法通过点击将其恢复。所以如果我清除一次就无法添加任何内容。 在这里检查一下: asdasd x 删除第一行的“
我是一名优秀的程序员,十分优秀!