我正在使用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中。
如何触发应该正确执行的事件?
答案 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 Commands和Step 6 of Excel tutorial。