【问题标题】:Listening for button click in PWA service worker在 PWA 服务工作者中侦听按钮单击
【发布时间】:2018-08-28 22:20:39
【问题描述】:

我正在尝试遵循以下 PWA 推送通知示例,但有一个关于服务人员的一般性问题

https://developers.google.com/web/fundamentals/codelabs/push-notifications/

在我的 Service Worker 中,我想为按钮/锚标记添加一个监听器

我的 Service Worker 初始化如下:

if ("serviceWorker" in navigator && "PushManager" in window) {
    navigator.serviceWorker
        .register("./scripts/my.serviceworker.js", { scope: "/" })
        .then(function (swReg) {
            console.log("Service Worker Registered: ", swReg);
            swRegistration = swReg;
            initializeUI();
        });
};

并且函数initializeUI()需要包含一个点击事件的监听器,以便用户可以订阅/取消订阅

function initializeUI() {
    var pushButton = document.querySelector(".pwa-pushbutton");
    pushButton.addEventListener("click", function () {
        console.log("Button pushed");
        if (isSubscribed) {
            // TODO: Unsubscribe user
        } else {
            subscribeUser();
        }
    });

但是 pushButton 变量没有定义。

如何在我的 Service Worker JS 文件中向 DOM 上的元素添加侦听器事件?

【问题讨论】:

  • 嗯.. 实际上这段代码应该可以工作。据我了解,您的代码 initializeUI() 不在您的 serviceworker.js 文件中,因此应该可以访问 dom。

标签: javascript dom service-worker progressive-web-apps


【解决方案1】:

Service Worker 不能直接监听 DOM,也不能直接与 DOM 交互。所有 DOM 活动(如点击)都需要通过 postMessage() 发送给 Service Worker

应用:

function onClick(event => {
  navigator.serviceWorker.controller.postMessage({
    value1: 'hello',
    value2: 'there'
  });
})

服务工作者:

self.addEventListener('message', event => { 
  const val1 = event.data.value1,
        val2 = event.data.value2;
});

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 2012-01-21
相关资源
最近更新 更多