【发布时间】:2014-02-27 18:15:57
【问题描述】:
我正在尝试创建一个预先输入代码以添加到 wysihtml5 富文本编辑器。 基本上,我需要能够插入诸如 Twitter/Github/Facebook 之类的人物/标签引用...。
我发现一些人试图实现同样的目标。
这工作得很好,只是它只对最后一个单词做建议并且有一些错误。而且我想要一个像 Twitter 这样的选择框,而不是使用 Tab 键进行简单的“选择切换”。
为此,我尝试检测当前输入的单词。
getCurrentlyTypedWord: function(e) {
var iframe = this.$("iframe.wysihtml5-sandbox").get(0);
var sel = rangy.getSelection(iframe);
var word;
if (sel.rangeCount > 0 && sel.isCollapsed) {
console.debug("Rangy: ",sel);
var initialCaretPositionRange = sel.getRangeAt(0);
var rangeToExpand = initialCaretPositionRange.cloneRange();
var newStartOffset = rangeToExpand.startOffset > 0 ? rangeToExpand.startOffset - 1 : 0;
rangeToExpand.setStart(rangeToExpand.startContainer,newStartOffset);
sel.setSingleRange(rangeToExpand);
sel.expand("word", {
trim: true,
wordOptions: {
includeTrailingSpace: true,
//wordRegex: /([a-z0-9]+)*/gi
wordRegex: /[a-z0-9]+('[a-z0-9]+)*/gi
// wordRegex: /([a-z0-9]+)*/gi
}
});
word = sel.text();
sel.removeAllRanges();
sel.setSingleRange(initialCaretPositionRange);
} else {
word = "noRange";
}
console.debug("WORD=",word);
return word;
这仅在选择折叠时触发。 请注意,我必须处理起始偏移量的向后移动,因为如果插入符号位于单词的末尾(就像大多数用户键入时的情况一样),那么扩展函数不会围绕当前输入的单词。
到目前为止,这工作得很好,问题是它使用了具有TextRangeModule 的 Rangy 1.3 的 alpha 版本。问题是我注意到 wysihtml5 也在不同且不兼容的版本 (1.2.2) 中使用 Rangy(rangy.dom 的问题可能已被删除)。
由于 Rangy 使用全局 window.rangy 变量,我想我还是必须使用 1.2.2 版本。
如何仅使用 rangy 1.2.2 来实现 expand 的等效功能?
编辑:顺便问一下,除了使用expand 函数,还有其他解决方案吗?我认为修改当前选择并将其恢复回来只是为了知道当前输入的单词有点奇怪和笨拙。没有不涉及选择当前键入的单词的解决方案吗?我的意思是,一旦我们知道初始插入符号折叠范围,就只基于范围?
【问题讨论】:
标签: javascript dom rangy