如何使用 JavaScript 中的服务工作线程操作 DOM?

javascriptweb developmentfront end technology

在本教程中,您将了解使用服务工作线程进行 JavaScript DOM 操作。

当我们更改文档对象模型 (DOM) 的结构和元素时,就会发生 DOM 操作。我们可以通过添加、删除、更改或修改元素及其属性来修改 DOM。

什么是服务工作线程?

服务工作线程的工作方式类似于 Web 浏览器和 Web 服务器之间的代理服务器。如果用户的浏览器不支持服务工作线程,它会增强现有网站的功能,但他访问任何使用服务工作线程的网站时,也不会影响任何功能。

它作用于 Web 应用程序、浏览器和网络(如果网络已连接)。服务工作者通过提供离线访问来提高网站的可靠性,在没有网络的情况下拦截网络请求并采取相应的行动,它更新驻留在服务器上的组件并提高性能。

服务工作者的概念和用途

服务工作者是对现有网站的增强。它是一个事件驱动的工作者,以可以控制网站的 JavaScript 文件的形式工作。服务工作者在工作者上下文中运行是它没有 DOM 访问权限的原因,它在后台执行,在与 JavaScript 主线程不同的线程中,这就是它非阻塞异步的原因。

服务工作者使用缓存,这使得在没有网络的情况下可以离线运行。

在 JavaScript 中使用服务工作者

服务工作者处理网络请求和一些异步事件。因此,它使用了承诺和异步编程。

让我们看看如何注册服务工作者。

由于所有浏览器仍然不支持服务工作者,因此要注册服务工作者,我们应该首先进行未来检查。因此,我们检查服务工作者是否存在于导航器中。

然后要注册服务工作者,我们调用方法 navigator.serviceWorker.register(),并在方法内部,我们将路径传递给服务工作者,此函数返回一个承诺,因为服务工作者是一个异步事件。

if ("serviceWorker" in navigator) {
    navigator.serviceWorker
    .register("service-worker.js")
    .then(function (reg) {
	
    })
    .catch(function (err) {
        // 服务工作者注册失败。
    });
}

当 Promise 返回成功消息时,我们就可以执行要执行的任务。

Service Worker 的一些标准事件

  • Install

  • Activate

  • Fetch

  • Push

  • Sync

Safari 浏览器不支持推送,大多数浏览器也不支持同步。

预缓存

当 Service Worker 在安装事件中注册时,预定义的资产文件将在请求之前被缓存。

Service-worker.js 文件代码

console.log('Started', self);
self.addEventListener('install', function(event) {
   self.skipWaiting();
   console.log('Installed', event);
});
self.addEventListener('activate', function(event) {
   console.log('Activated', event);
});
self.addEventListener('push', function(event) {
   console.log('Push message received', event);
});

安装事件只会调用一次,直到服务工作者更新为止。

下一个事件是"激活"。因此,服务工作者在安装后不会立即激活。

下一个事件是推送。MDN 表示,当服务工作者收到推送消息时,会将事件发送到服务工作者的全局范围(由 ServiceWorkerGlobalScope 接口表示)

让我们使用程序操作 DOM 元素

在这里,我们将更改文本颜色并在服务工作者成功注册后发送警报消息。

创建 service-worker.js 文件并添加以下代码 -

console.log('Started', self);
self.addEventListener('install', function(event) {
   self.skipWaiting();
   console.log('Installed', event);
});
self.addEventListener('activate', function(event) {
   console.log('Activated', event);
});
self.addEventListener('push', function(event) {
   console.log('Push message received', event);
});

示例

Index.html file

<html>
<head>
   <title>How to get/change the HTML with DOM element in JavaScript?</title>
</head>
<body>
   <h2 id="tut">Change Here</h2>
   <button type="button" onclick="ServiceWorker_Update_dom_Ele()">Get HTML for DOM element</button>
   <script>
      function ServiceWorker_Update_dom_Ele() {
         if ("serviceWorker" in navigator) {
            navigator.serviceWorker
            .register("service-worker.js")
            .then(function (reg) {
               var Element = document.getElementById("tut");
               alert("Service worker registeration successful");
               Element.style.color = "Red";
               Element.innerHTML = "Tutorials Point";
            })
            .catch(function (err) {
               alert("registration failed");
            });
         }
      }
   </script>
</body>
</html>

记住

Service Worker 仅在 https 或 localhost 等安全模式下运行,因此在 file:// 或 http 中运行 Service Worker 代码将不起作用。您可以在 vs code 中打开实时服务器以使 Service Worker 工作。

所以,您最终了解了 Service Worker 以及操作 DOM 元素的方法。


相关文章