我正在尝试确定用户是否点击了另一段。 我的方法:之前选择的段落作为 Range 对象存储在本地,以便在发生另一次点击时与稍后进行比较。
这是获取所选段落的代码:
export const getSelectedParagraphRange = async () => {
return await Word.run(async (context) => {
const range = context.document
.getSelection()
.paragraphs.getFirst()
.getRange()
return range
})
}
这是比较范围的代码:
export const isParagraphStillActive = async (range: Word.Range) => {
return await Word.run(async (context) => {
const newRange = context.document
.getSelection()
.paragraphs.getFirst()
.getRange()
const compare = range.compareLocationWith(newRange)
await context.sync()
return compare.value === 'Equal'
})
}
如果我将 newRange 与其自身进行比较,它会起作用(我得到一个值为“Equal”的比较对象)。 但是,如果我将参数范围与自身进行比较,它就不起作用(函数只是“停止”而没有抛出错误等)。
所以我的猜测是应该比较的范围对象必须直接从函数内部获取?如果是这样,那么我想知道如何将以前选定的段落与新选定的段落进行比较? 非常感谢任何帮助。
更新:
感谢学习提到的 Building Office Add-ins 一书,我设法完成了段落比较工作。 getSelectedParagraphRange 函数缺少通过调用 range.track() 来跟踪范围对象。此外,在将新段落设置为当前段落时,必须取消跟踪范围。 (我根本不知道隔离上下文范围背后的原则)。
这是工作代码:
export const getSelectedParagraphRange = async (formerRange?: Word.Range) => {
return await Word.run(async (context) => {
if (formerRange) {
formerRange.untrack()
await context.sync()
}
const range = context.document
.getSelection()
.paragraphs.getFirst()
.getRange()
range.track()
await context.sync()
return range
})
}
export const isParagraphStillActive = async (range: Word.Range) => {
return await Word.run(range, async (context) => {
const newRange = context.document
.getSelection()
.paragraphs.getFirst()
.getRange()
const compare = range.compareLocationWith(newRange)
await context.sync()
return compare.value === 'Equal'
})
}
您需要将
range
对象传递给以对象作为第一个参数的Word.run
的重载。
export const isParagraphStillActive = async (range: Word.Range) => {
return await Word.run(range, async (context) => {
const newRange = context.document
.getSelection()
.paragraphs.getFirst()
.getRange()
const compare = range.compareLocationWith(newRange)
await context.sync()
return compare.value === 'Equal'
})
}
参见Word.run。对于像这样的高级场景,我还推荐这本书Building Office Add-ins。