如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2021年9月29日

網頁設計 : 如何設計一個表頭固定但內容可以捲動的表格

作者: Fred F.M. Wang (FW知識瑣記) 日期: 2021-9-29

網頁中如何設計一個表頭固定但內容可以捲動的表格


       要讓表格表頭固定,內容可以捲動,首先,table header(thead)與table body(tbody)必須各

自設定顯示方式為block(CSS設定 display: block;),但是,table header(thead)與table body

(tbody)各自設定為block時,表頭與內容的欄位寬度就無法對齊。因此,必須透過Javascript設定table header欄寬與table body的欄寬一致


==================================================

<style>

thead.fixedHeader {    display: block;    }

thead.fixedHeader tr th { padding: 4px 0px!important;    }

tbody.scrollContent {  

    display: block;    

    overflow: auto;    

}

</style>



<table id="itemtable">

    <thead id="itemheader" class="fixedHeader">

       <tr>

    ..

    </tr>

    </thead>


   <tbody id="itemcontent" class="scrollContent">

       <tr>

    ..

    </tr>

   </tbody>


=============================================

 <script type="text/javascript">

$( document ).ready(function () {

   // 設定捲動區域,區域底部不要超過視窗底部

    var content_y = get_offset_y("itemcontent"); // 取得table body畫面左上角的座標y位置

    var content_height = window.screen.height - content_y - 200;   // 設定table body的高     

    document.getElementById("itemcontent").style.height= content_height + "px"; 

   

  // 設定table header欄寬與table body的欄寬一致 by Fred

  var theader = document.getElementById("itemheader");

  var tbody = document.getElementById("itemcontent");

  row0 = theader.rows[0];  // table header row

  row1 = tbody.rows[0];     // table body 1st row   


  // 逐一設定table header每一欄欄寬等於table body每一欄的實際顯示寬度

  for (var j = 0; j < row1.cells.length; j++) {

      row0.cells[j].style.width = (row1.cells[j].offsetWidth - 1) + "px";  // offsetWidth:實際顯示

寬度,注意要減一,否則無法對齊

  }


/* 取得一個HTML元素在畫面中的位置(左上角的座標y位置) */

function get_offset_y(id) {

    var e = document.getElementById(id);

    var offset = {x:0,y:0};

    while (e)

    {

       offset.x += e.offsetLeft;

       offset.y += e.offsetTop;

       e = e.offsetParent;

    }


    if (document.documentElement && (document.documentElement.scrollTop 

|| document.documentElement.scrollLeft))    {

       offset.x -= document.documentElement.scrollLeft;

       offset.y -= document.documentElement.scrollTop;

    

  } else if (document.body && (document.body.scrollTop || document.body.scrollLeft))   {

       offset.x -= document.body.scrollLeft;

       offset.y -= document.body.scrollTop;

  

  } else if (window.pageXOffset || window.pageYOffset)   {

       offset.x -= window.pageXOffset;

       offset.y -= window.pageYOffset;

    }


    // alert(offset.x + '\n' + offset.y);    

    return offset.y

}

</script>

註: 取得一個HTML元素在畫面中的位置參考來源https://stackoverflow.com/questions/211703/is-it-possible-to-get-the-position-of-div-within-the-browser-viewport-not-withi

2021年9月18日

志工往事

作者: Fred F.M. Wang (FW知識瑣記) 撰寫日期:2020-12-19

今天看一本書"台灣心臟外科第一人 洪啟仁醫師的生命故事",回憶起大約30年前在簡稱"兒心"的心臟病兒童基金會當志工的往事。
 
民國78年偶然的機會經過台北市青島西路兒心與兒癌(兒童癌症基金會)門口,突發當志工的想法,於是就進入兒心擔任志工,幫忙一些資訊系統的開發與維護等事務。 
 
當志工期間知道有各種兒童常見的心臟病,一般的如心臟瓣膜缺損,心室中隔缺損等,嚴重的如法洛氏四合症(合併四種異常),大動脈轉位(也就是出生時大動脈與肺動脈接心臟的位置相反了),甚至有俗稱"青蛙心"的單心室(出生時只有一個心室)患者。嚴重的通常都是先天性心臟病,病童外觀很明顯的是皮膚,嘴唇發黑發紫。
 
印象最深刻的是一個媽媽抱著一個很小的嬰兒到兒心辦公室來申請手術補助,因為心臟病的關係,小嬰兒甚至沒有力氣吸奶,媽媽只能一湯匙一湯匙地餵。
 
這段時間從許許多多的捐款,知道社會各個角落有許多善心人,默默行善,支持著兒心,支持著這些病童與他的家人。
 
除此之外,還有如書中洪啟仁醫師(創台灣首例法洛氏四合症手術成功)一樣致力於鑽研心臟手術的心臟外科醫師,讓這些孩童有康復的希望。
 
順便幫兒心宣傳一下
兒心官網 : http://www.ccft.org.tw
劃撥帳號:0100299 - 4 戶名:中華民國心臟病兒童基金會

 

 

2021年9月5日

阿甘正傳的啟示

作者: Fred F.M. Wang (FW知識瑣記) 日期:2021-9-5

 經過二十多年再看一遍電影"阿甘正傳",與年輕時有不同的感受。下面是自己三點感想 :

一 台詞 "Life was like a box of chocolates. You never know what you're gonna get 人生就像一盒巧克力,你永遠都不知道你下一塊吃到的是什麼口味。"

  感想 : 雖然人生的方向選擇是我們自己,但是,我們永遠不知道命運會帶我們去哪裡。不要怪罪命運,也不要花太多時間後悔,選擇我們所愛的,並愛我們所選擇的。

二 台詞 "There's only so much fortune a man really needs, and the rest is just for showing off. 人真正需要的財富只有那麼一些,剩下的只不過是用來炫燿罷了。"
  感想 : 財富在人生過程中的必要的,但是,生活必要之外的財富對我們並沒有多大的意義。需要之外的財富,我們可以選擇拿來做更有意義的事,例如幫助連生存所需的財富都沒有的人。

感想: 拋開人生不切實際的幻想,專注當下,盡力做好每件事情,就會有想不到的成就。

2021年9月2日

如何解決PHP日期2038年的限制?

作者: Fred F.M. Wang (FW知識瑣記) 日期:2021-9-2

以往以PHP寫日期相關程式,習慣用strtotime函式將字串轉換為時間,並用date函式以特定的日期

格式顯示出來。但是最近遇到了2038年後的日期顯示出問題了。如何解決呢? 


舊寫法 :


$date = date("Ymd",strtotime("2038-1-19"));

echo "2038-1-19 :" . $date . "<br />";     

使用日期(date)函式,結果顯示 2038-1-19 :20380119        


$date = date("Ymd",strtotime("2038-1-20"));

echo "2038-1-20 :" . $date . "<br />";   

使用日期(date)函式, 結果顯示 2038-1-20 :19700101            

由此看到日期(date)函式2038年1月20日之後的日期都無法正確顯示了


同樣要顯示日期增減也是會發生同樣的問題,當日期增加超過2038-1-20日,就無法顯示出來。

$this_date = Date("Ymd");

echo "today:" . $this_date . "<br />"; // 顯示 today:20210831


$date = date("Ymd",strtotime("+5985 days", strtotime($this_date)));

echo "add 5985 days:" . $date . "<br />"; // 顯示 add 5985 days:20380119


$date = date("Ymd",strtotime("+5986 days", strtotime($this_date)));

echo "add 5986 days:" . $date . "<br />";  // 顯示 add 5986 days:19700101        

    

怎麼解決2038年的限制呢?


您必須改用DateTime函式來取得日期(將日期字串轉成日期),並用format函式以特定的日期格式

顯示出來

$date =  new DateTime($this_date);


日期的增加則使用add函式

$date->add(new DateInterval("P6000D"));  // P開頭代表日期,6000D 代表 6000 天

echo "add 6000 days:" . $date->format("Ymd"); // add 6000 days:20380203

 

2021年8月24日

本部落格觀看人次終於破60萬人次大關

作者: Fred F.M. Wang (FW知識瑣記) 日期: 20210824

 本部落格觀看人次終於破60萬人次大關。 


從2004年建立本部落格以來已經17年了,寫寫停停,內容都是自己一些學習心得,感想與筆記,作為自己的備忘,也提供有緣人參考。

回顧自己資訊技術學習歷程,從大學一年級時期首次程式設計至今已經36年了,秉持對程式語言的興趣,多年來廣泛地學習不同的程式語言,從計概的Basic, Fortran,資料結構的PASCAL,資料處理課的COBOL,人工智慧語言課的LISP與自學的PROLOG,到工讀時的dBASEIII, Clipper。研究所類神經網路使用的C語言,資訊安全課的Assembly,服役擔任資訊官時期學到RPGII,進入社會工作增加C++,Java,VB,Python,AutoIT,網頁程式設計的JSP,PHP,Javascript 與特有環境的程式語言如SAP ABAP/4,Lotus Notes的Notes script。當然也接觸了不少平台系統與資料庫系統。體會到因應不同的需求只有最合適的程式語言,沒有任何一種程式語言是最好的,面對廣大與持續演進的技術,只有謙虛與持續的學習,才能讓自己不斷地進步

回顧職場30多年,在待人處事上,秉持能夠共事就是緣分,多體諒不同角色各有自己的困難,多結善緣,結交善友,對自己職業生涯絕對有好處。