[最初的标题是:在Ace编辑器中阻止键盘操作,但抓住它们]
我使用Ace Editor来创建一个实时协作平台。我发现的问题或多或少与我的here或there相似,但它们都不适合我的情况。
如果有多个用户在写作,则会发生此事件:
editor.getSession().on('change', function(e) {
// action = e.action
// newString = e.lines
// index = editor.session.doc.positionToIndex(editor.selection.getCursor())
}
当用户想要输入内容(按键事件)时,我想捕捉操作,添加或删除的内容以及光标的索引(不是(row, col)
)。在此步骤中应插入或删除 。这三个参数应该是函数sendDelta(action, string, index)
的输入。
为简化起见,函数sendDelta(action, string, index)
应调用负责插入的insertDelta(action, string, index)
。但是这种插入不应该唤醒内容更改的事件。
总而言之,我只想捕捉键盘的内容,而不是通过函数insertDelta(action, string, index)
完成的插入。
修改
正如@a_user建议的那样,我认为我的应用程序的设计没有意义。所以我想问一个与第一个问题非常接近的问题。
假设我有一个函数changeFromServer(action, string, index)
,它从网络接收信息并应用更改。然后插入将触发on change change事件,该事件将信息发送回网络。这将创建一个无限循环。
我不确定我的解释是否清楚。如果没有,this user和我有同样的问题,他的描述看起来比我好。顺便说一句,我不明白那里提供的答案。
答案 0 :(得分:0)
使用标志来了解何时从changeFromServer调用change事件
var fromServer = false
function changeFromServer() {
fromServer = true
// call applyDelta here
fromServer = false
}
doc.on("change", function(e) {
if (fromServer) return;
})