《第三方JavaScript编程》——1.3 开发一个简单的微件

1.3 开发一个简单的微件

在本章前两小节中我们探讨了一些第三方JavaScript的流行用法。你已经了解了在开发微件、数据收集、作为客户端Web服务的API封装等方面是如何运用到它的。希望这能够给你一些启发,当你设计自己的第三方应用程序时候能够了解哪些功能是能够实现的。

现在,你已经看过了一些现实中的实例,是时候开发一些自己的东西了。让我们先从相对简单的入手:一个极其简单的嵌入式微件。

假设你在运行一个提供当地最新天气信息的网站。一般而言,用户直接访问你的网站是为了获得最新的天气消息。但是为了使用户更广,你决定更进一步,让用户可以在你的网站之外访问你的数据。你可以通过提供一个可嵌入的微件服务做到这一点,如图1.7所示。你需要向那些有兴趣通过引入第三方脚本即可为自己的用户提供本地天气信息的网站发布者推广这个微件。

幸运的是,你已经找到了一个对此兴致盎然的网站发布者,而且他们已经开始试着使用你的微件了。为了让他们能够使用,你需要给他们提供HTML代码片段,从而在他们的Web页面上加载天气微件。网站发布者需要将代码片段粘贴到他们的HTML源代码中想要展现微件的位置。代码片段本身很简单:即一个标签指明weathernearby.com所在服务器上第三方JavaScript的路径:

你会注意到脚本的URL中包含了一个zip参数。通过这个参数你就可以识别需要渲染什么位置的天气信息。

此时,当浏览器加载发布者的Web页面时,遇到这个标签就会向weathernearby.com的服务器请求widget.js脚本文件。当widget.js下载完毕并且执行后,就会在发布者的页面上渲染出天气微件。不管怎么说,这就是我们想要达到的效果。

要做到这些,widget.js需要有权限访问公司的天气数据。这些数据可以直接发布到脚本文件中,但是考虑到美国大约有43 000个邮政编码,这样一来,一个请求中会有太多的数据。除非用户从瑞典或者韩国访问,因为这两个国家100Mbit/s的传输速度是常态。在通常情况下,微件需要请求天气数据可以通过使用AJAX来完成。为了简单起见,我们使用另一种不同的方式:服务端生成脚本。

1.3.1 服务端生成脚本
与提供一个包含微件代码的静态JavaScript文件不同,你需要写一个服务端应用为每个请求生成一个JavaScript文件,如图1.8所示。因为服务器能够访问天气信息的数据库,它可以将所请求的天气数据插入到输出的JavaScript文件中。这就意味着,在发布者页面上渲染天气微件的所有代码和需要的数据都包含在JavaScript中,而无需发起任何额外的请求。

这个服务端应用可以用任何编程语言或者能够在服务器环境运行的平台,像Ruby、PHP、Java、ASP.NET——甚至服务端JavaScript,这些都是很不错的选择。本例中,我们选用很受欢迎的脚本语言Python来进行演示。本例用到了Flask,一个基于Python的小型框架,用于构建小型Web应用。如果你并不熟悉Python,也不用担心——代码很容易理解。如果你想自己尝试程序清单1.5中的例子,可以参照配套的程序源码,程序源码中同时也包含了安装Python(2.x)和Flask的介绍。

为什么选用Python
本书中一小部分服务端的例子都是使用Python语言。我们选用这种编程语言完全是因为偏爱:它是我们在Disqus每天都在使用的语言,并且我们对它最熟悉。倘若你不知道如何使用Python也没关系。本书首先是一本关于JavaScript的书,服务端的例子可以很容易的使用其他语言代替。

当这个服务端脚本启动后,一个请求标签将返回如下JavaScript代码。从而渲染出你在本节开头看到的示例微件,如图1.7所示。同时,注意这些代码是Python应用产生并且对于浏览器请求而言是完全透明的。

现在看来,这是一个极其简单的例子,并不是开玩笑。这个毫无样式输出的天气微件几乎没有为用户提供交互界面。看似非常糟糕,而且可能会将你刚起步的公司陷入困境。但是它能够工作,而且展示了发布者网站同第三方代码之间的交互。

这里提及的一些技术,像使用document.write和服务端的Python,都不是唯一生成微件的方式。不要皱眉,我们稍后会解释原因。在后边的章节中,我们将探讨更好的替代方案,并介绍更为复杂的功能,如样式表,通过AJAX进行服务端通信以及用户间会话。

1.3.2 通过iframe分发微件
如果你对于Web开发相当有经验,可能会有这样的想法,“是不是通过iframe分发这个微件更容易?”乍一看似乎如此,但是有一些潜在的差异使得第三方脚本成为了更好的实现选择。为了知其所以然,首先我们看一下如何通过iframe重新创建之前的微件示例。

iframe是块级HTML元素,用来从URL嵌入外部内容。如果你对它并不熟悉也能够完全通过一个iframe元素很容易的重新实现天气微件示例,如下。

你会注意到src属性改变了:不再指向一个JavaScript文件,而是指向一个HTML文档。这一次你的服务器将返回一个完整的HTML文档,包含了微件的标记,完全避免了使用JavaScript。你也会注意到微件的尺寸作为iframe的style属性的一部分。iframe元素并不会扩大以适应其内容,因此需要为iframe设定明确的尺寸。

像这样使用iframe将产生同JavaScript示例相同的输出。那为什么要使用JavaScript代替iframe呢?有很多的原因,其中大部分原因都围绕iframe的特性:通过iframe加载的外部内容不能被父页面访问(发布者的页面),反之亦然。

灵活性:如果你希望改变微件的尺寸,就没有那么幸运了。因为iframe的尺寸是在父页面中iframe标签中指定的,而且这些属性不能被iframe加载的内容更改,因此没有办法动态的改变微件的尺寸。

美学:微件的外观需要完全独立于父页面的样式。微件将不能继承基础的样式,例如字体种类、字体大小或颜色等。

交互:微件需要访问或者修改发布者页面的DOM吗?发布者是否需要在微件的内容上附加一些交互?是否会有多个微件实例存在并且相互通信的情况呢?这些通过静态iframe都不可能做到。

报表:浏览器用户是否真能看到微件?在看到它之前,他们在页面上耗费了多长时间?收集这些和其他有价值的数据都需要在发布者页面上运行JavaScript。

这些只是一些简单的例子,但是你或许能看到一种趋势。iframe或许是天气微件示例最简单的分发方式,但是这么做你将失去第三方JavaScript提供的众多引人注目的能力。但是,不要让它改变了你对iframe的看法。它们是第三方JavaScript开发者工具集中一个宝贵的资产,在本书不同的任务中,我们都会频繁地用到它们。

时间: 2024-09-28 07:21:35

《第三方JavaScript编程》——1.3 开发一个简单的微件的相关文章

《第三方JavaScript编程》——导读

**前言**第三方JavaScript是从一个远程Web服务的地址获得服务,并在发布者页面上独立运行的客户端代码.第三方JavaScript用于创造高度分布式的Web应用程序,例如从社交微件到数据跟踪分析,到功能齐全的嵌入式应用程序. 本书介绍了第三方JavaScript应用程序的开发,不仅告诉读者如何开发运行在第三方环境的JavaScript代码,也介绍了第三方Web开发的相关技术,包括HTML.CSS和HTTP等.本书适用于有第三方代码开发经验的开发者(例如在自己的网站上运行),也适用于希望

《第三方JavaScript编程》——1.2 第三方JavaScript的用法

1.2 第三方JavaScript的用法 我们已经确切知道了第三方JavaScript是在某个网站上被执行的代码,这就使得第三方代码能够访问到网站的HTML元素和JavaScript上下文.因此,我们可以通过多种方式操作目标页面,例如在文档对象模型(DOM)中创建新的元素.插入自定义的样式表.注册浏览器事件以捕获用户行为.在绝大多数情况下,如同使用JavaScript操作自己的网站或者应用一样,第三方脚本可以执行同样的操作,不同的是,第三方脚本操作的是他人的网站. 拥有了远程操作Web页面的能力

《第三方JavaScript编程》——7.3 跨站请求伪造

7.3 跨站请求伪造 在第4章中,我们谈到了同源策略.该策略被所有浏览器支持,并防止不同来源的Web页面互相访问对方的方法和属性.你已经学到了一些技巧,使用这些技巧可以向你的服务器跨域发送消息.在本节中,我们将介绍利用该特性是如何转而对你进行攻击的. 跨站请求伪造(CSRF或者XSRF)是针对用户的另一种类型的漏洞.与XSS不同,XSS是将伪造的内容展现给用户,而XSRF利用的是Web应用程序与用户浏览器之间的信任.在本质上,易受XSRF攻击的Web应用都允许攻击者通过自己的网站诱导用户执行某些

使用C#开发一个简单的P2P应用

p2p 本篇文章讨论了一种设计P2P网络应用程序的简单方法. 尽管有许多P2P网络不需要索引服务器或中央服务器,各客户机之间可以互相直接通讯,但下面的图1还是显示了P2P网络的基本工作原理,一般来说,P2P概念中包含一台中央索引服务器,这台服务器并不存储有任何文件,它只存储有登录到该网络上的所有用户的信息.客户端的IP地址以及用户提供的供共享的文件,客户机和服务器使用简单的命令通过报路连接进行通讯. 当客户端A想要查找P2P网络上其他客户端提供共享的文件时,系统会执行下面的操作: ·客户端A以自

Windows 8 Store Apps学习(64) 后台任务: 开发一个简单的后台任务

介绍 重新想象 Windows 8 Store Apps 之 后台任务 开发一个简单的后台任务 示例 1.通过"Windows 运行时组件"新建一个后台任务 BackgroundTaskLib/Demo.cs /* * 后台任务 * * 注: * 后台任务项目的输出类型需要设置为"Windows 运行时组件",其会生成 .winmd 文件,winmd - Windows Metadata */ using System; using System.Threading

重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务

原文:重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务 [源码下载] 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台任务 开发一个简单的后台任务 示例1.通过"Windows 运行时组件"新建一个后台任务BackgroundTaskLib/Demo.cs /* * 后台任务 * * 注: * 后

用C#开发一个简单的画图软件

问题描述 用c#开发一个简单的画图软件,利用winform窗体,VS2010开发环境,设计到的算法或者流程图是什么啊?比如画直线利用的什么算法?画圆.矩形等 解决方案 解决方案二:不需要算法自己百度gdi相关的东西都有线程的函数g.DrawRectangle();g.DrawLine()等..解决方案三:多谢啊,我在写毕业论文,老师要把算法写出来,不知道怎么写

《深入理解Nginx:模块开发与架构解析》一第3章 开发一个简单的HTTP模块 3.0

第3章 开发一个简单的HTTP模块 当通过开发HTTP模块来实现产品功能时,是可以完全享用Nginx的优秀设计所带来的.与官方模块相同的高并发特性的.不过,如何开发一个充满异步调用.无阻塞的HTTP模块呢?首先,需要把程序嵌入到Nginx中,也就是说,最终编译出的二进制程序Nginx要包含我们的代码(见3.3节):其次,这个全新的HTTP模块要能介入到HTTP请求的处理流程中(具体参见3.1节.3.4节.3.5节).满足上述两个前提后,我们的模块才能开始处理HTTP请求,但在开始处理请求前还需要

如何开发一个简单的HTML5 Canvas 小游戏

原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wizard's Lizard这个游戏的半数以上开发是由我完成的) 我们直接来看源码里的game.js,当然你也可以在线体验一下游戏先. 游戏截图 创建画布 // Create the canvas var canvas = document.createElement("canvas"); v