我正在尝试构建一个简单的 Safari 应用程序扩展。在 about:blank
上,我从扩展的资源文件夹中加载了一个 html 页面。以下是相关代码。
//script.js - injected script
if(window.location.href=="about:blank"){
window.location.href = safari.extension.baseURI + "page.html";
}
我想在这个加载的页面和 safari 应用程序之间进行通信。显然注入(inject)的脚本 script.js
在加载的 html 页面上不可用。
我尝试将 script.js
链接到内联 html 页面,但是 safari
对象本身对于 safari.extension.dispatchMessage
不可用,或者safari.self.addEventListener
。
编辑:
有了这个(注入(inject)的脚本 script.js 在页面加载的加载的 html 页面/选项卡上不可用)我的意思是在资源选项卡中打开 Web 检查器时我们看不到任何 extension scripts
最佳答案
如果我正确理解您的问题,您需要在页面的 javascript 和 Safari 应用程序扩展的 native 主机应用程序之间进行通信。只能使用 API safari.extension.dispatchMessage 联系主机应用程序,该 API 只能从注入(inject)的 script.js 脚本访问,不能从页面的 JS 访问。
您可以通过从页面发送请求事件并注册响应事件来解决此问题。您的 HTML 页面将包含脚本:
function sendEventToInjected() {
var storeEvent = new CustomEvent('myCustomEvent', {"detail": "testData"});
document.dispatchEvent(storeEvent);
var responseEventID = 'myResponseEvent';
document.addEventListener(responseEventID, function respListener(event)
{
console.log("Got data from injected script: " + event.detail);
document.removeEventListener(responseEventID, respListener);
});
}
您的 script.js 将通过注册事件监听器来捕获此事件,然后可以将数据传递到扩展的 native 主机应用程序。获取 native 主机的响应后,可以将响应事件派发回页面。
document.addEventListener("myCustomEvent", function(event) {
console.log("myCustomEvent:" + event.detail);
safari.extension.dispatchMessage(event.detail);
});
// Listens for messages sent from the app extension's Swift code.
safari.self.addEventListener("message", messageHandler);
function messageHandler(event)
{
var resp = {detail: "respData"};
var respEvent = new CustomEvent('myResponseEvent', resp);
document.dispatchEvent(respEvent);
}
关于javascript - 如何在 safari 应用程序和从 safari 应用程序扩展资源文件夹加载的 html 页面之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52493700/