Rangy:插入符号下的单词(再次)

2024-05-16

我正在尝试创建一个预输入代码以添加到 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功能?我认为修改当前选择并将其恢复回来只是为了知道当前输入的是哪个单词,这有点奇怪和哈克式。是否有一个不涉及选择当前输入的单词的解决方案?我的意思是,一旦我们知道初始插入符号折叠范围,就仅基于范围?


由于 Rangy 使用全局 window.rangy 变量,我想无论如何我都必须使用版本 1.2.2。

阅读了 Rangy 的代码后,我的直觉是在同一页面中加载两个版本的 Rangy 可能是可行的。我用谷歌搜索了一下,发现我是对的。 Tim Down(Rangy 的创造者)在一篇文章中解释了这一点问题报告 https://code.google.com/p/rangy/issues/detail?id=51。他举了这样一个例子:

<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.

否则,必须实施expand忠实地复制 Rangy 1.3 所做的事情并不是一件简单的事情。

这是一个极其原始的代码实现,它将选择扩展到单词边界。此代码将被单词内开始或结束的元素触发。

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 http://jsfiddle.net/lddubeau/V7Lxk/为了它。这应该适用于远程 1.2.2。 (它甚至可以在没有范围的情况下工作。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rangy:插入符号下的单词(再次) 的相关文章

随机推荐

  • 内置和可加载模块的 __init 和 __exit 宏用法

    我正在阅读有关linux内核开发的内容 我刚刚读了一些我不明白的文字 以下段落讨论了模块的 init 和 exit 宏 这演示了内核 2 2 及更高版本的一个功能 注意变化 在 init 和 cleanup 函数的定义中 init 宏 导致
  • Android 发布到 facebook 墙,stream.publish 几天来就中断了

    我有很多使用 FB android sdk 发布的应用程序 github com facebook facebook android sdk 我所有使用 FB 的应用程序几天后就停止工作了 这必然是 FB 方面的更改或错误 因为我的应用程序
  • Node 不断恢复到旧版本

    每次我在控制台中重新启动 vagrant 时 它都会询问我的登录详细信息 然后说Now using node v7 10 0 npm v4 2 0 当我做run nvm install node I get v13 11 0 is alre
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • Struts 1 到 Spring 迁移 - 策略

    我有一个legacy银行应用程序编码为Struts 1 JSP现在的要求是迁移后端 目前为 MVC to Springboot MVC 后续UI JSP 将迁移到angular Caveats 1 后端不是无状态的 2 会话对象中存储了大量
  • SQL 查询将文本数据存储在 Varbinary(max) 中

    有没有办法让 varbinary 在 SQL Server 中接受文本数据 这是我的情况 我有相当大量的 XML 我计划以 压缩 格式存储它们 这意味着 Varbinary 但是 当我进行调试时 我希望能够翻转配置开关并以纯文本形式存储 以
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • Python“非规范化”unicode 组合字符

    我正在寻找标准化 python 中的一些 unicode 文本 我想知道是否有一种简单的方法可以在 python 中获得组合 unicode 字符的 非规范化 形式 例如如果我有序列u o xaf i e latin small lette
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • Facebook API - fql_query,无效会话

    我正在尝试使用 PHP 库查询 Facebook 我读到的内容不应该需要会话密钥 或者更确切地说 对于我的情况 它不应该需要会话密钥 但下面的代码给出了以下错误 Session密钥无效或不再有效 http wiki developers f
  • (Rails) Assert_Select 的烦人警告

    有谁知道如何让assert select在rake测试期间不输出所有那些讨厌的html警告 你知道 就像这样的东西 ignoring attempt to close body with div opened at byte 1036 li
  • 如何在 JPA 和 Hibernate 中将数据库生成的列值定义为只读字段?

    使用 MariaDB 10 2 可以定义日期时间的默认值 例如创建和最后修改 我应该如何将此列作为只读字段访问 因为这个值应该只在数据库的控制之下 并且不应该从代码中修改 但我想在代码中读取这个属性 这很简单 只需设置insertable
  • 如何使用 ffmpeg 将两个视频/音频流混合为一个

    我有两个视频 v1 flv 和 v2 flv 想要创建 v3 flv 其中包含来自 v1 flv 的视频流以及来自 v1 flv 和 v2 flv 的 混合 音频流 使用 ffmpeg 命令可以实现类似的操作吗 谢谢 我认为使用 ffmpe
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • Windows 2000 说超时不是命令或批处理文件

    我只是在摆弄 CMD 并制作动画 ASCII 艺术 我一直在尝试在 Windows 2000 笔记本电脑上使用 超时 命令 但是每次我尝试这样做时 它只是说它不是内部或外部命令或批处理文件 这是一台运行 Windows 2000 的旧东芝
  • 使用 attr_accessor 动态创建类属性

    在Ruby中 有没有办法动态地将实例变量添加到类中 例如 class MyClass def initialize create attribute name end def create attribute name attr acces
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 联合数据类型上的条件数据类型

    假设您有以下类型 type Foo prop1 foo prop2 null type Bar prop1 bar prop2 number type FooOrBar Foo Bar 是否可以使用条件类型重写上述代码 我已经尝试过以下方法
  • 在 Visual Studio 2017 的现有实例中打开文件

    我曾经能够在 VS 的现有实例中打开文件 devenv exe had a dde为此切换 但在 VS2017 中 它会在新实例中打开文件 而不是在已经运行的实例中 例如对于 json 文件 我的注册表有一个密钥HKEY CLASSES R
  • Rangy:插入符号下的单词(再次)

    我正在尝试创建一个预输入代码以添加到 wysihtml5 富文本编辑器 基本上 我需要能够插入人员 标签引用 例如 Twitter Github Facebook 我发现一些人试图实现同样的事情的代码 http jsfiddle net A