- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个预输入代码以添加到 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;
这仅在选择折叠时触发。请注意,我必须处理起始偏移量的向后移动,因为如果插入符号位于单词的末尾(就像用户键入时大多数情况下的情况一样),则扩展函数不会围绕当前输入的单词。
到现在为止它工作得很好,问题是它使用了 Rangy 1.3 的 alpha 版本,它有 TextRangeModule .问题是我注意到 wysihtml5 也在不同且不兼容的版本 (1.2.2) 中使用 Rangy(rangy.dom
的问题可能已被删除)。
由于 Rangy 使用全局 window.rangy 变量,我想无论如何我都必须使用版本 1.2.2。
如何仅使用 rangy 1.2.2 来执行与 expand
函数等效的操作?
编辑:顺便问一下,除了使用expand
函数还有其他解决方案吗?我认为修改当前选择并将其还原只是为了知道当前键入的是哪个单词有点奇怪和古怪。有没有不涉及选择当前键入的单词的解决方案?我的意思是,一旦我们知道初始插入符折叠范围,就只基于范围?
最佳答案
As Rangy uses a global window.rangy variable, I think I'll have to use version 1.2.2 anyway.
阅读了 Rangy 的代码后,我的直觉是,在同一页面中加载两个版本的 Rangy 可能是可行的。我做了谷歌搜索,发现我是对的。 Tim Down(Rangy 的创建者)在 issue report 中对此进行了解释.他举了这个例子:
<script type="text/javascript" src="/rangy-1.0.1/rangy-core.js"></script>
<script type="text/javascript" src="/rangy-1.0.1/rangy-cssclassapplier.js"></script>
<script type="text/javascript">
var rangy1 = rangy;
</script>
<script type="text/javascript" src="/rangy-1.1.2/rangy-core.js"></script>
<script type="text/javascript" src="/rangy-1.1.2/rangy-cssclassapplier.js"></script>
因此您可以加载您的代码 需要的 Rangy 版本。重命名它并在您的代码中使用此名称,然后加载 wysihtml5 想要的内容并将 this 版本保留为 rangy
。
否则,必须以忠实复制 Rangy 1.3 所做的方式自己实现 expand
并不是一件简单的事情。
这是一个非常原始的代码实现,可以将选择范围扩展到单词边界。此代码将被以单词开头或结尾的元素触发。
var word_sep = " ";
function expand() {
var sel = rangy.getSelection();
var range = sel.getRangeAt(0);
var start_node = range.startContainer;
if (start_node.nodeType === Node.TEXT_NODE) {
var sep_at = start_node.nodeValue.lastIndexOf(word_sep, range.startOffset);
range.setStart(start_node, (sep_at !== -1) ? sep_at + 1 : 0);
}
var end_node = range.endContainer;
if (end_node.nodeType === Node.TEXT_NODE) {
var sep_at = end_node.nodeValue.indexOf(word_sep, range.endOffset);
range.setEnd(end_node, (sep_at !== -1) ? sep_at : range.endContainer.nodeValue.length);
}
sel.setSingleRange(range);
}
这是一个 fiddle为了它。这应该适用于范围 1.2.2。 (它甚至可以在没有 rangy 的情况下工作。)
关于javascript - Rangy:插入符号下的单词(再次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22076945/
我正在尝试将 textAngular 实现到我的 Angular.js 项目中,该项目是使用 browserify 打包的。 我通过 npm 安装了 rangy 和 textAngular。它们是这样
我正在使用 Rangy 来选择并恢复光标位置。 它做得非常出色,但它并不是为以编程方式操作用户输入并且在 DIV 的 innerHTML 中替换较短的字符串而设计的。 我在 jsbin 上创建了一个示
被选中的html: some text here is bolded, I guess |______________________| ere is bolded, I
我已经用 rangy 尝试了无数种方法,下面是我最接近的方法。在 chrome 和 IE8 中完美运行(就像我尝试过的许多其他版本一样),但 firefox 坚决拒绝玩球。 test() 函数应用于在
我正在使用 highlighter module in Rangy . 我有一个 div 元素,它有一些 html。 html 实际上是使用 ajax 从文件加载的,我有一个执行此加载的按钮。 加载文
我正在使用 Rangy帮助网站中的一些文本突出显示功能。简而言之,用户可以选择一些文本,突出显示文本(通过按钮单击),并且用户可以通过这种方式创建多个突出显示。 亮点被保存到数据库中,并且在 futu
我的代码: var cssApplier; window.onload = function () { rangy.init(); cs
我有一个 contenteditable div,我想将范围移动到当前范围之后的一个字符。 我现在想检查插入符后面的字符是否是某个字符,如果是则在它后面放置插入符 我使用了这段代码,但它不起作用 p
我正在尝试在我的 Google Chrome 扩展程序中使用 Rangy,但我一直收到错误消息“不支持模块‘WrappedSelection’”。这是一个简单的扩展,所以我没有在这个项目中实现除 Ra
我正在尝试创建一个预输入代码以添加到 wysihtml5 富文本编辑器。基本上,我需要能够像 Twitter/Github/Facebook 那样插入人物/主题标签引用……做。 我发现一些人的代码试图
我想做什么: ->向用户显示纯 HTML 页面->用户可以突出显示该页面上的文本->当用户下次登录时,我应该能够检索并在页面上显示他以前的(多个)突出显示。 我做了什么: 我使用了Library/AP
我有一个刚刚插入到 DOM 中的常规文本节点。 我想使用 Javascript 或 Rangy 选择它(就像用户用鼠标物理选择它一样)。 我有以下(我认为很丑)代码: // inser
我在一个 contenteditable div 中有几个 a 元素。如何将键盘插入符放在由 id 标识的特定元素的末尾,然后使用 Rangy 将其移动到 div 的末尾? 提前致谢,感谢您的帮助。
我有以下代码片段将插入符号设置为给定索引 index var el = $("#subjectMessage"), index = 9 ; var range = rangy.createRange(
我正在使用 rangy库,并且可以选择内容中的文本,如下所示: var sel = rangy.getSelection(); alert(sel); 我不知道如何获取选定的文本父节点/元素。例如,如
我正在尝试最新版本的“rangy”jQuery 插件(1.2 beta),以在具有特定偏移量的可内容编辑 DIV 中设置插入符号。 但是,它在 Firefox 中响应一个奇怪的错误:安全错误”代码:“
为什么当使用函数highlighter.highlightSelection (marktype) 做的注释数量越来越多时,rangy 变得更加迟缓?一开始性能非常好,但随着注释的增加性能会下降。 那
我正在尝试查找已保存的范围选择的 markerId 值。 我试过以下方法: marker = savedSel.rangeInfos; console.log(marker.markerId); 但它
我一直在使用 Rangy.js 来选择范围,到目前为止我非常喜欢它。我希望将选择范围的文本节点包裹在某个标记内,并在单击按钮时切换它。我使用 cssClassApplierModule 时效果很好,除
我需要你关于 rangey 图书馆的帮助。 如何在 iframe 选定的内容中应用范围,我无法理解(( 我页面中的这段代码使用所有 iframe 内容创建红色粗体选择,但我需要将其仅应用于用户选择 v
我是一名优秀的程序员,十分优秀!