java 线程 插件_我的第一个Chrome插件:天气预报应用

1.Chrome插件开发基础

开发Chrome插件很简单,只要会基本的前台技术HTML、CSS、JS就可以开发了。

Chrome插件一般包括两个HTML页面background和popup。

background页面只在启动浏览器加载插件时载入一次,它不直接显示出来而是在后台运行。

它包含了插件的主要逻辑,收集或处理的结果可以保存到全局变量localStorage中传递给popup

页面。popup页面就是点击插件图标后弹出的页面,将用户需要的数据展示出来或者与用户交互。

此外插件还应该包含有CSS和JS文件以及一些图片文件。插件的相关配置都保存到一个叫做

manifest.json的文件中,里面的配置是以JSON数据格式保存的。

本文这个天气预报插件的源代码结构如下:

1336484981_5563.png

myplugin

|--bg.html

|--popup.html

|--manifest.json

|--img

|     |--icon.png

|--js

|     |--jquery-1.7.2.min.js

|--style

|--popup.css

2.实时获得天气预报信息

首先通过http://61.4.185.48:81/g/获得城市编号。注意,这个URL返回的是一个JS脚本,

其中变量id保存的是城市编号。之后通过http://m.weather.com.cn/data/[id].html获得

城市天气预报。这个URL返回的是JSON数据格式,如下:

{

"weatherinfo":

{

"city":"北京",

"city_en":"beijing",

"date_y":"2012年5月6日",

"date":"",

"week":"星期日",

"fchh":"08",

"cityid":"101010100",

"temp1":"31℃~19℃",

"temp2":"28℃~19℃",

"temp3":"29℃~18℃",

"temp4":"27℃~18℃",

"temp5":"23℃~14℃",

"temp6":"25℃~15℃",

"weather1":"晴转多云",

"weather2":"阴",

"weather3":"多云",

"weather4":"多云",

"weather5":"多云转阴",

"weather6":"阵雨转多云",

"img1":"0",

"img2":"1",

"img3":"2",

"img4":"99",

"img5":"1",

"img6":"99",

"img7":"1",

"img8":"99",

"img9":"1",

"img10":"2",

"img11":"3",

"img12":"1",

...

}

}

我们在bg.html中定时地获得到城市的天气信息,保存到全局变量localStorage中。

之后用户点击插件按钮时就可以通过popup.html看到实时的天气情况了。

3.jQuery基础

jQuery功能很多很强大,本文例子中主要用jQuery来简化Ajax调用,如getScript和get函数,

以及parseJSON函数将JSON字符串解析成JS对象,另外就是$("#id")对DOM对象的访问。

4.代码实现

具体实现起来还要注意几点:

一是localStorage不能直接保存解析好的JSON对象,因此bg.html要将字符串保存localStorage

中,popup.html自己解析后显示到页面上。

二是要在manifest.json中将天气网站配置到permission中,才可以在bg.html中跨域访问它。

manifest.json

{

"name": "My First Extension",

"version": "1.0",

"description": "The first extension that I made",

"permissions": ["tabs", "notifications","http://m.weather.com.cn/*"],

"background_page": "bg.html",

"browser_action": {

"default_icon": "img/icon.png",

"default_popup": "popup.html"

}

}

bg.html

weather

function init() {

//$id = "101070201";//此处是大连的城市ID,可以去weather.com.cn找到对应的weather city ID

//$url = "http://m.weather.com.cn/data/" + $id + ".html";//接口URL

// 利用下载服务器端脚本来间接解决跨域访问问题

$.getScript(

'http://61.4.185.48:81/g/',

function(){

$.get("http://m.weather.com.cn/data/" + id + ".html",

function(data) {

window.localStorage.weather = data;

}

);

}

);

}

window.setInterval("init()", 5*60*1000);

popup.html

weather

function init() {

var data = $.parseJSON(localStorage.weather);

var weatherinfo = data["weatherinfo"];

var datearray = ["", weatherinfo["date_y"], "第二天", "第三天", "第四天", "第五天", "第六天"];

$("#cityname").html(weatherinfo["city"] + "城市天气预报");

for (i = 1; i <= 6; i++) {

var divid = "#div" + i;

$(divid).append(datearray[i]).append("
");

var imgurl = "http://m.weather.com.cn/weather_img/" + weatherinfo["img"+(i*2-1)] + ".gif";

$(divid).append(''%20+%20imgurl%20+%20'').append("
");

$(divid).append(weatherinfo["temp" + i]).append("
");

$(divid).append(weatherinfo["weather" + i]);

}

}


popup.css

html {

height: 180px;

width: 700px;

}

#cityname {

text-align: center;

font-size: 20px;

font-weight: bold;

margin: 5px;

}

.weatherdiv {

float: left;

width: 15%;

margin: 5px;

}

5.调试\打包\安装

关于Chrome浏览器下开发的调试:

普通页面的调试:用console.log(obj);打印任意JS对象。之后在工具->JavaScript控制台进行调试。

插件开发的调试:打开活动视图bg.html。修改后,可以点击“重新载入”重新加载我们的插件。

1336485132_3361.png

在Chrome浏览器中,选择工具->扩展程序->开发模式->打包扩展程序

选择插件的根目录,打包后会产生压缩安装包crx和密钥文件pem。

1336485158_2780.png

安装方法很简单,直接把crx文件拖到chrome浏览器窗口里就可以了。

6.最终效果图

1336570523_2063.png

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

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

相关文章

保送北大,连发三篇Science,这位80后川妹子近日再发重磅级研究成果!

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术2020年9月21日&#xff0c;启函生物杨璐菡博士等在 Nature 子刊 Nature Biomedical Engineering杂志上发表了题为&#xff1a;Extensive germline genome engineering in pigs 的研究论文。杨璐菡杨璐菡带领的研究团队成…

Linq 下的 Take() 方法内部机制是怎样的?

咨询区 Rahul Kishore&#xff1a;我的web需要访问数据库&#xff0c;但是表比较大&#xff0c;我仅仅想要获取该表中 N 条数据&#xff0c;我查阅了 MSDN 文档&#xff0c;看到了一个 Take() 方法&#xff0c;我现在很疑惑它的运行机制是下面哪一种&#xff1f;先从数据库中获…

如何直接soap字符串,访问webservice

2019独角兽企业重金招聘Python工程师标准>>> 1.Webservice.GetVcardByUserNo(String userId&#xff0c;String userNo);这个是封装了的webservice接口。 2.在程序中连续两次调用该接口时&#xff0c;ksoap2在解析第二次调用返回的结果时抛异常。 异常信息如下&…

《哈利波特》电影全集+有声书免费领取!带你重返儿时魔法世界……

全世界只有3.14 % 的人关注了爆炸吧知识说到哈利波特系列&#xff0c;几乎人人皆知&#xff0c;享誉世界&#xff0c;风靡全球的哈利波特究竟有什么无穷魔力呢&#xff1f;《哈利波特》是英国作家JK罗琳的魔幻文学系列小说&#xff0c;共7集&#xff0c;其中前六部以霍格沃茨魔…

.NET6下周发布真的香,可不少人却只会.NET Framework!

倒计时7天&#xff0c;.NET6VS2022C#10将同时发布正式版&#xff0c;宣告.NET步入全新篇章&#xff0c;各种新语法、新框架、新技术都如约而至&#xff0c;令人期待&#xff01;近年来&#xff0c;.NET跨平台持续推出新版本&#xff0c;开源社区也不断涌现各种优秀框架&#xf…

java环境怎样搭建_如何学习JAVA?怎么搭建JAVA环境?怎么安装JDK?

JAVA在学习JAVA前&#xff0c;我们必须了解并搭建好JAVA所需的开发环境&#xff0c;要让你写代码能让机器听得懂并执行&#xff0c;JDK(Java Developers Kits)自然是是必须的安装JDK前的准备首先我们要先知道自己的电脑系统是几位版本的&#xff0c;右键”此电脑“点击菜单里的…

神奇的机械动态图,看了一遍又一遍!最后一个真神奇~

全世界只有3.14 % 的人关注了爆炸吧知识神奇的机械科技动态图&#xff0c;看了一遍又一遍&#xff01;最后一个真神奇&#xff5e;▲金属切割的慢镜头&#xff0c;美&#xff01;▲齿轮变速原理演示▲塑料成型机器▲切丝的食品机器▲螺旋状的通心粉制造▲高温融化锁的过程▲一次…

Envoy实现.NET架构的网关(三)代理GRPC

.NET网关与Gateway实战-Envoy与kong课程Envoy实现.NET架构的网关&#xff08;一&#xff09;静态配置与文件动态配置Envoy实现.NET架构的网关&#xff08;二&#xff09;基于控制平面的动态配置什么是GRPCgRPC是一种与语言无关的高性能远程过程调用 (RPC) 框架。gRPC 的主要好处…

Linux 下用来查询安装包信息的RPM选项

Linux 下用来查询安装包信息的RPM选项RPM是RedHat的包管理器&#xff0c;用来安装、卸载、升级和查询基于RedHat Linux的安装包。RHEL和基于它的系统使用rpm命令来完成这些功能。AD&#xff1a;RPM是RedHat的包管理器&#xff0c;用来安装、卸载、升级和查询基于RedHat Linux的…

如何用Java讲一句话重复五遍_Java 0515 第二次课作业

import java.util.*;public class Work_01 {public static void main(String[] args) {Scanner scan new Scanner(System.in);System.out.println("上午是否合格?");String judge scan.next();//输入是否while(!"是".equals(judge)){//用equals方法判断…

一张图看懂华为计算全联接2020

全世界只有3.14 % 的人关注了爆炸吧知识END◆ 推荐阅读 ◆点击下方图片即可阅读华为邓泰华&#xff1a;让每一位开发者的智慧汇聚成全生态创新&#xff0c;共同点亮多样性计算新时代左右滑动查看更多☟

独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!

最近一年的工作&#xff0c;有很大的比重在做云平台的事情&#xff0c;简单来说&#xff0c;就是为公司内用户提供一个PaaS&#xff0c;用户可以在我们的云平台上方便的将单机服务程序扩展为多实例程序&#xff0c;以平台服务化的方式对外提供。在这里简单分享一下。 首先简单说…

C# 使用Timer控件设置时间间隔

Timer 控件可以定期引发事件&#xff0c;该控件是为 Windows 窗体环境设计的。时间间隔的长度由 Interval 属性定义&#xff0c;其值以毫秒为单位。若启用了该组件&#xff0c;则每个时间间隔引发一个 Tick 事件&#xff0c;在该事件中添加要执行的代码。如图1 所示为 Timer 控…

吐血整理!近二十年全国数学联赛赛题大全,烧脑全集来啦!

1981年&#xff0c;中国数学会开始举办"全国数学联赛"&#xff0c;经过1981、1982、1983三年的实践&#xff0c;这一群众性的数学竞赛活动得到了广大中学师生欢迎&#xff0c;也得到教育行政部门、各级科学技术协会、以及社会各阶层人士的肯定和支持。"试题所涉…

组装电脑教程(转载)

组装电脑已经越来越受欢迎&#xff0c;性价比在那摆着&#xff0c;而之前品牌机引以为傲的售后服务也已经被组装机赶上&#xff0c;可以说已经没有不选组装机的理由&#xff0c;就连王思聪也是买组装电脑&#xff08;几万元土豪组装机&#xff09;。但是组装电脑对于新手却不是…

java基本类型与引用数据类型_java基本数据类型与引用数据类型总结

昨天京东笔试的一道选择题&#xff0c;被坑了。最近一直在做笔试题&#xff0c;发现自己学了两年多的java&#xff0c;三大框架什么都会&#xff0c;却连基本的拆箱装箱都忘了。昨天考的引用数据类型&#xff0c;基本数据类型都不知道。看来得好好把基础复习几遍了。总结&#…

男朋友的内裤旧了不要扔,关键时刻有大用......

1 女生没有运动内衣不用愁翻翻衣柜总有办法▼2 孩子&#xff0c;你这家庭咋这么散装呢&#xff1f;▼3 这个原地打滑的本领也是一门技术▼4 三轮车夫&#xff1a;我顶不住了......▼5 有空不仅可以一起洗澡还可以一起拉屎▼6 哟&#xff01;哥们儿&#xff0c;我来陪你啦…

基于事件驱动架构构建微服务第9部分:处理更新

原文链接&#xff1a;https://logcorner.com/building-microservices-through-event-driven-architecture-part10-handling-updates-and-deletes/在本文中&#xff0c;我将讨论如何处理事件溯源系统上的更新。在前面的步骤中&#xff0c;我将系统的所有业务变化存储为事件&…

理解离散傅立叶变换(一. 傅立叶变换的由来)

转自&#xff1a;http://blog.csdn.net/dznlong/article/details/2261150理解离散傅立叶变换&#xff08;一&#xff09;------傅立叶变换的由来关于傅立叶变换&#xff0c;无论是书本还是在网上可以很容易找到关于傅立叶变换的描述&#xff0c;但是大都是些故弄玄虚的文章&…

浅谈入行

2019独角兽企业重金招聘Python工程师标准>>> 2006年开始参加工作&#xff0c;从编码&#xff0c;到带人&#xff0c;再到设计&#xff0c;自己不知不觉也走过了许多个年头。在公司从外包&#xff0c;到国内前后也参加了十多个不同的项目&#xff0c;每年都会有一些新…