顯示具有 AJAX 標籤的文章。 顯示所有文章
顯示具有 AJAX 標籤的文章。 顯示所有文章

2010年2月2日

PHP中xajax庫中文問題及提示返回XML文件無效的解決辦法

xajax是PHP下一個非常好的ajax框架,雖然xajax自己說自己是一個庫(Library),但是我覺得它更像一個框架 (Framework)。xajax是一個開源的 PHP 類庫 它能夠讓你黏合HTML、CSS、Javascript和PHP,並可以結合Smarty模板系統使用。

  在運用Xoops的Page模組的時候,發現其不能和中文正常工作,特別是不能和UTF-8編碼的頁面一起工作,昨天在利用這個實現 DataGrid的時候發現完全不能正常工作了,一直報「the XML response that was returned from the server is invalid」這個錯誤,Google了一下,發現不少人也有這個問題。結合之前解決Xoops的Page模組(感謝文明豬)的UTF-8使用問題的方 法,終於發現了完美解決xajax庫使用中文的方法。

  如果頁面採用GB2312或GBK作為編碼或字符集,一般網絡上面提到的方法可以解決:需要注意的是common.php、 server.php及server.php用到的php文件(特別是生成數據的文件)全部不要使用UTF-8編碼格式保存而使用ASCII格式保存。同 時server.php輸出的數據內容最好也採用gb2312編碼。

  在common.php前面定義

  PHP代碼

  define('XAJAX_DEFAULT_CHAR_ENCODING','GB2312'); 

  再在調用時使用:

  PHP代碼

  $xajax = new xajax();  

  $xajax->decodeUTF8InputOn(); 

  或者

  PHP代碼

  $xajax = new xajax('gb2312');  

  $xajax->setCharEncoding();  

  $xajax->decodeUTF8InputOn();  

  $objResponse = new xajaxResponse('gb2312');  

  如果頁面採用UTF-8字符集的話,網上一些人說使用UTF-8格式編碼就可以了,實際上即使全部使用UTF-8編碼也不能正常工作,還是會報 錯:「the XML response that was returned from the server is invalid」。聯想到之前在IE下碰到UTF-8 BOM Bug(文章:IE下頁面無端端空出一行及utf8頁面無法顯示的解決方法 ),會不會這個地方服務器傳回的XML文件中也包含多個UTF-8 BOM內容呢?通過ethereal截獲數據包發現,服務器返回的內容中還真是包含了多個UTF-8 BOM,可能還是IE使用的Microsoft XML Parser的UTF-8 BOM Bug吧。這樣解決辦法就出來了:所有頁面全部採用UTF8編碼並使用無UTF-8 BOM保存(UltraEdit 操作方法:F12或另存為界面中格式下拉框選擇『UTF-8-無 BOM'),頁面包括xajax庫文件、common.php文件、server.php文件。供訪問的頁面也可以使用無UTF-8 BOM保存。

  有時候返回的參數(特別是中文部分)被url編碼了,這個時候需要我們將返回的數據使用Urldecode進行處理,以便能夠正常完成後面的數據庫操作。

  最新xajax 0.25下載地址:http://prdownloads.sourceforge.net/xajax/xajax_0.2.5.zip?download

  xajax中文手冊(HonestQiao第一版,FlyingHail修改版) http://www.flyinghail.net/?p=44

  UTF-8 BOM解釋:"EF BB BF" 這三個字節就叫BOM,BOM的全稱叫做"Byte Order Mard"。在UTF-8文件中常用BOM來表明這個文件是UTF-8文件,而BOM的本意實在UTF-16中用來表示高低字節序列的。

  另外,PHP網站上說使用--enable-zend-multibyte可以解決這類問題,不過沒有嘗試,並且預計在PHP 6.0中會對Unicode做完美的支持

2008年11月12日

Learning jQuery Book pdf 下載

jQuery: The Write Less, Do More JavaScript LibraryDownload Documentation Plugins Tutorials Discuss Blog
jQuery is a new type of JavaScript library.
jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle events, perform animations, and add Ajax interactions to your web pages. jQuery is designed to change the way that you write JavaScript.

「You start with 10 lines of jQuery that would have been 20 lines of tedious DOM JavaScript. By the time you are done it's down to two or three lines and it couldn't get any shorter unless it read your mind.」 - Dave Methvin

辛辛苦苦找到了 JQuery 的文檔,為了方便各位 JavaScript Developer 的學習,我給大家提供下載啦:

Packt_Publishing_Learning_JQuery_Jul_2007.zip

各位在轉貼時別忘了註明出處哦!

2007年9月25日

php與ajax的應用:xajax基本介紹

  xajax 是一個開源的 PHP 類庫,用來構建WEB上的Ajax 程式,它本身是一個以Server為主的Ajax函示庫,也就是說很多的商業邏輯將會放在Server Side的php程式裡。使用xajax開發的應用軟體,無需重新調入頁面,就能夠非同步調用伺服器端的PHP函數和更新內容。

  xajax 最大的特色是支援 UTF-8 及 Smarty,client 端不用自己寫 callback,client 端送出運算請求給 Server 端後,Server 端可以直接把運算結果傳送到網頁元素上。至於 Smarty 支援的部份,因為 Client 端只需一行 $xajax->printJavascript(); 就可以產生 AJAX 所需的 Javascript,所以應該大部份的 Template engine 也都支援。

如何安裝xajax
xajax安裝環境:

  • Apache Web伺服器或Windows XP/2003上的IIS伺服器

  • PHP 4.3.x或PHP 5.x

  • 流覽器最低要求:IE5.5,Firefox 1.0,或相當的基於Gecko內核的流覽器,Safari 1.3,Opera 8.5。老版本僅對GET方法有效。


安裝方式:
xajax 版本發佈

  • xajax 0.2 = 穩定版 (當前版本號 0.2.5)

  • xajax 0.5 = 測試版 (當前版本號 0.5 beta 2)


  [ 按此下載xajax0.2.5 ]將套裝軟體解壓並將其拷貝至你的WEB站點目錄下。如果你願意,你可以在你的WEB伺服器下建立一個名稱為“xajax”的目錄,並將所有檔放進去(確信你要知道頁面的相對URL位址,你才能夠提供正確的xaja的安裝URL地址)。注意如果想讓常式生效,你必須將"examples"目錄下的"thewall"目錄設為可寫。

xajax使用範例

<?php
require_once( 'xajax/xajax.inc.php' ); //引入xajax函式

//建立xajax物件
$xajax=new xajax();

//以下決定是否要使用 xajax debug
//$xajax->debugOn(); // Uncomment this line to turn debugging on

//註冊在php中所要呼叫的函式
$xajax->registerFunction("myFunction");

//處理呼叫
$xajax->processRequests();
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>xajax範例</title>

<!--產生xajax初始化所需的代碼-->
<?php $xajax->printJavascript('xajax/'); ?>

</head>

<body>
<form id="form1" action="javascript:void(null);">
請輸入你的大名:<input type="text" name="username">

<!--用來觸發xajax事件的button-->
<input type="button" name="submit" value="送出" onClick="xajax_myFunction(xajax.getFormValues('form1'));">

</form>

<!--顯示回傳結果的div-->
<div id="outputDiv"></div>

</body>
</html>

<?php
function myFunction($aFormValues)
{
//創建一個xajaxResponse物件
$objResponse = new xajaxResponse();

//接收表單post的資料
$username = $aFormValues['username'];

if (trim($username) == "")
{
//產生錯誤訊息的alert
$objResponse->addAlert("名字尚未輸入!");

//回傳xajaxResponse物件
return $objResponse;

}
else
{
//設定id為"outputDiv"的div元素的innerHTML屬性為"xxx,你好!!"
$objResponse->addAssign("outputDiv","innerHTML",$username.',你好!!');

//回傳xajaxResponse物件
return $objResponse;

}
}
?>



詳細說明:

<?php
require_once( 'xajax/xajax.inc.php' ); //引入xajax函式

//建立xajax物件
$xajax=new xajax();

//以下決定是否要使用 xajax debug
//$xajax->debugOn(); // Uncomment this line to turn debugging on

//註冊在php中所要呼叫的函式
$xajax->registerFunction("myFunction");

//處理呼叫
$xajax->processRequests();
?>


初始化xajax函式,注意紅字部分為所要呼叫的function名稱。


<?php $xajax->printJavascript('xajax/'); ?>


在你的HTML的<head></head> 標籤之間加入此php語法以產生xajax初始化所需的代碼。


<form id="form1" action="javascript:void(null);">
請輸入你的大名:<input type="text" name="username">

<!--用來觸發xajax事件的button-->
<input type="button" name="submit" value="送出" onClick="xajax_myFunction(xajax.getFormValues('form1'));">

</form>

<!--顯示回傳結果的div-->
<div id="outputDiv"></div>


用來傳值的表單,注意紅字的部分為觸發xajax的方法。


  • xajax_xxx():xxx的部分為之前呼叫的function名稱,如xajax_myFunction。

  • xajax.getFormValues('xxx'):xajax可利用此方法取得表單所傳送的資料,xxx的部分為表單名稱,如xajax.getFormValues('form1')。

  • <div id="outputDiv"></div>:用來顯示回傳訊息的div。




<?php
function myFunction($aFormValues)
{
//創建一個xajaxResponse物件
$objResponse = new xajaxResponse();

//接收表單post的資料
$username = $aFormValues['username'];

if (trim($username) == "")
{
//產生錯誤訊息的alert
$objResponse->addAlert("名字尚未輸入!");

//回傳xajaxResponse物件
return $objResponse;

}
else
{
//設定id為"outputDiv"的div元素的innerHTML屬性為"xxx,你好!!"
$objResponse->addAssign("outputDiv","innerHTML",$username.',你好!!');

//回傳xajaxResponse物件
return $objResponse;

}
}
?>


被呼叫到的php function,注意紅字的部分就是之前呼叫的function名稱。


  • $objResponse = new xajaxResponse():創建一個xajaxResponse物件,用來處理xajax回傳程序的物件。

  • $objResponse->addAlert("xxx"):產生彈出訊息的JavaScript,xxx部分可填入想顯示的訊息。

  • $objResponse->addAssign("outputDiv","innerHTML","xxx"):設定id為"outputDiv"的div元素的innerHTML屬性為"xxx",xxx部分可填入想顯示的訊息。

  • return $objResponse:回傳xajaxResponse物件


以上所有這些功能都是在伺服器端PHP函數中通過構造並返回一個XML回應來實現的。