1

我正在将 Opa 用于一个学校项目,其中必须在几个用户之间对文本字段进行一些同步。解决此问题的简单方法是,只要其中一位用户执行更改,就传输完整的字段。更好的方法当然是只传输更改。

我的想法是在文本字段中使用插入符号位置。当用户键入时,可以根据插入符号的位置(只是插入符号之前的字符)获取最后键入的字符。DOM 元素有一个易于使用的字段,称为 selectionStart。我有这个小Javascript:

document.getElementById('content').selectionStart

如果插入符号位于字段中的第五个字符,则正确返回 5。在 Opa 中,我不能在 DOM 或 dom_element 上使用 selectionStart,所以我想我会写一个小插件。结果是这样的:

##extern-type dom_element

##register jsGetCaretPosition: dom_element -> int
##args(node)
{
    return node.selectionStart;
}

这与 opp-builder 一起编译没有任何问题,当我将这一小行代码放入我的 Opa 脚本时:

#pos = %%caret.jsGetCaretPosition%%(Dom.of_selection(Dom.select_id("content")));

这也可以毫无问题地编译。但是,当我运行脚本时,它总是返回“未定义”,我不知道我做错了什么。我查看了 API,Dom.of_selection(Dom.select_id("content"))看起来是获取相应 dom_element 类型数据以提供给插件的正确方法。插件返回“未定义”的事实似乎表明所选元素不知道成员“selectionStart”,尽管我在 Javascript 中的测试代码另有建议。任何人都可以帮忙吗?

4

1 回答 1

1

在 Opa dom_element 中是 jQuery 选择的结果(即 dom 节点数组)。因此,如果我很好地理解了您的程序,您应该编写类似的东西node[0].selectionStart而不是node.selectionStart.

此外,您应该注意不包含 textarea 节点的空选择和选择(没有 selectionStart 属性)。也许正确的代码是tmp == undefined ? -1 : tmp = node[0].selectionStart == undefined ? -1 : tmp

于 2013-01-04T10:04:08.970 回答