2012年12月9日 星期日

IE7 jquery遇json2.js無效時

XXX 為什麼 IE6 可以自動調用 parse,但在 IE8、FireFox  就是不行 ?????

原來 IE8 與 FireFox(11)已內建原生 JSON  程式,所以 jQuery 會直接調用原生的 JSON.parse,以致上面所述修改 json2.js 的功用皆失效,根本不會叫用 json2.js。

查看 json2.js  程式碼之 162 至 165 來

var JSON;
if (!JSON) {
    JSON = {};
}

即判斷如果已註冊 JSON 物件,則 json2 就不再註冊此功能,為了能使用上面針對日期物件修正的功能,只好把 163、165兩行註解掉,強制 jQuery 使用 jsons2.js 的 JSON 功能!

var JSON;
// if (!JSON) {
    JSON = {};
//}

2012年11月21日 星期三

匯出的excel如果要合併儲存格後排序


將HTML文件的擴展名改為XLS後,用Excel打開,裡邊的每個<br />都會使後邊的文字進入另一個單元格,要使<br />在一個單元格內起到換行的作用,可以在CSS裡加入這一句:
br {mso-data-placement:same-cell;} Excel就會把<br />解釋成回車了。


<style type='text/css'>
br {
mso-data-placement: same-cell;
}
</style>




利用網頁轉出資料到 Excel 上常會遇到想要以文字格式顯示的數字,像是手機號碼、帳號之類的資料,被 Excel 自動轉換成數字格式,於是前面的 0 被省略掉了、帳號變成科學記號了...等等的麻煩,有個方便的方式不會去加入奇奇怪怪的東西到欄位裡面,讓 Excel 不會去判斷成數字,很簡單,只要在 td 裡面加入 style 設定就行了。 

mso-number-format:"0"    NO Decimals
mso-number-format:"0\.000"    3 Decimals
mso-number-format:"\#\,\#\#0\.000"    Comma with 3 dec
mso-number-format:"mm\/dd\/yy"    Date7
mso-number-format:"mmmm\ d\,\ yyyy"    Date9
mso-number-format:"m\/d\/yy\ h\:mm\ AM\/PM"    D -T AMPM
mso-number-format:"Short Date"    01/03/1998
mso-number-format:"Medium Date"    01-mar-98
mso-number-format:"d\-mmm\-yyyy"    01-mar-1998
mso-number-format:"Short Time"    5:16
mso-number-format:"Medium Time"    5:16 am
mso-number-format:"Long Time"    5:16:21:00
mso-number-format:"Percent"    Percent - two decimals
mso-number-format:"0%"    Percent - no decimals
mso-number-format:"0\.E+00"    Scientific Notation
mso-number-format:"\@"    Text
mso-number-format:"\#\ ???\/???"    Fractions - up to 3 digits (312/943)
mso-number-format:"\0022£\0022\#\,\#\#0\.00"    £12.76
mso-number-format:"\#\,\#\#0\.00_ \;\[Red\]\-\#\,\#\#0\.00\ "    

2012年10月3日 星期三

php 兩個日期相差幾日



$access_date = "2000/05/27"; 

//explode()函數用一個字串作為分界來分解另一個字串。這個例子$access_date通過字串」/」來分解 

$date_elements = explode("/" ,$access_date); 

// 此時 

// $date_elements[0] = 2000 

// $date_elements[1] = 5 

// $date_elements[2] = 27 

echo mktime (0, 0,0 ,$date_elements [1], $date_elements[ 2],$date_elements [0]); 



$startdate=mktime("0","0","0","5","3","1998");
$enddate=mktime("0","0","0","6","5","1999");
//所得到的值為從1970-1-1到參數時間的總秒數:是整數.那么
//下面的代碼就好編多了:
$days=round(($enddate-$startdate)/3600/24) ;
//days為得到的天數;
若mktime()中的參數缺省,那表示使用當前日期,這樣便可計算從借書日期至今的天數.


2012年9月25日 星期二

修正郵件標題亂碼



$this->subject = "=?UTF-8?B?" . base64_encode($this->subject) . "?=";
//郵件修正亂碼
就可以正常顯示標題。 不會中斷長標題。

AD 帳戶 到期日 寫入方式(for php)

首先寫入AD 帳戶到期日的欄位是:accountExpires

accountExpires 是以100 nanosecond increment為單位寫入
換算方式如下:



$account_expires_string = (現在的timestamp+ 11644560000) * 10000000;

echo "<br>".$account_expires_string."\n";

$info["accountExpires"] =  account_expires_string  ;

$info["accountExpires"] = 0; =>表示帳號永不到期


2012年9月18日 星期二

php 產生制定格式 日期的做法



產生 一個月之後的日期
echo date_create("+1 month")->format('Y-m-d h:i:s');

產生一天之後的日期
echo date_create("+1 day")->format('Y-m-d h:i:s');

2012年9月5日 星期三

遇PHPEXCEL輸出會有亂碼


在header()之前加上
ob_end_clean();
就這麼一句,亂碼解決了!

PHPEXCEL 讀取excel ,寫入excel

1、include 這三隻
require_once(PHPExcel.php") ;
require_once(PHPExcel/IOFactory.php") ;
require_once(PHPExcel/Reader/Excel5.php") ;


讀取的部分
2、for2003前的版本
$reader = PHPExcel_IOFactory::createReader('Excel5');
$PHPExcel = $reader->load('2012_09_05_member.xls'); // 檔案名稱 需與執行的程式放在同一目錄
$sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表(編號從 0 開始)
$highestRow = $sheet->getHighestRow(); // 取得總列數


$i =0;
// 一次讀取一列
for ($row = 2; $row <= $highestRow; $row++) {
for ($column = 0; $column <= 7; $column++) {
$val = $sheet->getCellByColumnAndRow($column, $row)->getValue();
// echo $val . '';
}
$i++;
// echo "<br />";
}

寫入的部份:
3、

$PHPExcel->setActiveSheetIndex(0);
$l=0;
 for ($k = 0; $k < count($member) ; $k++) {
$PHPExcel->getActiveSheet()->setCellValueByColumnAndRow(8,($k+2) ,$member[$l][8]);
  $l++;
 }


4、輸出的部份

$PHPExcelWriter = PHPExcel_IOFactory::createWriter($PHPExcel, 'Excel5');
$PHPExcelWriter->save('檔名');
ob_end_clean();
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename= 檔名 ");
header("Content-Length: ".filesize(' 檔名 '));
@readfile(' 檔名 ');




2012年8月31日 星期五

javascript date.parse在IE和FF中的區別

這個方法是很常用的,比如在驗證輸入日期是否存在時,可以使用它,如果是一個不存在的日期,則其返回值將是NaN,另外如果要比較兩個日期的先後,或是計算兩個日期相差的天數,都可以用到。

Date.parse(dateVal)   這個方法是很常用的,比如在驗證輸入日期是否存在時,可以使用它,如果是一個不存在的日期,則其返回值將是NaN,另外如果要比較兩個日期的先後,或是計算兩個日期相差的天數,都可以用到。  今天在使用它比較日期先後的時候遇到了一個奇怪的問題,是關於日期格式的,parse方法要求短日期可以使用“/”或“-”作為分隔符,但是必須月/日/年的格式來表示,例如今天是“7/6/2008”或是“7-6-2008”,問題就出現在這裡,當使用“7-6-2008”這種格式時,在IE中可以正常解析,但在FireFox中,返回值卻總是NaN。一開始以為是代碼出現問題,檢查以後才發現是瀏覽器的原因,後來將格式改為“7/6 /2008”後在IE和FF中都可以正常解析了。

2012年8月20日 星期一

favicon轉站小圖示


Favikon 網站小圖示(favicon)產生器


Favikon 網站小圖示(favicon)產生器
如果你有網站或部落格,應該為它加上一個網站小圖示,也就是 Favicon(發音為”fave-icon”,也就是喜愛的圖示),通常此圖示會出現在網頁瀏覽器的網址列旁邊,會使用標誌或是代表網站的圖片,除了出現在瀏覽器以外,也會使用在 RSS 閱讀器列表或是鏈結清單裡,加上好的 Favicon 可以讓使用者更容易辨識並記住你的網站。
一般來說 Favicon 的大小為 16×16格式為 ICO 或 PNG,如果你沒有辦法使用繪圖軟體製作出圖示,透過 Favikon 服務只要把圖片上傳、在拖曳出剪裁範圍,就能夠線上產生兩種格式的 Favicon 網站小圖示。
網站名稱:Favikon網站鏈結:http://www.favikon.com/

使用教學

將檔案上傳後,會出現剪裁和縮放的操作框,把虛線拉到你想要保留的位置,然後點擊下面的下載為 ICO(Download ICO)或是下載為 PNG(Download PNG)就完成了。
不想使用這張圖片嗎?點擊上方的炸彈即可將圖片刪除。
Favikon 網站小圖示(favicon)產生器
經由 Favikon 轉換後的 Favicon 圖示大小確定為 16×16,格式有兩種。
Favikon 網站小圖示(favicon)產生器
最後在網站原始碼的 <head> 和 </head> 間插入以下語法就能使用小圖示:
<link rel="shortcut icon" href="你的favicon路徑" />

2012年8月15日 星期三

shuffle: 將陣列的順序弄混


PHP shuffle這個函式可以將陣列的順序打亂(可以拿來當洗牌程式用)
範例中原本的陣列是1~52,使用shuffle就會把順序打亂囉!
1$poker_tag array();
2for$i = 1; $i <= 52; $i++ ){
3    $poker_tag[] = $i;
4}
5//打亂陣列,洗牌
6shuffle($poker_tag);

2012年8月13日 星期一

不同瀏覽器對於textarea中換行符的處理


此次遇到的問題在於 Textarea 有輸入換行的資料時候會發生,接收到的資料中有換行字元的話,不同瀏覽器會有不同的字元,因此若要取代成 Html 的換行標籤的時候就有可能判斷錯誤,或是還有一些字元存在。
我將測試的結果整理如下:
瀏覽器換行字元
IE\r\n
Chrome\n
Firefox\n
Safari\n
Oprea\n

2012年8月1日 星期三

擷取字串前幾個字並避免截掉半個中文字

php5.0之前的做法 --utf-8 編碼字串



function CuttingStr($str, $strlen) {
//把'&nbsp;'先轉成空白
$str = str_replace('&nbsp;', ' ', $str);

$output_str_len = 0; //累計要輸出的擷取字串長度
$output_str = ''; //要輸出的擷取字串

//逐一讀出原始字串每一個字元
for($i=0; $i<strlen($str); $i++)  {
//擷取字數已達到要擷取的字串長度,跳出回圈
if($output_str_len >= $strlen){
break;
}

//取得目前字元的ASCII碼
$str_bit = ord(substr($str, $i, 1));

if($str_bit  <  128)  {
//ASCII碼小於 128 為英文或數字字符
$output_str_len += 1; //累計要輸出的擷取字串長度,英文字母算一個字數
$output_str .= substr($str, $i, 1); //要輸出的擷取字串

}elseif($str_bit  >  191  &&  $str_bit  <  224)  {
//第一字節為落於192~223的utf8的中文字(表示該中文為由2個字節所組成utf8中文字)
$output_str_len += 2; //累計要輸出的擷取字串長度,中文字需算二個字數
$output_str .= substr($str, $i, 2); //要輸出的擷取字串
$i++;

}elseif($str_bit  >  223  &&  $str_bit  <  240)  {
//第一字節為落於223~239的utf8的中文字(表示該中文為由3個字節所組成的utf8中文字)
$output_str_len += 2; //累計要輸出的擷取字串長度,中文字需算二個字數
$output_str .= substr($str, $i, 3); //要輸出的擷取字串
$i+=2;

}elseif($str_bit  >  239  &&  $str_bit  <  248)  {
//第一字節為落於240~247的utf8的中文字(表示該中文為由4個字節所組成的utf8中文字)
$output_str_len += 2; //累計要輸出的擷取字串長度,中文字需算二個字數
$output_str .= substr($str, $i, 4); //要輸出的擷取字串
$i+=3;
}
}

//要輸出的擷取字串為空白時,輸出原始字串
return ($output_str == '') ? $str : $output_str;
}

2012年6月27日 星期三

使用jquery清空input file欄位的作法


一般来说,在对一个文件域(input type=”file”)使用了验证后,我们总会希望把文件域中的值给清空了(否则错误的文件仍然会被提交),而在IE中,安全设置的原因,是不允许更改文件域的值的(也就是不能使用val(“”))
那么很显然,我们就只能换个思路,把这个input元素复制一个,然后将原来的删除。
在IE下复制元素的时候,其中的值是不会被复制的,所以就达到了清空文件域的目的了。
而在Firefox下,其中的值也会被一同复制,那么我们就顺便清空一下就做到兼容了。
代码如下:
  1. var file = $(":file");  
  2. file.after(file.clone().val(""));  
  3. file.remove();  



2012年6月24日 星期日

php遇session誇頁window.location無效


拋開cookie使用session
PHP中SESSION不能跨頁傳遞問題的解決辦法

在PHP中使用過SESSION的朋友可能會碰到這麼一個問題,SESSION變量不能跨頁傳遞。這令我苦惱了好些日子,最終通過查資料思考並解決了這個問題。我認為,出現這個問題的原因有以下幾點:
1、客戶端禁用了cookie
2、瀏覽器出現問題,暫時無法存取cookie
3、php.ini中的session.use_trans_sid = 0或者編譯時沒有打開--enable-trans-sid選項

為什麼會這樣呢?下面我解釋一下:
Session儲存於服務器端(默認以文件方式存儲session),根據客戶端提供的session id來得到用戶的文件,取得變量的值,session id可以使用客戶端的Cookie或者Http1.1協議的Query_String(就是訪問的URL的「?」後面的部分)來傳送給服務器,然後服務器讀取Session的目錄……。也就是說,session id是取得存儲在服務上的session變量的身份證。當代碼session_start();運行的時候,就在服務器上產生了一個session文件,隨之也產生了與之唯一對應的一個session id,定義session變量以一定形式存儲在剛才產生的session文件中。通過session id,可以取出定義的變量。跨頁後,為了使用session,你必須又執行session_start();將又會產生一個session文件,與之對應產生相應的session id,用這個session id是取不出前面提到的第一個session文件中的變量的,因為這個session id不是打開它的「鑰匙」。如果在session_start();之前加代碼session_id($session id);將不產生新的session文件,直接讀取與這個id對應的session文件。
PHP中的session在默認情況下是使用客戶端的Cookie來保存session id的,所以當客戶端的cookie出現問題的時候就會影響session了。必須注意的是:session不一定必須依賴cookie,這也是session相比cookie的高明之處。當客戶端的Cookie被禁用或出現問題時,PHP會自動把session id附著在URL中,這樣再通過session id就能跨頁使用session變量了。但這種附著也是有一定條件的,即「php.ini中的session.use_trans_sid = 1或者編譯時打開打開了--enable-trans-sid選項」。

明白了以上的道理,現在我們來拋開cookie使用session,主要途徑有三條:

1、設置php.ini中的session.use_trans_sid = 1或者編譯時打開打開了--enable-trans-sid選項,讓PHP自動跨頁傳遞session id。
2、手動通過URL傳值、隱藏表單傳遞session id。
3、用文件、數據庫等形式保存session_id,在跨頁過程中手動調用。

通過例子來說明吧:

s1.php

<?php
session_start();
$_SESSION['var1']="中華人民共和國";
$url="<a href="."\"s2.php\">下一頁</a>";
echo $url;
?>

s2.php

<?php
session_start();
echo "傳遞的session變量var1的值為:".$_SESSION['var1'];
?>

運行以上代碼,在客戶端cookie正常的情況下,應該可以在得到結果「中華人民共和國」。
現在你手動關閉客戶端的cookie,再運行,可能得不到結果了吧。如果得不到結果,再「設置php.ini中的session.use_trans_sid = 1或者編譯時打開打開了--enable-trans-sid選項」,又得到結果「中華人民共和國」

這也就是上面所說的途徑1。

下面再說途徑2:

修改的代碼如下:
s1.php

<?php
session_start();
$_SESSION['var1']="中華人民共和國";
$sn = session_id();
$url="<a href="."\"s2.php?s=".$sn."\">下一頁</a>";
echo $url;
?>

s2.php

<?php
session_id($_GET['s']);
session_start();
echo "傳遞的session變量var1的值為:".$_SESSION['var1'];
?> 

2012年5月31日 星期四

自定義file類型input框樣式的方法





<BODY>
<BR><BR><BR>
<form method="post" action="" enctype="multipart/form-data">
<input type="file" id="pic1" onchange="pic1_name.value=this.value" name="pic1" style="position:absolute;filter:alpha(opacity=0);" size="1" hidefocus>
            <img src="images/iBT_preview.png" alt="" width="90" height="45" border="0" id="BT_preview"  onmousemove="pic1.style.pixelLeft=event.x-60;f.style.pixelTop=this.offsetTop;" onclick="pic1.click()"/>
            </div>
            <div class="txt13px_gray" id="iA-PostNews-PhotoNote1input_">
              <input name="pic1_name" type="text" class="FormInput" id="pic1_name" size="45" />
            </div>
</form>
</BODY>

2012年5月23日 星期三

checkbox唯一選取;checkbox互斥


function toChangeCheckBox(value){
$("input[name='work_area']").each(function(index){
if(index == value){
$(this).removeAttr("checked").attr("checked","checked");
}else{
$(this).removeAttr("checked");
}
});
}



function chooseOne(i){
$('input[name="member_is"]').each(function(index){
if(i == index){
$(this).attr("checked", true);
}else{
$(this).attr("checked", false);
}
});
}

2012年5月22日 星期二

COLSPAN 



<table>
     <tr>
          <td>
          row 1 cell 1
          </td>
          <td>
          row 1 cell 2
          </td>
     </tr>
     <tr>
          <td colspan="2">
          row 2 cell 1
          </td>
     </tr>
</table>

row 1 cell 1.row 1 cell 2
row 2 cell 1



ROWSPAN

<table>
     <tr>
          <td rowspan="2">
          row 1 cell 1
          </td>
          <td>
          row 1 cell 2
          </td>
     </tr>
     <tr>
          <td>
          row 2 cell 2
          </td>
     </tr>
</table>


row 1 cell 1row 1 cell 2
row 2 cell 2