2009年7月28日 星期二

使用JQuery取代css設置方案

研究jQuery真是對他越來越愛用
他的強大真是難以言喻,今天在玩一些css設計
原本一些難搞的瀏覽器相容性他都替我處理好了
原本我以為jQuery只能替我排除javascript在瀏覽器上的相容性問題
想不到他連css都替我handle了 真是件令人愉快的事情

舉個例子,元素透明度的設定問題
元素半透明的效果可以讓網頁更佳炫麗,但是考慮到瀏覽器問題這往往須要注意很多東西

<style>
.opac{
opacity:0.5; //for firefox
-moz-opacity:0.5;
filter:alpha(opacity=50); //for IE
}
</style>


如上面所示,設定個透明度為了瀏覽器相容必須設定同個屬性三次
但是使用jQuery呢,我們只須要一行程式碼就能解決

<script type="text/javascript">
$(document).ready(function(){
$('.opac').css("opacity","0.5");
});
</script>


這樣一來,要設計網頁障礙就更小了~

2009年7月27日 星期一

IE6下,不出現警告訊息關閉視窗

當我們用javascript的window.close();關閉視窗的時候
如果是母視窗的話就會跳出如下的警告訊息


也就是目前要關閉的視窗不是藉由window.open()來開啟的子視窗
他沒辦法藉由window.close來直接關閉
可以使用window.opener=null;來避開這項限制
也就是在執行close前先把opener設成null

window.opener=null;
window.close();

2009年7月26日 星期日

PHP 寫XML,responseXML一直為null

最近在玩jQuery,碰到了一些有趣的問題
當我用$.ajax像PHP送出要求一個XML文件的時候
照道理他回傳的是一個XMLHttpRequest,然後可以用他得到XML文本

var html = $.ajax({
url: "ajaxOutput.php",
async: false
,type: "GET"
}
).responseXML;

但是卻發生了responseXML總是為null的狀況,後來查了一下HTTP封包
他似乎被解讀成HTML文本 所以無法轉換
因為responseText可以正確抓到值

後來看了一下的我PHP程式碼

<?php
echo '<?xml version="1.0"?>';
echo '<book>';
echo 'jQuery';
echo '</book>';
?>

沒什麼問題,但是卻沒辦法讀取,找了一些範例好像也都是這樣寫
讀純xml也很正常


var html = $.ajax({
url: "test.xml",
async: false
,type: "GET"
}
).responseXML;


那倒底問題是出在哪裡
後來又看了一下jQuery文件

dataType (String) : (預設值:智能判斷xml或者html)預期服務器返回的資料類型。如果不指定,jQuery 將自動根據 HTTP 包 MIME 資訊返回 responseXML 或 responseText,並作為回調函數參數傳遞,可用值:

這樣就我就明白了,他會根據MIME來判斷這份文件是什麼類型
也就是必須透過Content-type告訴AJAX他是什麼東西,因此我必須告訴他我是一個XML文件
因此我只要設定一下header就能解決了 如下

<?php
header('Content-type: application/xml');
echo '<?xml version="1.0"?>';
echo '<book>';
echo 'jQuery';
echo '</book>';
?>

2009年7月20日 星期一

cannot send session cache limiter-headers already sent錯誤

今天幫學校弄網頁,使用PHP 因為我本身對PHP不熟,所以也碰到不少麻煩
在我使用session_start();想要啟用session的時候出現了

...cannot send session cache limiter-headers already sent....

這樣的錯誤,後來查了一下資料
在使用session_start()的時候網頁要避免有output,包括標準HTML串流

<?php
echo 'Hi';
session_start();
?>

或是
<html>
<?php
session_start();
?>

這樣也是不行,session_start()必須保證執行他之前沒有任何output,甚至是一個空白也不行
所以只要改成下面這樣就行了

<?php //php程式碼從網頁第一行第一格開始(且沒有空格)

session_start();
echo 'Hi~' //output在session_start()之後
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


又或者是更改php.ini,把output_buffering給打開
output_buffering預設是

output_buffering = off

可以改成

output_buffering = 4096

這樣就算大功告成了