<link href="css/layout.css" rel="stylesheet" type="text/css" /> <script src="js/request.js"></script> |
<body onload="javascript:makeRequest('request.php?request=' + document.feedForm.feed.value + '"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> |
创建定制的PHP对象
我用PHP创建了一个小型RSS类,它在本地服务器上创建一个请求馈送的副本,这样它可以为我们稍后要创建的XML HTTP Request对象所存取。典型地,你不能跨域请求一个文件,这意味着你要请求的文件需要位于本地服务器上。这个类是一种解决跨域问题的办法,因为它创建该馈送的一个副本,这个副本在本地服务器上被请求并且把本地路径返回到该馈送,然后它由该Request对象来存取。
这个类中唯一的方法是一个请求方法,它仅有一个指向所请求的RSS 馈送的URL的参数。然后,它通过rss的名字来检查是否一目录位于本地服务器上。如果不存在,就创建一个并把其权限模式设置为0666,这意味着该目录可读写。当被设置为可读的时,该目录就可以在以后被存取;而当被设置为可写的时,就可以把该馈送的一个副本写向本地服务器上的目录:
//如果不存在目录就创建一个 $dir = "rss"; if(!is_dir($dir)) { mkdir($dir, 0666); } |
//创建唯一的命名 $file=md5($rss_url); $path="$dir/$file.xml"; |
//复制馈送到本地服务器 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; } } } ?> |
<? 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); } |
function sendRequest(){ if(checkReadyState(post)){ request = createRequestObject(); request.onreadystatechange = onResponse; request.open("GET", post.responseText, true); request.send(null); } } |
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; |
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; } |
function checkForTag(tag){ if(tag != undefined) { return true; } else{ return false; } } |
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; |
function showDetails(index){ document.getElementById('details').innerHTML = response.getElementsByTagName('description')[index].firstChild.data; } |