
日期:2006-09-28 作者:喜騰小二 來源:PHPChina
想象使用一個簡單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> |
| <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> |
| //如果不存在目錄就建立一個 $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"; } ?> |
| 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')[i].firstChild.data; var _link = response.getElementsByTagName('link')[i].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; } |