js 在web页面中判断某程序是否安装,未安装则下载

近期拿到一个需要,需要在web页面中判断我们的一个程序是否安装,未安装则下载

直接上代码

 //检查是否安装程序 begin
function check(uri, failCb, successCb, unsupportedCb) {
    function failCallback() {
        failCb && failCb();
    }
 
    function successCallback() {
        successCb && successCb();
    }
 
    if (navigator.msLaunchUri) { //for IE and Edge in Win 8 and Win 10
        openUriWithMsLaunchUri(uri, failCb, successCb);
    } else {
        var browser = checkBrowser();
 
        if (browser.isFirefox) {
            openUriUsingFirefox(uri, failCallback, successCallback);
        } else if (browser.isChrome || browser.isIOS) {
            openUriWithTimeoutHack(uri, failCallback, successCallback);
        } else if (browser.isIE) {
            openUriUsingIEInOlderWindows(uri, failCallback, successCallback);
        } else if (browser.isSafari) {
            openUriWithHiddenFrame(uri, failCallback, successCallback);
        } else {
            unsupportedCb();
            //not supported, implement please
        }
    }
}
 
//for IE and Edge in Win 8 and Win 10
function openUriWithMsLaunchUri(uri, failCb, successCb) {
    navigator.msLaunchUri(uri,
        successCb,
        failCb
    );
}
 
//检查浏览器类型
function checkBrowser() {
    var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
    var ua = navigator.userAgent.toLowerCase();
    return {
        isOpera: isOpera,
        isFirefox: typeof InstallTrigger !== 'undefined',
        isSafari: (~ua.indexOf('safari') && !~ua.indexOf('chrome')) || Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0,
        isIOS: /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream,
        isChrome: !!window.chrome && !isOpera,
        isIE: /*@cc_on!@*/false || !!document.documentMode // At least IE6
    }
}
 
//Firefox
function openUriUsingFirefox(uri, failCb, successCb) {
    var iframe = document.querySelector("#hiddenIframe");
 
    if (!iframe) {
        iframe = _createHiddenIframe(document.body, "about:blank");
    }
 
    try {
        iframe.contentWindow.location.href = uri;
        successCb();
    } catch (e) {
        if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL") {
            failCb();
        }
    }
}
 
function openUriWithTimeoutHack(uri, failCb, successCb) {
 
    var timeout = setTimeout(function () {
        failCb();
        handler.remove();
    }, 1000);
 
    //handle page running in an iframe (blur must be registered with top level window)
    var target = window;
    while (target != target.parent) {
        target = target.parent;
    }
 
    var handler = _registerEvent(target, "blur", onBlur);
 
    function onBlur() {
        clearTimeout(timeout);
        handler.remove();
        successCb();
    }
 
    window.location = uri;
}
 
function openUriUsingIEInOlderWindows(uri, failCb, successCb) {
    if (getInternetExplorerVersion() === 10) {
        openUriUsingIE10InWindows7(uri, failCb, successCb);
    } else if (getInternetExplorerVersion() === 9 || getInternetExplorerVersion() === 11) {
        openUriWithHiddenFrame(uri, failCb, successCb);
    } else {
        openUriInNewWindowHack(uri, failCb, successCb);
    }
}
 
function openUriWithHiddenFrame(uri, failCb, successCb) {
 
    var timeout = setTimeout(function () {
        failCb();
        handler.remove();
    }, 1000);
 
    var iframe = document.querySelector("#hiddenIframe");
    if (!iframe) {
        iframe = _createHiddenIframe(document.body, "about:blank");
    }
 
    var handler = _registerEvent(window, "blur", onBlur);
 
    function onBlur() {
        clearTimeout(timeout);
        handler.remove();
        successCb();
    }
 
    iframe.contentWindow.location.href = uri;
}
 
function _registerEvent(target, eventType, cb) {
    if (target.addEventListener) {
        target.addEventListener(eventType, cb);
        return {
            remove: function () {
                target.removeEventListener(eventType, cb);
            }
        };
    } else {
        target.attachEvent(eventType, cb);
        return {
            remove: function () {
                target.detachEvent(eventType, cb);
            }
        };
    }
}
 
function _createHiddenIframe(target, uri) {
    var iframe = document.createElement("iframe");
    iframe.src = uri;
    iframe.id = "hiddenIframe";
    iframe.style.display = "none";
    target.appendChild(iframe);
 
    return iframe;
}
 
function getInternetExplorerVersion() {
    var rv = -1;
    if (navigator.appName === "Microsoft Internet Explorer") {
        var ua = navigator.userAgent;
        var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat(RegExp.$1);
    }
    else if (navigator.appName === "Netscape") {
        var ua = navigator.userAgent;
        var re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null) {
            rv = parseFloat(RegExp.$1);
        }
    }
    return rv;
}
 
function openUriInNewWindowHack(uri, failCb, successCb) {
    var myWindow = window.open('', '', 'width=0,height=0');
 
    myWindow.document.write("<iframe src='" + uri + "'></iframe>");
 
    setTimeout(function () {
        try {
            myWindow.location.href;
            myWindow.setTimeout("window.close()", 1000);
            successCb();
        } catch (e) {
            myWindow.close();
            failCb();
        }
    }, 1000);
}
 
function openUriUsingIE10InWindows7(uri, failCb, successCb) {
    var timeout = setTimeout(failCb, 1000);
    window.addEventListener("blur", function () {
        clearTimeout(timeout);
        successCb();
    });
 
    var iframe = document.querySelector("#hiddenIframe");
    if (!iframe) {
        iframe = _createHiddenIframe(document.body, "about:blank");
    }
    try {
        iframe.contentWindow.location.href = uri;
    } catch (e) {
        failCb();
        clearTimeout(timeout);
    }
}
//检查是否安装程序 end

function openUrl(protocolUrl){
        check(protocolUrl, function () {
                //no install, go download page
                console.log("程序未安装")
                myconfirm();
            },()=>{
              console.log("已安装")
            });
        event.preventDefault ? event.preventDefault() : event.returnValue = false;
    }
function myconfirm(){
  if (confirm("检测到程序未安装,是否需要安装?")) {
  // 用户点击了确认按钮
  // 在这里执行你想要执行的操作
  console.log("确认下载")
  var url='xxx';//下载链接
    window.location.href=url;//下载

  
} else {
  // 用户点击了取消按钮,不需要执行任何操作
    console.log("取消下载")
}
}

openUrl('xxx://'); //这里替换为你需要的自定义协议 比如微信程序就是weixin://
  

解释一下本段代码: 需要看到最后两个函数,前边的不需要改动

openUrl('xxx://'); //这里替换为你需要的自定义协议 比如微信程序就是weixin://

  var url='xxx';//下载链接
    window.location.href=url;//下载

这个url需要自行更改 http https下载链接均可。

具体效果如下

如有其他问题,欢迎在评论区沟通交流。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
autoscroll(true,false):当播放列表过长的时候,默认会自动显示滚动条。当该值设置为’true’的时候,会自动根据鼠标滚动播放列表。 displaywidth(number of pixes):设置显示区域的宽度,当设置的比较小的时候,播放列表会显示在显示区域的右侧而不是底部。 kenburns* (true,false): 用以实现在运动的时候实现kb效果(Ken Burns effect),注意,当图比较大,而且网速比较快的时候,建议打开,否则关闭。建议设置transition为"slowfade"来配合。 largecontrols (true,false): 设置该值为true用来放大控制区域的按钮。建议为视力不好的用户打开 logo* (url): 设置一个图片用来作为右上角的水印,支持所有图片格式,支持通明图层的png效果最佳。 overstretch* (true,false,fit,none): 设置图片/影片在显示区域的缩放。"true"等比例拉伸用来符合显示区域。"false"仅拉伸合显示区域。"fit"全屏显示。"none"显示原始大小。JW Media Player等默认为"fit",JW Image Rotator默认为"false" showdigits (true,false,total): 设置为"false"隐藏播放时间等信息用来节省控制区域的空间。设置为"total"用来显示全部时间。 showdownload (true,false):设置该值用来在控制区域显示下载按钮。链接到link所设置的地址。 showeq (true,false): 用来显示一个假的音频波动效果。当播放mp3的时候打设置该值可以得到很好的效果 showicons* (true,false): 用来显示或者隐藏显示区域间的图片,JW Media Player等默认为true。JW Image Rotator默认为false; showvolume (true,false): 用来设置是否显示音量控制按钮 thumbsinplaylist (true,false): 设置列表是否显示预览图 播放参数 autostart (true,false,muted): 设置为ture,页面加载完后会自动播放。设置为muted,会在静音模式下自动播放,并且显示区域间有静音图标。bufferlength (number): 设置flv的缓存时间。默认为3秒 repeat* (true,false,list): 默认为flase,从当前播放位置播放到列表尾部后停止。设置为list会播放列表所有的项目,设置为true会循环播放。 rotatetime* (number): 设置图片的显示时间。JW Media Player等默认为10秒,JW Image Rotator默认为5秒 shuffle* (true,false): 设置为false顺序播放,设置为true无序播 smoothing (true,false): 设置为false关闭视频平滑处理,推荐设置true用以得到更好效果。但对于大屏幕或者配置低的机器设置false是有好处的 start* (second): 在使用RTMP 或 HTTP 流媒体的时候(非常规的flv/mp3),使用该变量准确的定位开始位置。该参数设置在XSPE格式的列表以便准且的设置文件的章节。 volume* (number): 设置音量,默认为80. 互动参数 audio* (url):用这个参数来添加一个mp3文件作为单独的音频,可以作为图片的背景音乐解说等。 bwfile (url):用以带宽检测的文件的地址,可以放一个图片,或者rtmp流媒体。可以在右键菜单查看到贷款数值。 bwstreams (comma-separated list of bitrates): 和bwfile配合使用,根据带宽值来选择不同的文件。如:你要播放video.flv并且设置该项的值为100,250,500,1000,当播放器发现带宽为349kbps的时候,将会播放video_250.flv。所以他有一套有效的命名设置,他将会自动切换,哪怕是在采用播放列表的情况下。 callback (url):设置这个参数为服务端程序(php/asp)地址用来回传数据。在每个项播放和停止的时候会发送数据到服务器,以便在服务器端保存播放统计。 captions (url): 设置该值用以载入一个文本格式的文本作为字幕。播放器至支持SMIL格式和DVD的SRT格式的字幕。如果你的flv文件内置字体你可以设置该值为"captionate".如果你有多频道字幕,可以设置这个值为"captionate0", "captionate3"等。可以在列表设置每一个项的值。 enablejs* (true,false): 设置为true打开对javascript的支持。仅支持在线使用。javascript可以控制播放,加载媒体,获得当前播放项的详尽信息。 fsbuttonlink (url):如果用户的flashplayer版本高于(9.0.28)播放器会自动的显示一个全屏按钮。通过设置该值,你可以链接到另外的页面用以全屏显示。服务端程可以设定将要播放的文件。 id (string): 播放器的唯一标识。将会被回传到服务器端。 javascriptid* (string):如果你的页面上有多个播放器,你可以设置这个参数给每个播放器不同的id,这样就可以方便的用javascript来控制。他将回传到getUpdate()事件。 link (url): 通过这个参数用来设置一个可现在的版本,或者强制用户通过该地址下载当前项。可以在播放列表为每一项设置该值。 linkfromdisplay* (true,false):设置显示区域被点击时要访问的页面。默认点击显示区域时会进行播放/暂停操作。 linktarget* (frame): 设置链接目标,"_self"在当前页打开。"_blank"在新页面打开。 streamscript (url):设置这个参数为了兼容‘伪流媒体’FLV文件。 type (mp3,flv,rtmp,jpg,png,gif,swf,rbs,3gp,mp4,m4v): 播放器会根据文件名的最后三个字符来判断类型。在你使用服务器端语言进行重定向时,这种方法将不会再有效。所以你可以设置这个参数来告诉播放器文件类型。你也可以在播放列表对每一项进行设置。如果播放器找不到文件类型将会被识别为播放列表。 useaudio (true,false): 设置为false用来改变为静音状态。 usecaptions (true,false):设置为false隐藏字幕. usefullscreen (true,false):如果你不希望用flashplayer9的全屏模式。可以设置"fsbuttonlink"参数用来替换全屏按钮的事件。 usekeys (true,false): 设置为"false"用来取消键盘操作(SPACE,UP,DOWN,LEFT,RIGHT) 注意:你必须对?=&进行字符转移。? → %3F, = → %3D, & → %26. 你的"file" 变量为getplaylist.php?id=123的时候必须设置为 getplaylist.php%3Fid%3D123.
第1章 页面特效 1.1 HTML页面反向显示 1.2 页面自动最大化 1.3 页面自动刷新 1.4 页面的后退、刷新、前进 1.5保护网页源代码 1.6 保护自己的网页不被放入框架 1.7 保护自己的网页不被放入框架 1.8 打印页面的出错原因 1.9 当前网页调用其他网页 1.10 倒计时载入页面 1.11 定义网页的关键字 1.12 进入页面同时弹出欢迎对话框 1.13 禁止网页另存 1.14 禁止页面加入缓存 1.15 离开页面时弹出对话框 1.16 判断页面是否添加了W3C声明 1.17 屏蔽网页的脚本 1.18 以频道模式打开页面 1.19 自动识别网页类型 1.20 在网页动态添加Script脚本 1.21 用JavaScript随机修改页面的标题 1.22 判断网页加载完毕 1.23 嵌入网页的播放器 1.24 设置指定网页为主页 1.25 使用JavaScript传递页面参数 1.26 页面被冻结 第 2章 按钮特效 2.1 页面刷新按钮 2.2 按回车调用登录按钮 2.3 动态创建按钮 2.3 平面按钮 2.4 按钮的嵌入效果 2.5 按钮改变状态栏信息 2.6 定义按钮的热键 2.7 取得控件的绝对位置 2.8 删除时的确认提 示 2.9 按钮只能单击一次 2.10 防止按钮连击 2.11 图片式按钮 2.12 文字显示在按钮底部 2.13 选择不同的列表项就显示不同的按钮 2.14 使用按钮控制文本渐变 2.15 翻页效果的公告栏 2.16 动态设置控件的事件 第3章 字符串文本和输入框特效 3.1 只带下划线的输入框 3.2 限定文本框可输入字符数 3.3 文字过长的省略号 3.4 输出26个英文字母 3.5 首字母变为大写 3.6 textarea自适应文字行数 3.7 禁止文本框的拷贝和粘贴 3.8 控制两个文本框只输其一 3.9 判断编辑器是否包含特殊字符 3.10 判断文本回车的数量 3.11 判断字符串有多少汉字 3.12 去除字符串的前后空格 3.13 刷新时清空所有文本框 3.14 随意改变大小的文本框 3.15 文本框的自动全选 3.16 文本框滚动导航 3.17 按钮获取焦点 3.18 文本框获取焦点弹出下拉框 3.19 文本框简单的单击效果 3.20 文字的打字效果 3.21 文字滚动 3.22 文字滑动 3.23 文字跳动特效 3.24 荧光效果的文本 3.25 文字逐个闪亮-霓虹灯效果 3.26 旋转式的变色文字特效 3.27 黑客帝国的字符下落效果 3.28 获取表单文本框的个数 3.29 光标停在文字最后 3.30 分行取textarea的值 3.31 自动插入文本 3.32 选取textarea的指定行 3.33 文本放大镜 3.34 文本框的默认输入法 3.35 文本框显示网页的内容 3.36 文字的垂直滚动 3.37 文字幻灯片 3.38 随机动态文字效果 3.39 实现textarea的自动滚动 3.40 使用marquee实现文字上下滚动 3.41 类似安装效果的textarea滚动 3.42 始终显示在最顶端的文本 3.43 JavaScript过滤SQL注入字符 3.44 textarea内实现行的翻页效果 3.45 textarea的文本插入 3.46 查找两段文本相同的词句 3.47 自动保存网页输出的文本 3.48 文本编辑器 第4章 鼠标特效 4.1 禁用鼠标右键 4.2 使鼠标滚轮失效 4.3 状态栏显示鼠标位置 4.4 点击鼠标右键到指定页 4.5 鼠标放到图片上会显示另外一张图片 4.6 鼠标形状定义大全 4.7 鼠标移入移出时颜色变化 4.8 跟随鼠标的文字 4.9 跟随鼠标的彩色文字 4.10 跟随鼠标的魔法文字 4.11 跟随鼠标的星星 4.12 跟随鼠标的旋转背景 4.13 图片跟随鼠标 4.14 围绕鼠标的文本 4.15 鼠标旁边的提示信息 4.16 鼠标移到下拉框时自动全部打开 4.17 checkbox鼠标移入移出的特效 第5章 层和框架的特效 5.1 div层提示效果 5.2 层自动滚动到最底端 5.3 div的自动滚动 5.4 div的折迭效果 5.5 圆角div 5.6 动态添加iframe框架 5.7 用层实现长文章分页 5.8 iframe自适应高度 5.9 类似MSN的消息提示 5.10 只打印iframe的内容 第6章 下拉列表特效 6.1 下拉框实现多选 6.2 实现两个select的同步 6.3 被选的列表项下次不能再选 6.4 不带滚动条的select 6.5 从一个下拉列表往另一个下拉列表添加内容 6.6 改变列表项的上下顺序
WEB程序设计》复习答疑 1、当前主要的WEB数据库访问技术有哪些? 答:到目前为止,WEB数据库访问技术主要分为两大类: (1)公共网关接口技术(CGI); CGI是WEB服务器运行时外部程序的规范,按照CGI编写的程序可以扩展服务器的功能,完成服务器不能完成的工作,外部程序执行时可以生成HTML文档,并将文档返回WEB服务器。 (2)服务器端脚本编程技术。 当前较为流行的几种有代表性的服务器端脚本编程技术是ASP、PHP、JSP。 2、HTML是什么?简述它的基本结构。 答:HTML(Hypertext Marked Language,超文本标记语言)是一种用来制作WEB上超文本文档的简单标记语言。 对于大多数WEB页面来说,都具有如下所示的基本结构: <html> <head> <title> ……标题内容…… </title> </head> <body> ……主体内容…… </body> </html> 6、什么是静态网页?什么是动态网页? 答:所谓静态网页,指的是网页从服务器传到客户端时,网页的内容是“固定不变”的,也就是说,服务器只是把所存储的网页的内容原封不动直接传递给客户端浏览器,这种网页一般是标准的HTML代码。 所谓动态网页,它在由服务器传递给客户端的时候必须由服务器把它转换成相应的HTML格式,而且会根据用户的要求和选择在服务器端做出相应的改变和响应。 7、简要说明在网页插入JavaSCRIPT脚本的几种方式? 在网页插入脚本语言通常有三种方式:使用SCRIPT标记符、在标记符直接嵌入脚本以及链接外部脚本文件. 8、说明在网页使用CSS的几种方式?CSS选择符的作用及分类? 在网页使用CSS包括三种常用方式:将样式定义直接嵌入到标记符、将样式定义嵌入到网页以及将样式定义包含在外部CSS样式文件. CSS(Cascading Style Sheet,层叠样式表)技术是一种格式化网页的标准方式,它扩展了HTML的功能,使网页设计者能够以更有效的方式设置网页格式. 常用的5种selector:HTML标记符、具有上下文关系的HTML标记符、用户定义的类、用户定义的ID、虚类. 9、设置字体大小的代码是? A) <tt></tt> B) <cite></cite> C) D) <font size=?></font> 16、创建一个单选框的HTML代码是() A) <input type="radio" name="NAME" value="x"> B) <input type=text name="foo" size=20> C) <input type="submit" value="NAME"> D) <input type="image" name="NAME" src="name.gif"> 17、HTML代码 <a href="mailto:EMAIL"></a>表示? A)创建一个超链接 B)创建一个自动发送电子邮件的链接 C)创建一个位于文档内部的靶位 D)创建一个指向位于文档内部靶位的链接 18、HTML代码<tr></tr>表示? A)创建一个表格 B)开始表格的每一行 C)开始一行的每一个格子 D)设置表格头 19、HTML代码<hr>表示? A)添加一个图象 B)排列对齐一个图象 C)设置围绕一个图像的边框的大小 D)加入一条水平线 20、网页制作三剑客是指? A)FRONTPAGE、PHOTOSHOP、JAVA B)DREAMWEAVER、PHOTOSHOP、Flash C)FRONTPAGE、FIREWORK、Flash D)DREAMWEAVER、FIREWORK、Flash 22、HTML代码<th></th>表示? A)创建一个表格 B)开始表格的每一行 C)开始一行的每一个格子 D)设置表格头 23、创建表单的HTML代码是? A)<form></form> B)<select multiple name="NAME" size=?></select> C)<option> D)<select name="NAME"></select> 1、HTML的全称是什么?HTML语言是什么? 答:HTML(HyperText Markup Language)的文名称为“超文本描述语言”,是一种专门用来设计网页的计算机语言,用HTML编写的超文本文档称为HTML文档,它能独立于各种操作系统平台(如UNIX,WINDOWS等)。HTML对网页上的文字、图片等多媒体数据所出现的位置、形式、顺序及关系都使用标记(Tag)语法作定义以及对网页间加注超链接关系。一般HTML的网页文件都是以.htm为扩展名,浏览器会按照Tag语法做解释并加以处理.htm文件的内容,按照其指定方式将文字、图片等多媒体数据显示或播放出来。即使用HTML语言描述的文件,需要通过WWW浏览器显示出效果。 2、HTML文件的结构是怎样的? 答:HTML文件是标准的ASCII文件,它是包含了许多被称为标签的特殊字符串的普通文本文件。从结构上讲,HTML文件由元素组成,组成HTML文件的元素有许多种,用于组织文件的内容和知道文件的输出格式。HTML通过使用标记和元素来建立文件,其利用标记来控制文件的结构。一个标准的HTML文件是以<html>标记开始,并以</html>标记结束的,用来告知浏览器这是整个HTML文件的范围。如图2-1所示,在<html>~</html>之间包含两个主要的部分:一个是HTML文件的头部(Head),称为“标题设定区”,放置一些有关该文件的识别数据,前后使用<head>~</head>标记框住;另一个是文件的主体(Body),称为“HTML网页文本区”,是显示在浏览器的文件内容及其格式,前后使用<body>~</body>标记框住。 3、用JavaScript语言设计一个程序判断用户输入的整数是正数、负数还是0。 <html> <head> <script language="JavaScript"> var x=prompt("请输入一个数","0") </script> </head> <body> <script language="JavaScript"> if(x>0) {document.write("你输入的是正数")} else {if(x==0) {document.write("你输入的是零")} else {document.write("你输入的是负数")} } </script> </body> </html>
在使用 jsqrcode 库检测二维码时,我们需要将图片转换为 jsqrcode 库可以识别的数据格式,然后将其传递给 jsqrcode 库进行解析。在 Web 环境下,我们通常可以通过创建一个 Image 对象,并将图片加载到该对象上,然后获取 ImageData 数据来实现。但在小程序,由于小程序不支持直接创建 Image 对象,我们需要使用其他方法来获取图片数据。 一种方法是使用小程序的 wx.getImageInfo 接口获取图片信息,然后使用 wx.getFileSystemManager 接口将图片文件读取为二进制数据,最后将二进制数据转换为 jsqrcode 可以识别的格式。下面是一个在 uni-app 开发的小程序使用 jsqrcode 库检测二维码数量的示例代码: ```javascript // 引入相关库 import qrcode from 'jsqrcode'; // 获取图片信息并读取为二进制数据 uni.getImageInfo({ src: 'test.png', success: function (res) { uni.getFileSystemManager().readFile({ filePath: res.path, encoding: 'binary', success: function (data) { // 解析二维码,获取二维码数量 var imageData = qrcode.getImageData(data.data); var qrCodeCount = qrcode.process(imageData).length; // 输出结果 console.log('该图片包含 ' + qrCodeCount + ' 个二维码'); } }) } }); ``` 这段代码,我们首先使用 uni.getImageInfo 接口获取图片信息,然后通过 uni.getFileSystemManager 接口将图片文件读取为二进制数据。接下来,我们使用 jsqrcode 库的 getImageData 方法获取图片数据,使用 process 方法识别二维码,并通过返回的结果数组的长度来判断二维码数量。 需要注意的是,由于小程序没有 DOM,因此无法直接显示图片。如果你不想将图片显示在页面上,可以将其保存到本地或者将其转换为其他格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值