JS手动触发PWA安装窗口

news2024/9/23 19:24:50

CSDN

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的博客
🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
🥭本文内容:JS手动触发PWA安装窗口


本文目录

  • PWA
  • JS手动触发PWA安装窗口
  • 按钮添加位置参考
    • 添加到社交图标栏
    • 添加到导航栏菜单


PWA

PWA(Progressive Web App)是一种理念,使用多种技术来增强 web app 的功能,可以让网站的体验变得更好,能够模拟一些原生功能,比如通知推送。在移动端利用标准化框架,让网页应用呈现和原生应用相似的体验。

其中我最喜欢的PWA功能就是可以将网页添加到桌面,就像原生应用一样,可以在桌面上创建快捷方式,通过缓存可以实现弱网使用,可以接收通知推送等等。

但是,PWA的安装需要用户点击浏览器的PWA安装按钮。对于不同的浏览器,这个按钮的位置可能有很大的差别,特别是在移动端,该按钮可能会被收纳到一堆浏览器设置选项中,找起来不是很方便;部分浏览器支持PWA,但却没有主动安装PWA的选项,想要安装网站的PWA必须等待网站弹出安装提示,而在移动端部分浏览器中PWA安装提示仅会在第一次弹出,如果用户错过了安装提示可能就无法安装PWA。

因此,我们希望能够将PWA安装按钮固定到网页中,这样用户就可以在任何时候都可以点击安装按钮来安装PWA。


JS手动触发PWA安装窗口

首先要保证自己的网站支持PWA,可以通过Google Lighthouse来检测自己的网站是否支持PWA。

接下来就可以配置PWA安装所需的JS函数了。

新建/source/js/installPWA.js

var deferredPrompt = null;

// 监听beforeinstallprompt事件,该事件在网站满足PWA安装条件时触发,保存安装事件
window.addEventListener("beforeinstallprompt", e => {
    e.preventDefault();
    deferredPrompt = e;
});

// 监听appinstalled事件,该事件在用户同意安装后触发,清空安装事件
window.addEventListener("appinstalled", () => {
    deferredPrompt = null;
});

// 手动触发PWA安装
function addToDesktop() {
    deferredPrompt.prompt();
}

_config.butterfly.yml中引用installPWA.js

inject:
  head:

  bottom:
+   - <script src="/js/installPWA.js"></script>

接下来你就可以使用addToDesktop()函数来手动触发PWA安装窗口了。


按钮添加位置参考

使用butterfly主题可以添加到社交图标栏中,或是导航栏菜单中。

添加到社交图标栏

我的网站将其添加到了社交图标栏中。

修改_config.butterfly.yml

# social settings (社交圖標設置)
# formal:
#   icon: link || the description
social:
+ fas fa-puzzle-piece: javascript:addToDesktop(); || PWA

除此之外还要修改/themes/butterfly/layout/includes/header/social.pug,为了社交图标按钮正常调用JS函数,需要将target="_blank"去掉。

each url, icon in theme.social
- a.social-icon(href=url_for(trim(url.split('||')[0])) target="_blank" 
+ a.social-icon(href=url_for(trim(url.split('||')[0]))
  title=url.split('||')[1] === undefined ? '' : trim(url.split('||')[1]))
    i(class=icon)

这项修改不会影响其他社交图标按钮的链接跳转功能。

效果如下:

社交图标按钮
点击后:

PWA安装

移动端Edge效果:

移动端社交图标按钮

点击后:

移动端PWA


添加到导航栏菜单

如果你不想将按钮添加到社交图标栏中,也可以将按钮添加到导航栏菜单中。

修改_config.butterfly.yml

menu:
+ PWA: javascript:addToDesktop(); || fas fa-puzzle-piece

无需进行其他修改。

除此之外,还可以将按钮添加到其他任何位置,只要能够调用JS函数即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

仿写Dubbo-初识Dubbo

概念 Dubbo 在Dubbo官网介绍到&#xff0c;Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题。 RPC RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用协议&#xff0c;一种通过网络从远程计算机上请求服务&#xff0c…

【Android】手机安装Termux运行nodejs学习Javascript编程入门

Termux 是运行在Android手机上的一个 Linux 终端模拟器&#xff0c;干什么都要输入命令执行&#xff0c;不像 Windows 操作系统桌面用鼠标点点点&#xff0c;这里主要介绍用它来学习Javascript编程入门&#xff0c;当然&#xff0c;这和小时候学过的C语言编程课入门一样的&…

C语言之程序设计概述

1.1.1 程序的概念 程序&#xff1a;算法 数据结构 程序设计方法 语言工具和环境数据结构&#xff1a;数据的类型和数据的组织方式算法&#xff1a;对数据操作的方法和步骤 1.1.2 程序设计语言的种类 第一代语言&#xff08;机器语言&#xff09;&#xff1a;执行效率高、…

【Leetcode每日一题】35.搜素插入位置|二分查找数组下标

&#x1f331;博主简介&#xff1a;大一计科生&#xff0c;努力学习Java中!热爱写博客~预备程序媛 &#x1f4dc;所属专栏&#xff1a;LeetCode每日一题–进击大厂 ✈往期博文回顾: 【JavaSE】保姆级教程|1万字10张图学会类与对象–建议收藏 &#x1f575;️‍♂️近期目标&…

【题解】2023牛客寒假算法基础集训营2

目录A. Tokitsukaze and abn (easy)思路B. Tokitsukaze and abn (medium)思路Tokitsukaze and abn (hard)思路D. Tokitsukaze and Energy Tree思路bfsdfsE. Tokitsukaze and Energy Tree思维F. Tokitsukaze and Gold Coins (easy)思路G. Tokitsukaze and Gold Coins (hard)H. T…

高效团队的gitlab flow最佳实践

当前git是大部分开发团队的首选版本管理工具&#xff0c;一个好的流程规范可以让大家有效地合作&#xff0c;像流水线一样有条不紊地进行团队协作。 业界包含三种flow&#xff1a; Git flowGithub flowGitlab flow 下面我们先来分析&#xff0c;然后再基于gitlab flow来设计一…

19、Javaweb案例-登录功能

项目导入 选择travel项目的pom.xml文件&#xff0c;点击ok&#xff0c;完成项目导入。需要等待一小会&#xff0c;项目初始化完成。 启动项目 方式一&#xff1a; 方式二&#xff1a;配置maven快捷启动 技术选型 Web层 Servlet&#xff1a;前端控制器html&#xff1a;视图Fi…

【c语言】数据结构-顺序表

主页&#xff1a;114514的代码大冒险 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 一、顺序表是什么&#xff1f; 二、项目功能的逐一实现&#xff08;基本&a…

Python-Flask-2023.1.22

1、WSGIweb server gateway interface一个框架定义的简单通用的接口Web服务器网关接口&#xff08;Python Web Server Gateway Interface&#xff0c;缩写为WSGI&#xff09;是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。flask框架内有默认的…

手写vue及源码解析一 rollup环境的搭建

开篇 都手写源码了&#xff0c;那就顺便分析一下源码吧。 rollup环境的搭建 作为了解就行。需要使用rollup来编译我们自己手写的vue代码。 需要安装rollup,rollup的babel插件&#xff0c;以及babel核心和babel预设&#xff08;可以理解为初始化模板&#xff09;。 mkdir vu…

Java变量定义时候的注意事项

常量定义的基本注意事项 在JAVA语言中&#xff0c;主要利用final关键字&#xff0c;&#xff08;在Java类中灵活使用static关键字&#xff09;来定义常量。 当常量被设定后&#xff0c;一般情况下就不允许在进行更改了&#xff0c;如可以利用以下的形式来定义常量&#xff1a;…

仿写Dubbo-Java Socket

概念 socket 被翻译为“套接字”&#xff0c;socket是计算机之间进行通信的一种方式。通过socket可以实现端(端口)到端通信。Java的java.net包中提供了进行socket通信的类。主要使用ServerSocket和Socket类实现通信。 ServerSocket 服务端应用使用java.net.ServerSocket类来获取…

Node.js 操作MongoDB (Mongoose) 数据库

在讲Node.js通过使用mongoose模块来操作MongoDB数据库之前首先是关于MongoDB数据库的安装和MongoDB服务以及对MongoDB命令行的操作和可视化工具MongoDBCompass的一个基本使用&#xff1b;那么在这里已经准备好了关于MongoDB数据库的内容了&#xff1a; MongoDB数据库安装详细 &…

学习shell与shell编程

Linux配置文件都是以ASCII的纯文本形式存在。 为什么学习vi 1)UnixLike系统都会内置vi文本编辑器&#xff0c;其他的文本编辑器则不一定存在 2)许多软件的编辑接口都会主动调用vi 3)vi具有程序编辑的能力&#xff0c;可以主动以字体颜色辨别语法的正确性 4)程序简单&#…

06-jquery函数

2.6函数 .6.1第一组函数 1 val():操作dom函数的value值 val()&#xff1a;没有参数&#xff0c;获取dom数组中第一个dom对象的value值。 val(参数)&#xff1a;有参数&#xff0c;给dom数组中所有dom对象的value属性赋值。 2 text()&#xff1a;操作标签文本内容&#xff0c;…

springCloud集成elk+filebeat+kafka+zipkin实现多个服务日志链路追踪聚合到es

一、目的 如今2023了&#xff0c;大多数javaweb架构都是springboot微服务&#xff0c;一个前端功能请求后台可能是多个不同的服务共同协做完成的。例如用户下单功能&#xff0c;js转发到后台网关gateway服务&#xff0c;然后到鉴权spring-sercurity服务&#xff0c;然后到业务…

【实操案例十一】使用try-except手动捕获异常 实例代码及运行效果图!

任务一&#xff1a; 编写程序输入学员成绩 异常捕获忘了的同学&#xff0c;可以参考这个&#xff1a;Bug的常见类型及异常处理机制 # 任务一&#xff1a; 编写程序输入学员成绩iint(input(请输入学员成绩&#xff1a;)) if 0<i<100:print(i) else:raise Exception(分数…

产品设计-基础控件-信息输入控件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 产品设计-基础控件-信息输入控件1.1.文本框一、1.1.11.1.2、占位符文本1.1.3 输入框1.1.4 帮助文本1.1.5 初始默认值1.1.6 输入文本1.1.7 跟踪图标1.1.8 格式化标记1.2 单选按…

java枚举类2023028

一个类的对象是有限而且固定的&#xff0c;比如季节类&#xff0c; 它只有4个对象&#xff1b;再比如行星类&#xff0c;目前只有8个对象。这种实例有限而且固定的类&#xff0c;在Java里被称为枚举类。在早期代码中&#xff0c;可能会直接使用简单的静态常量来表示枚&#xff…

设计模式 - 六大设计原则之OCP(开闭原则)

文章目录概述Case接口定义接口实现Bad ImplBetter Impl概述 Open-Close Principle 在面向对象编程领域中&#xff0c;开闭原则规定软件中的类、对象、模块和函数对扩展应该是开放的&#xff0c;但对修改是封闭的。 这意味着 应该用抽象定义结构&#xff0c;用具体实现扩展细节…