我正在尝试在Word加载项中实现一项功能,该功能可以跟踪用户在MS Word中键入的内容,然后执行自动替换。例如,用户可以输入
:smile: :frown:
并且我会自动将其替换为
:) :(
我已经实现了一个处理程序来接收documentSelectionChanged
事件,并且我目前正在使用以下事件处理程序:
function eventHandler() {
var range, results;
Word.run(function (context) {
range = context.document.getSelection();
range.load('paragraphs');
return context.sync().then(function() {
var par = range.paragraphs.items[0];
console.log(par.text);
//results = par.search(':smile:');
results = par.search(':*:', {matchWildCards: true});
context.load(results);
return context.sync().then(function() { # ERROR HERE
console.log(results.items.length);
});
});
});
}
使用此代码,每次用户键入一个字符,我都可以获取当前段落的文本。您可以在上面看到我将其编写为控制台,并且该部分有效。
之后的代码在我不进行通配符搜索时有效(该行在上面被注释掉了,但是当我进行通配符搜索时,出现了错误:
未处理的承诺拒绝:RichApi.Error:发生内部错误。 (word-mac-16.00.js 13716)
知道为什么通配符搜索不起作用?
我根据在SO上看到的一些答案尝试了另一个变体:
function eventHandler2() {
var range, results, par;
Word.run(function (context) {
range = context.document.getSelection();
range.load('paragraphs');
return context.sync()
.then(function() {
par = range.paragraphs.items[0];
console.log(par.text);
results = par.search(':*:', {matchWildCards: true});
context.load(results);
results.load('text');
})
.then(context.sync())
.then(function() {
console.log(JSON.stringify(results));
});
});
}
使用此版本,我不再遇到任何错误,但是消息中没有results.items
:
PropertyNotLoaded:属性'items'不可用。在读取属性的值之前,请在包含的对象上调用load方法,并在关联的请求上下文上调用“ context.sync()”。
似乎我已经做了这些事情,但无济于事。 :(
Range.paragraphs是一个收集对象,您无法加载收集对象,因此range.load('paragraphs')
不会执行任何操作。为了读取段落集合的项目,您必须加载项目(或段落对象的某些属性)。试试:
range.paragraphs.load('items');