|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
PHP的理解是新手最难迈过的一道门槛,不过你应该感到幸运的是PHP已经最大极限的为了新手而努力了,如果你学过其他的语言,也许会觉得PHP的确相当的简单,但是如果你之前什么都没学过,那么阿弥陀佛,硬着头皮琢磨吧。ajax|rss|创立 想象利用一个复杂HTML文件来把一个恳求发送到一个办事器端剧本,收到一个基于该恳求的定制XML文件,然后把它显示给用户而几近不需求刷新阅读器!本文作者将同你一同切磋如何在通俗Web使用法式中结合PHP和AJAX手艺来创立及时的数据传输而不需求停止阅读器刷新。
虽然本文所利用的是PHP言语,然而请记住任何办事器端言语城市正常任务。为了了解本文,我假定你根基了解JavaScript和PHP或一相似办事器端言语。
本文示例利用AJAX来把一恳求从一个RSS馈送发送到必定制的PHP对象。该PHP对象复制一份在当地办事器上的该馈送并前往这一途径。该恳求对象收到这一途径,剖析它,而且把数据以HTML模式显示给用户。这听起来触及良多步调,其实它仅由4个小文件构成。之所以利用了4个小文件,是为了均衡它们各自特定的力气而使全部体系的处置极富效力性。
有些读者能够会问,为何你要创立在当地办事器上的馈送的一个正本而不是复杂剖析最原始的馈送。缘由是,如许以来可以答应绕过XML HTTP Request对象所强加的跨域限制。前面,我还会注释如何创立这个定制的PHP对象;然而起首,让咱们从表单创立入手下手。
创立收回恳求的表单
你要做的第一工作是,在你的HTML的head标签之间包含你能够想利用的JavaScript和任何CSS文件。我包含了一个式样表来完成该聚合器的最初结构并用一个JavaScript文件来收回恳求和停止馈送剖析:
<link href="css/layout.css" rel="stylesheet" type="text/css" />
<script src="js/request.js"></script>
下一步,创立一个表单,它针对你所选择的一个RSS馈送收回恳求。我创立的表单只包含一个输出字段和一个提交该恳求的按钮。该恳求的查询是一个字符串,它由馈送输出值和一个将在办事器端被校验的口令字构成;作为一个示例,我利用了上面模式:
"password=mypassword
该代码在每次页面加载之时收回一次恳求;因而,假如页面被刷新,现有的在该输出域中的馈送串将在页面加载时被恳求。上面是一个表双数据的示例,连统一些div标签用来显示已剖析的馈送的特定结点:
<body password=mypassword');">
<form name="feedForm" method="post" action="javascript:makeRequest('request.php?request=' + document.feedForm.feed.value + '"password=mypassword');">
Enter a feed: <input type="text" name="feed" id="feed" size="20">
<input type="submit" name="submit" value="Add Feed">
</form>
<div id="logo"></div>
<hr/>
<div id="copy"></div>
<div id="details"></div>
</body>
我所创立的这三个div标签是logo,copy和details,个中每个都在结构款式表中有一个与之相干联的款式。当咱们剖析馈送时将会用到它们,然而咱们起首需求可以存取咱们所恳求的馈送。这可使用我后面所提到的PHP对象来完成。
创立定制的PHP对象
我用PHP创立了一个小型RSS类,它在当地办事器上创立一个恳求馈送的正本,如许它可觉得咱们稍后要创立的XML HTTP Request对象所存取。典范地,你不克不及跨域恳求一个文件,这意味着你要恳求的文件需求位于当地办事器上。这个类是一种处理跨域成绩的举措,由于它创立该馈送的一个正本,这个正本在当地办事器上被恳求而且把当地途径前往到该馈送,然后它由该Request对象来存取。
这个类中独一的办法是一个恳求办法,它唯一一个指向所恳求的RSS 馈送的URL的参数。然后,它经由过程rss的名字来反省是不是一目次位于当地办事器上。假如不存在,就创立一个并把其权限形式设置为0666,这意味着该目次可读写。当被设置为可读的时,该目次就能够在今后被存取;而当被设置为可写的时,就能够把该馈送的一个正本写向当地办事器上的目次:
//假如不存在目次就创立一个
$dir = "rss";
if(!is_dir($dir))
{
mkdir($dir, 0666);
}
注重
在一台Windows机械上,关于PHP 4.2.0及以上版本中形式设置是不被请求的。然而,假如它存在的话,它将被疏忽;因而,我保存了它,以备该工程被迁徙到一台UNIX或Linux办事器上。
在把馈送复制到该办事器前,咱们需求一个独一的文件名。我对这个完全的URL利用了md5加密办法以确保一切馈送的名字是独一的。经由过程这个新的文件名,它可以毗连一个描写指向该文件的目次的字符串;这将在创立该馈送的正本时利用:
//创立独一的定名
$file=md5($rss_url);
$path="$dir/$file.xml";
经由过程利用被界说在下面的途径和到原始的被恳求的馈送的URL的参考,如今咱们能创立该文件的一个正本。最初,把该途径前往到该新文件,作为对该恳求的呼应:
//复制馈送到当地办事器
copy($rss_url,"$path");
return $path;
Following is the small, yet powerful RSS class in its entirety:
<?php
class RSS
{
function get($rss_url)
{
if($rss_url != "")
{
//假如不存在目次就创立一个
$dir = "rss";
if(!is_dir($dir))
{
mkdir($dir, 0666);
}
// 创立一个独一的名字
$file = md5($rss_url);
$path = "$dir/$file.xml";
//复制馈送到当地办事器
copy($rss_url, "$path");
return $path;
}
}
}
?>
为了存取该PHP类中的办法,需求有一个恳求文件来担任到该类的一个接口,这也恰是咱们正在恳求的文件。这个文件起首验证从该恳求查询的一口令变量,或前往一条指定该恳求者不是一位经受权的用户的动静,或用指向RSS馈送(该馈送在由恳求办法处置后被复制到当地办事器)的途径作出呼应。为了呼应该RSS馈送,需求包括这个RSS对象并把它实例化,而且需求经由过程利用被恳求的馈送的URL作为一参数来激活恳求办法:
<?
if($password == "mypassword")
{
require_once('classes/RSS.class.php');
$rss = new RSS();
echo $rss->get($request);
}
else
{
echo "You are an unauthorized user";
}
?>
GET/POST与AJAX相联合
为了POST恳求,咱们起首需求创立该恳求对象。假如你没有创立恳求对象的经历,那末可以读一下我的文章《How To Use AJAX》或复杂地研讨一下本文的示例源代码。一旦创立该恳求对象,就能够挪用sendFeed办法并传递由表单所创立的URL:
function sendFeed(url){
post.onreadystatechange = sendRequest;
post.open("POST", url, true);
post.send(url);
}
一旦收到来自于PHP对象的呼应并被准确加载,则对与该呼应响应的当地文件收回另外一个恳求。在这类情形中,post.responseText供应给咱们该新文件的途径:
function sendRequest(){
if(checkReadyState(post)){
request = createRequestObject();
request.onreadystatechange = onResponse;
request.open("GET", post.responseText, true);
request.send(null);
}
}
剖析呼应
因为RSS馈送之间的区分,剖析呼应具有必定的应战性。一些含有包括题目和描写结点的图象,而其它则没有。因而,当咱们剖析回馈时,咱们需求做一点反省来译解它是不是包含一图象。假如它包含一图象,咱们就能够,与该馈送的题目和链接一同,在image div标签中显示该图象:
var _logo = "";
var _title = response.getElementsByTagName('title')[0].firstChild.data;
var _link = response.getElementsByTagName('link')[0].firstChild.data;;
_logo += "<a href='" + _link + "' target='_blank'>" + _title + "</a><br/>";
if(checkForTag(response.getElementsByTagName('image')[0]))
{
var _url = response.getElementsByTagName('url')[0].firstChild.data;
_logo += "<img src='" + _url + "' border='0'><br/>"
}
document.getElementById('logo').innerHTML = _logo;
咱们不但必需反省每一个图象以显示它,当遍历馈送中一切的项时咱们还需求对之停止反省。由于假如存在一个图象,那末一切别的的题目和链接结点索引都将没法正常任务。因而,当发明图象标签时,咱们应当经由过程在每次遍历中增添索引值(+1)来调剂题目和链接结点的索引:
if(checkForTag(response.getElementsByTagName('image')[0]) "" i>0){
var _title=response.getElementsByTagName('title')[i+1].firstChild.data;
var _link=response.getElementsByTagName('link')[i+1].firstChild.data;
}
else{
var _title =response.getElementsByTagName('title').firstChild.data;
var _link = response.getElementsByTagName('link').firstChild.data;
}
你可使用checkForTag办法来反省是不是存在特定的标签:
function checkForTag(tag){
if(tag != undefined) {
return true;
}
else{
return false;
}
}
存在很多种停止馈送剖析的能够性。例如,你可以把项赋到种别上并使得该种别可折迭,如许用户就能够对其想旁观的内容停止选择。作为一个示例,我利用日期来对项停止分类-这可以经由过程译解是不是针对一个特定项的pubDate分歧于前一个项的pubDate而且响应地显示一新的日期来完成:
if(i>1){
var previousPubDate = response.getElementsByTagName('pubDate')[i-1].firstChild.data;
}
if(pubDate != previousPubDate || previousPubDate == undefined){
_copy += "<div id='detail'>" + pubDate + "</div><hr align='left' width='90%'/>";
}
_copy += "<a href=\"javascript:showDetails('" + i + "');\">" + _title + "</a><br/><br/>";
document.getElementById('copy').innerHTML += _copy;
注重,下面的最初一局部是showDetails办法,它用于当一用户从一个馈送当选择一特定的项时停止细节显示。这个办法有一个参数(项索引值),这个索援用于发明在该馈送中details结点的索引:
function showDetails(index){
document.getElementById('details').innerHTML = response.getElementsByTagName('description')[index].firstChild.data;
}
结论
利用AJAX发送查询字符串到一个办事器端剧本并检索一个基于该串的定制呼应,这关于任何web开辟者都有完成的能够。如许以来,你的下一个web使用法式也将会充斥了新的能够性。 可以在书上很方便地做标记,及时记下自己的心得体会。 |
|