0

0

创建一个小部件来展示您令人兴奋的更新

WBOY

WBOY

发布时间:2023-09-01 08:53:05

|

1633人浏览过

|

来源于php中文网

原创

创建一个小部件来展示您令人兴奋的更新

几个月前,谷歌发布了一项类似 twitter 的新服务,名为 buzz。我们可以使用此服务在任何网站上显示我们的最新动态。因此,在本教程中,我将指导您完成构建自己的 buzz 小部件的过程。


第 1 步。阅读 Buzz 的公开更新

目前,没有可与 Buzz 服务配合使用的 API; Google 预计将在未来几个月内提供一个更新,但目前公开更新以 Atom 源的形式提供。

首先,我们需要从 Buzz 服务获取数据。为此,我们将设置一个 PHP 脚本来从 Buzz 服务读取数据。该脚本将是一种代理,我们将使用它来检索数据。通过这样做,我们可以发出 AJAX 请求,并获取包含所需更新的 XML 文档。

创建一个小部件来展示您令人兴奋的更新

这是最初的 PHP 代码:

header('Content-type: application/xml');	 //Setting up the response content type to XML
$handle = fopen($_GET['url'], "r");		//Open the given URL

if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);		//reading the data
        echo $buffer;
    }
    fclose($handle);
}

将此文件另存为“readfeed.php”,并记住这只是一个示例。在现实世界的项目中,您应该清理 url 参数,并确保用户没有打开文件系统上的重要内容。


第 2 步。创建 JavaScript 对象的结构

一旦我们可以读取这些数据,我们就需要构建一个对象来保存 JavaScript 代码。创建一个新文件并将其命名为“buzz-widget.js”。要扩展一个对象,我们需要使用“prototype”属性;如果您对此有疑问,您应该观看教程,其中 Jeffrey 向我们展示了它如何与本机对象一起使用。

我们的对象的结构将是这样的:

var BuzzReader = function(options){	//Step 1
	//code for the constructor
};

BuzzReader.prototype = {			//Step 2
	renderTo: "",			
	proxy	: "readfeed.php",
	user	: "",
	url		: "",
	items	: 10,
	onLoad	: function(){},		
	onRender: function(){},
	
	render	: function(element){
		
	},
	
	read	: function(){
		
	},
	
	parse	: function(xml,success,response){

	},

	format		: function(date){

	},
	
	createDate	: function(str){
		
	} 
};

在第一步中,我们为对象创建了构造函数。现在,我们将检查所需的配置,并从我们的代理读取更新。

  • renderTo :将渲染小部件的元素;这个属性也可以是一个 jQuery 选择器。
  • 代理:我们将在其中发出 AJAX 请求调用以检索数据的 URL。我们已经创建了从 Buzz 服务读取信息的 PHP 文件;默认情况下它是“readfeed.php”。
  • 用户:我们希望从中获取更新的 Buzz 用户。
  • items:我们要在小部件中显示的更新数量。
  • onLoad :当数据加载到小部件中时我们将触发的事件;默认情况下,这是一个空函数。
  • onRender :当widget即将在页面中渲染时触发该事件;默认为空函数。

第 3 步。构造函数

让我们研究小部件的构造函数。

var BuzzReader = function(options){
	var url = "http://buzz.googleapis.com/feeds/{user}/public/posted";	//Step 1
	jQuery.extend(this,options || {});			//Step 2
	
	if(this.user === "") throw "The 'user' property is required";	//Step 3
	if(this.renderTo === "") throw "The 'renderTo' property is required";

	if(this.url === "")this.url = url.replace(/{user}/g,this.user);	//Step 4
	
	this.read();		//Step 5
};

在第一步中,我们定义了要从中检索数据的 Buzz 服务的 URL。我们将用用户配置替换“{user}”字符串(请参阅步骤 4)。

在第二步中,我们使用给定的选项覆盖了默认属性;我们使用 jQuery.extend 来做到这一点。

在第三步中,我们检查了所需的配置,其中之一是“user”和“renderTo”。如果缺少其中之一,我们将抛出异常。这对于使用我们插件的开发人员来说非常有用。

在第四步中,我们在变量“url”中搜索“{user}”字符串,并将其替换为我们希望在小部件中显示其动态更新的用户。

最后一步非常重要。在这里,我们开始读取和显示信息的过程。


第 4 步。阅读信息

我们已经设置了 PHP 脚本,用于将数据提取到我们的服务器。现在,我们只需要发出 Ajax 请求即可使用 jQuery 检索数据;让我们看一下下面的代码:

read	: function(){
	this.el = jQuery(this.renderTo);		//Step 1
	this.loader = this.el.append("
"); jQuery.ajax({ //Step 2 url : this.proxy, data : "url="+this.url, context : this, success : this.parse }); },

在第一步中,我们将一个新元素附加到容器中,通知查看者我们当前正在处理信息。

在第二步中,我们发出了 Ajax 请求。最重要的是“上下文”属性;此配置将允许您更改服务器响应时调用的函数的上下文。最后,我们将上下文设置为“this”,即 BuzzReader 对象。

请记住,PHP 脚本需要“url”参数。所以不要忘记发送;当服务器响应时,执行“parse”方法。


步骤 5.解析 XML 文档

Buzz 服务以 Atom feed 格式提供数据,因此我们需要解析并提取我们需要的信息。

这是从 Buzz 服务返回的 XML 文档的示例:


  
    
    
    Google Buzz
    2009-12-14T20:04:39.977Z
    tag:google.com,2009:buzz-feed/public/posted/117377434815709898403
    Google - Google Buzz
    
      Buzz by A. Googler from Mobile
      2009-12-14T20:04:39.000Z
      2009-12-14T20:04:39.977Z
      tag:google.com,2009:buzz/z12bx5v5hljywtfug23wtrrpklnhf3gd3
      
      
        A. Googler
        http://www.google.com/profiles/a.googler
      
      Bzz! Bzz!
      http://activitystrea.ms/schema/1.0/post
      
        http://activitystrea.ms/schema/1.0/note
        webupdates:a.googler@gmail.com.1258ecae5db
        Buzz by A. Googler from Mobile
        Bzz!  Bzz!
      
      
      0
    
  

一旦我们知道响应,我们就可以使用 jQuery 轻松解析文档。

parse	: function(xml,status){
	var that = this;
	var nodes = jQuery("entry",xml);	//Step 1
	this.el.empty();
	var info = [];
	nodes.each(function(){			//Step 2
		var date = that.createDate(jQuery("published",this).text());
		info.push({
			title		: jQuery("title",this).text(),
			author		: jQuery("author > name",this).text(),
			uri			: jQuery("author > uri",this).text(),
			summary 	: jQuery("summary ").text(),
			content		: jQuery("content:first",this).text(),
			published	: that.format(date),
			updated		: jQuery("updated",this).text(),
			date		: date,
			reply		: jQuery("link[rel=replies]",this).attr("href")
		});
	});
	this.data = info;				//Step 3
	this.onLoad.call(this,info);	
	this.render(this.renderTo);		//Step 4
},

我们收到两个参数:第一个是数据,在本例中是 XML 文档;第二个参数是请求的文本状态。

在第一步中,我们获得了所有“入口”节点;这是我们的 Buzz 更新和我们需要的所有信息所在的地方。接下来,我们清空小部件的容器,并创建一个空数组来将数据存储为每个节点的 JavaScript 对象。

在第二步中,我们迭代“entry”节点并提取“标题”、“作者”、“内容”等。这是一个非常简单的过程;我们所要做的就是编写选择器并设置搜索的根,在本例中根是节点“entry”。

我想指出我们提取“reply”属性的行 - 选择器看起来像这样:

先见AI
先见AI

数据为基,先见未见

下载
link[rel=replies]

我们指定需要节点“link”,该节点的属性“rel”等于“replies”。这很重要,因为每个“条目”内都有许多“链接”节点。

在第三步中,我们创建了对包含数据的数组的“this.data”引用。之后,我们执行“onLoad”事件并传递我们提取的信息。

在第四步中,我们执行了 render 方法。

在继续“render”方法之前,让我们回顾一下“createData”和“format”方法。我们为每个条目调用这些方法。

在“createDate”方法中,我们只会使用给定的字符串创建一个新的 Date 对象。该字符串的格式为“2009-12-14T20:04:39.977Z”,因此我们可以按如下方式创建 Date 对象:

createDate	: function(str){
	var date = new Date();
	date.setDate(str.substring(8,10));
	date.setMonth(str.substring(5,7) - 1);
	date.setFullYear(str.substring(0,4));
	date.setUTCHours(str.substring(11,13));
	date.setUTCMinutes(str.substring(14,16));
	date.setUTCSeconds(str.substring(17,19));
	return date;
}

或者我们可以使用一个简单的正则表达式来格式化字符串并将其提供给 Date 构造函数:

createDate	: function(str){
	//str = '2009-12-14T20:04:39.977Z'
	str = str.substring(0,19).replace(/[ZT]/," ").replace(/\-/g,"/");
	//str = '2009/12/14 20:04:39'
	return new Date(str);
}

在 format 方法中,我们将使用刚刚创建的日期对象,并返回发布日期和系统本地时间之间的时间 - 例如“11 分钟前”或“3 小时前”。

format		: function(date){
	var diff   = (((new Date()).getTime() - date.getTime()) / 1000),
		days   = Math.floor(diff / 86400),
		months = Math.floor(days / 31);

	if (isNaN(days) || days < 0)return date.toString();
	
	if(days == 0){ 
		if(diff < 60)return "Just now";
		if(diff < 120)return "1 minute ago";
		if(diff < 3600)return Math.floor( diff / 60 ) + " minutes ago";
		if(diff < 7200)return "1 hour ago";
		if(diff < 86400)return  Math.floor( diff / 3600 ) + " hours ago";
	}else if(days < 31){
		if(days == 1)return "Yesterday";
		if(days < 7)return days + " days ago";
		if(days < 31)return Math.ceil( days / 7 ) + " weeks ago";
	}else{
		if(months == 1)return "A month ago";
		if(months < 12)return Math.ceil( days / 31 ) + " months ago";
		if(months >=12)return Math.floor( days / 365 ) + " years ago";
	}
},

前面的代码虽然有点乏味,但非常简单。首先,我们获得当前时间与发布日期之间的差异(以分钟、天和月为单位)。之后,我们简单地比较了结果,并返回了一个正确格式的字符串。

现在让我们回顾一下“渲染”方法。


第 6 步。创建 GUI

到目前为止,我们仅从 Buzz 服务器中提取了数据,并解析了 XML 文档。这意味着我们已准备好在屏幕上显示信息。

render	: function(element){
	this.onRender.call(this,this);		//Step 1
	
	var html = [];				//Step 2
	html.push("
    "); for(var i = 0; i < this.items || i < this.data.lenght;i++){ html.push("
  • "+this.data[i].author+""+this.data[i].published+""+this.data[i].content+"
  • "); } html.push("
"); this.el.append(html.join("")); //Step 3 },

在第一步中,我们触发了“onRender”事件,这对于使用我们插件的程序员来说再次很有用。

在第二步中,我们创建了一个数组来存储动态 HTML。之后,我们创建了一个列表“ul”,然后迭代数据,为每个项目创建“li”节点;您可能注意到“for”条件有一个“or”运算符;这允许我们在数据数组结束时或当索引“i”达到将要使用该插件的开发人员定义的“items”属性时停止迭代。

在最后一步中,我们使用“append”方法将 HTML 插入到容器中。


第 7 步。使用小部件

为了使用我们的小部件,我们需要创建“BuzzReader”类的一个实例,但是,在此之前,让我们定义要渲染它的位置。创建一个 HTML 文件,并在 body 元素中添加以下内容:

我们将使用类“reader”在 div 内渲染我们的小部件,让我们按如下方式创建小部件的实例:

$(function(){

	new BuzzReader({
		renderTo	: "#buzz .reader",
		user	: "nettutsblog",
		items	: 3
	}); 
});

不要忘记将 jQuery 库和“buzz-widget.js”导入到您的 HTML 文件中。如果所有内容均已正确配置和编码,您应该会看到类似于下图的内容:

创建一个小部件来展示您令人兴奋的更新

第 8 步。设置小部件的样式

好吧,我们现在可以看到更新,但看起来不太漂亮;我们需要对其进行一些样式设置。

/* step 1 */
body{font-family:"Trebuchet MS",Arial,sans-serif;line-height:24px;font-size:14px;}

/*Step 2*/
#buzz{width:300px;margin:100px auto;border:1px solid #AFAFAF;}
#buzz > div{background-color:#E4E4E4;border:1px solid #F6F6F6;padding:10px;}
#buzz .reader{height:350px;overflow:auto;border:1px solid #F6F6F6;padding:80px 10px 10px 10px;background:#fff url(title.jpg) center 0 no-repeat;}
/* Step 3 */
#buzz ul{margin:0;padding:0;}
#buzz ul li{list-style-type:none;color:#A3A3A3;border-bottom:1px solid #E4E4E4;margin-bottom:5px;padding-bottom:5px;}
#buzz ul li div{color:#777;}
#buzz ul li a{color:#444;text-decoration:none;font-weight:normal;}
#buzz ul li a:hover{text-decoration:underline;}
#buzz ul li span{float:right;}

/* Step 4*/
#buzz .buzz-loading{position:absolute;margin-left:240px;width:16px;height:16px;background:transparent url(ajax-loader.gif) center center no-repeat;}

在前两步中,我们将小部件置于屏幕中央,并设置容器的大小、边框和颜色;我们还添加了徽标作为小部件的标题。

在最后两个步骤中,我们将样式设置为动态列表,更改了字体的颜色,并向链接添加了一些边距、边框和填充。

因此,我们拥有了更具吸引力的产品。

Google buzz widget

步骤 9.创建插件

本教程的最后一步是创建 jQuery 插件。让我们修改“buzz-widget.js”文件,将以下代码添加到文件末尾。

jQuery.fn.buzzReader = function(options){  	//Step 1
	return this.each(function(){
		var opts = options || {};		//Step 2
		opts.renderTo = this;
		new BuzzReader(opts);		//Step 3
	});
};

在第一步中,我们简单地命名了我们的插件。

在第二步中,如果参数“options”为空,我们将创建配置对象。接下来,我们将属性“renderTo”定义为实际元素。

在第三步中,我们创建了小部件的一个新实例。

现在,我们可以在 HTML 中使用我们的插件,如下所示:

$(function(){
	$("#buzz .reader").buzzReader({
		user	: "nettutsblog",
		items	: 3
	});
});
Google buzz widget

结论

我希望您已经了解了如何从 XML 文档中提取数据以及如何在任何网站上显示最新动态。任何问题?感谢您的阅读!

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

0

2026.01.15

公务员递补名单公布时间 公务员递补要求
公务员递补名单公布时间 公务员递补要求

公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

2

2026.01.15

公务员调剂条件 2026调剂公告时间
公务员调剂条件 2026调剂公告时间

(一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

10

2026.01.15

国考成绩查询入口 国考分数公布时间2026
国考成绩查询入口 国考分数公布时间2026

笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

2

2026.01.15

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

63

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

32

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

73

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

20

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号