需要从CustomTab Word Web Add-in控制TaskPane

时间:2018-06-15 06:22:21

标签: javascript office-js office-addins word-web-addins

我正在使用CustomTab和TaskPane开发Word Web加载项。 从Manifest.xml文件我通过ExecuteFunction触发事件到JavaScript函数 JS功能受到欢迎,但TaskPane UI上没有发生更新

的Manifest.xml

<FunctionFile resid="Contoso.FunctionFile.Url" />
<bt:Urls>
    <bt:Url id="Contoso.FunctionFile.Url" DefaultValue="~remoteAppUrl/Home.html" />
</bt:Urls>
<Action xsi:type="ExecuteFunction">
    <FunctionName>appendText</FunctionName>
</Action>

的JavaScript

function appendText() {
    var count = 10;
    $("#main").append(count);
}

HTML

<div style="width:100%" id="main"></div>

相同的JQuery函数在正常的按钮单击函数调用中工作,它存在于TaskPane中。

如何触发应该正确执行的事件?

1 个答案:

答案 0 :(得分:0)

函数文件HTML及其调用的JavaScript文件在任务窗格的完全独立的执行上下文中运行。如果我了解您已完成的操作,则将home.html设置为您的FunctionFile 作为任务窗格主页。如果这样做,则在调用FunctionFile时,您正在加载home.html的第二个副本(并且我认为第二个副本将是不可见的,因为函数文件从不显示UI)。您的append方法正在处理页面的第二个实例,而不是任务窗格中的实例。

我能想到从函数文件(应该是无UI页面)与任务窗格进行通信的最佳方式是使用LocalStorage。您的appendText方法应该使用诸如“count”之类的键在LocalStorage中存储值“10”。任务窗格中的JavaScript需要从LocalStorage读取“count”并将其值附加到#main。

如果您需要以自动方式进行此操作,那么在LocalStorage中检查“count”的任务窗格中的代码应该在定时循环中运行。

更新6/16/18: 回应OP的评论: 这里有两种不同的执行上下文;也就是说,Internet Explorer的两个不同实例及其嵌入式JavaScript引擎:

首先,有一个任务窗格home.html的主页。它有一个UI,它加载JavaScript。

其次,功能区按钮启动了FunctionFile.html。这应该是不同的HTML页面,而不是任务窗格的主页。这个页面应该没有UI;其正文中没有可见的HTML元素。它应该加载JavaScript。这应该是与任务窗格主页加载的JS文件不同的JS文件。您不想加载同一文件的两个副本。调用此页面时,不会打开IE窗口或任务窗格。它从未见过。

这两个IE实例彼此不了解。他们只能通过写入和读取机器的本地存储进行通信。因此,如果您希望自定义选项卡上的按钮调用的JavaScript更改任务窗格中页面中的DOM元素,则只能通过LocalStorage传递信号来执行此操作。

FunctionFile.html加载的JavaScript应该将“count”值存储在LocalStorage中,不再执行任何操作。此文件中的JavaScript无法处理主页中的DOM元素,因为该DOM位于完全不同的IE实例中。

主页加载的JavaScript应该从LocalStorage读取“count”值并将其附加到主页DOM中的#main元素。

因此,写入LocalStorage的JavaScript和读取LocalStorage的JavaScript在不同的JavaScript文件中运行在不同的IE实例中。

如果您还没有,请参阅Add-in CommandsStep 6 of Excel tutorial