我正在尝试创建一个预输入代码以添加到 wysihtml5 富文本编辑器。
基本上,我需要能够插入人员/标签引用,例如 Twitter/Github/Facebook...。
我发现一些人试图实现同样的事情的代码。
http://jsfiddle.net/A9z3D/ http://jsfiddle.net/A9z3D/
这工作得很好,除了它只对最后一个词做建议并且有一些错误。而且我想要一个像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;
仅当选择折叠时才会触发此操作。
请注意,我必须处理起始偏移量的向后移动,因为如果插入符号位于单词的末尾(就像用户键入时的大多数情况一样),那么扩展函数不会围绕单词展开当前输入的单词。
到目前为止,这工作得很好,问题是它使用了 Rangy 1.3 的 alpha 版本,该版本具有文本范围模块 http://code.google.com/p/rangy/wiki/TextRangeModule。问题是我注意到 wysihtml5 也在不同且不兼容的版本(1.2.2)中使用 Rangy(问题与rangy.dom
这可能已被删除)。
由于 Rangy 使用全局 window.rangy 变量,我想无论如何我都必须使用版本 1.2.2。
我怎样才能做相当于expand
功能,仅使用 rangey 1.2.2?
Edit: 顺便问一下,除了使用之外还有其他解决方案吗?expand
功能?我认为修改当前选择并将其恢复回来只是为了知道当前输入的是哪个单词,这有点奇怪和哈克式。是否有一个不涉及选择当前输入的单词的解决方案?我的意思是,一旦我们知道初始插入符号折叠范围,就仅基于范围?