亚洲一区二区三区中文字幕在线观看,精精国产xxxx视频在线中文版,日韩精品一区二区三区四区五区 http://www.aygfsteel.com/table/category/35161.htmlzh-cnSat, 23 Jan 2010 13:11:16 GMTSat, 23 Jan 2010 13:11:16 GMT60對比 javascript url編碼 escape(), encodeURL(), encodeURIComponent() 區別http://www.aygfsteel.com/table/articles/308921.html小卓小卓Sun, 10 Jan 2010 08:07:00 GMThttp://www.aygfsteel.com/table/articles/308921.htmlhttp://www.aygfsteel.com/table/comments/308921.htmlhttp://www.aygfsteel.com/table/articles/308921.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/308921.htmlhttp://www.aygfsteel.com/table/services/trackbacks/308921.htmljavascript 常用的編碼格式有:escape(), encodeURL(), encodeURIComponent() 區別如下:

escape() 方法:

采用ISO Latin字符集對指定的字符串進行編碼。所有的空格符、標點符號、特殊字符以及其他非ASCII字符都將被轉化成%xx格式的字符編碼(xx等于該字符在字符集表里面的編碼的16進制數字)。比如,空格符對應的編碼是%20。
不會被此方法編碼的字符: @ * / +


encodeURI() 方法:

把URI字符串采用UTF-8編碼格式轉化成escape格式的字符串。
不會被此方法編碼的字符:! @ # $& * ( ) = : / ; ? + '

encodeURIComponent() 方法:

把URI字符串采用UTF-8編碼格式轉化成escape格式的字符串。與encodeURI()相比,這個方法將對更多的字符進行編碼,比如 / 等字符。所以如果字符串里面包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字符被編碼之后URL將顯示錯誤。
不會被此方法編碼的字符:! * ( ) '
因此,對于中文字符串來說,如果不希望把字符串編碼格式轉化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用escape。如果你的頁面是GB2312或者其他的編碼,而接受參數的頁面是UTF-8編碼的,就要采用encodeURI或者encodeURIComponent。
另外,encodeURI/encodeURIComponent是在javascript1.5之后引進的,escape則在javascript1.0版本就有。


小卓 2010-01-10 16:07 發表評論
]]>
javascript關閉窗口(兼容firefox,IE)http://www.aygfsteel.com/table/articles/267344.html小卓小卓Fri, 24 Apr 2009 05:35:00 GMThttp://www.aygfsteel.com/table/articles/267344.htmlhttp://www.aygfsteel.com/table/comments/267344.htmlhttp://www.aygfsteel.com/table/articles/267344.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/267344.htmlhttp://www.aygfsteel.com/table/services/trackbacks/267344.html方法一:

js 代碼
  1. function CloseWin() //這個不會提示是否關閉瀏覽器   
  2. {   
  3. window.opener=null;   
  4. //window.opener=top;   
  5. window.open("","_self");   
  6. window.close();   
  7. }   
方法二:
open.html
js 代碼
  1. function open_complex_self() {   
  2.   var obj_window = window.open('close.html', '_self');   
  3.   obj_window.opener = window;   
  4.   obj_window.focus();   
  5.  }   
close.html
js 代碼
  1. window.close();  
另附:
//普通帶提示關閉
function closeie(){ window.close(); }
//關閉IE6不提示 function closeie6(){ window.opener=null; window.close(); }
//關閉IE7不提示 function closeie7(){ window.open('','_top'); window.top.close(); }


javascript關閉窗口,可以用下面簡單的代碼:

<a href="javascript:self.close()">關閉窗口</a>

我在IE7下測試通過,但是firefox3.0卻不行。
難道firefox不支持在href中直接寫JavaScript?于是改成下面的樣子:

<a href="javascript:alert('Hello World')">彈出窗口</a>

這次IE7和firefox下測試都通過。那就不是href中直接寫JavaScript的原因了。
繼續測試firefox怎么關閉自身窗口

改成了如下代碼

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
<!--
    function windowClose(){
        //self.close();
        window.close();
    }
//-->
</script>
<title>js測試</title>
</head>
<a href="javascript:self.close()">關閉窗口</a><br />
<a href="javascript:alert('Hello World')">彈出窗口</a><br />
<a href="#" onclick="windowClose()">js函數關閉窗口</a>
<body>
</body>
</html>


還是不能關閉窗口。難道firefox不支持window的close屬性?
那window對象的close方法能不能關閉open方法打開的窗口呢?

寫下面兩個html文件放在同一個文件夾下

1.open.html

<script type="text/javascript">
<!--
    function openWindow(){
        window.open("new.html","newWindow","width=200,height=100,toolbar=no");
    }
//-->
</script>
<a href="#" onclick="openWindow()">open函數打開新窗口</a><br />
<a href="new.html" target="_blank">超級鏈接在新窗口中打開新頁面</a><br />
<a href="new.html" target="_parent">超級鏈接在父窗口中打開新頁面</a>

2.new.html

<a href="javascript:window.close()">關閉窗口</a>
<a href="javascript:self.close()">關閉窗口</a>

用open方法和在"_blank"打開的可以在新窗口中關閉,而在"_parent"中打開的在firefox中還是關閉不

因此在firefox里用window的close方法時要注意他和IE不同的地方:在父窗口打開的頁面是不能用close

方法關閉的。

然后去google搜了一下:之所以window.close在firefox不能使用,是因為firefox默認不能關閉用戶打

開的網頁,我們可以這樣設置firefox:

打開firefox,在地址欄輸入about:config

找到dom.allow_scripts_to_close_windows這項并改為true。

現在知道為什么了吧。那篇文章還有一段不錯的內容,摘錄如下:

眾所周知,在javascript中window.close()是用來關閉窗口的,而且ie和firefox都是支持的。為了實現

用戶對瀏覽器的絕對控制,ie中用close關閉非open打開的窗口時會彈出一個對話框詢問用戶。有時候我

們不希望再這樣哆嗦,但是怎么去掉這個框呢,用下面的代碼就可以了

<script   language="javascript"   type="text/javascript"> 
  
  function   closeWindow()   { 
  
  window.open('','_parent',''); 
  
  window.close(); 
  
  } 
  
  </script>   
  <a   href="javascript:closeWindow();">Close   Window</a>


參考文章:1.http://hi.baidu.com/suen_%CB%EF/blog/item/bedca57f8932480d28388a49.html
               2.http://blog.csdn.net/a9529lty/archive/2008/11/22/3351539.aspx


文章出處:DIY部落(http://www.diybl.com/course/1_web/javascript/jsjs/20090318/162531.html)



小卓 2009-04-24 13:35 發表評論
]]>
http協議狀態碼的含義及解決方法http://www.aygfsteel.com/table/articles/256303.html小卓小卓Mon, 23 Feb 2009 09:43:00 GMThttp://www.aygfsteel.com/table/articles/256303.htmlhttp://www.aygfsteel.com/table/comments/256303.htmlhttp://www.aygfsteel.com/table/articles/256303.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/256303.htmlhttp://www.aygfsteel.com/table/services/trackbacks/256303.html當用戶在防問Internet信息服務(IIS)的服務器上的內容時時,IIS服務器響應請求,會自動返回一個表示該請求的狀態的數字代碼,提供關于相關請求的狀態信息。同樣當搜索引擎蜘蛛在抓取的過程中,服務器也會相關的http狀態碼,通過了解http狀態代碼, 可以更詳細的分析日志中的訪問情況。

100 - 表示已收到請求的一部分,正在繼續發送余下部分。

101 - 切換協議。

2xx - 成功 服務器成功地接受了客戶端請求。

200 - 確定??蛻舳苏埱笠殉晒?。

201 - 已創建。

202 - 已接受。

203 - 非權威性信息。

204 - 無內容。

205 - 重置內容。

206 - 部分內容。

300 - 針對收到請求,服務器可執行多種操作。

301 - 永久移動轉移,請求的內容已永久移動其他新位置。

302 - 臨時移動轉移,請求的內容已臨時移動新的位置

304 - 未修改。自從上次請求后,請求的內容未修改過。

307 - 臨時重定向。服務器目前從不同位置響應請求,但請求者應繼續使用原有位置來進行以后的請求。

400 - 錯誤的請求。

401 - 訪問被拒絕。IIS 定義了許多不同的 401 錯誤,它們指明更為具體的錯誤原因。這些具體的錯誤代碼在瀏覽器中顯示,但不在 IIS 日志中顯示:

401.1 - 登錄失敗。

401.2 - 服務器配置導致登錄失敗。

401.3 - 由于 ACL 對資源的限制而未獲得授權。

401.4 - 篩選器授權失敗。

401.5 - ISAPI/CGI 應用程序授權失敗。

401.7 - 訪問被 Web 服務器上的 URL 授權策略拒絕。這個錯誤代碼為 IIS 6.0 所專用。

403 - 禁止訪問:IIS 定義了許多不同的 403 錯誤,它們指明更為具體的錯誤原因:

403.1 - 執行訪問被禁止。

403.2 - 讀訪問被禁止。

403.3 - 寫訪問被禁止。

403.4 - 要求 SSL.

403.5 - 要求 SSL 128.

403.6 - IP 地址被拒絕。

403.7 - 要求客戶端證書。

403.8 - 站點訪問被拒絕。

403.9 - 用戶數過多。

403.10 - 配置無效。

403.11 - 密碼更改。

403.12 - 拒絕訪問映射表。

403.13 - 客戶端證書被吊銷。

403.14 - 拒絕目錄列表。

403.15 - 超出客戶端訪問許可。

403.16 - 客戶端證書不受信任或無效。

403.17 - 客戶端證書已過期或尚未生效。

403.18 - 在當前的應用程序池中不能執行所請求的 URL.這個錯誤代碼為 IIS 6.0 所專用。

403.19 - 不能為這個應用程序池中的客戶端執行 CGI.這個錯誤代碼為 IIS 6.0 所專用。

403.20 - Passport 登錄失敗。這個錯誤代碼為 IIS 6.0 所專用。

404 - 未找到請求的內容。

404.0 - 未找到文件或目錄。

404.1 - 無法在所請求的端口上訪問 Web站點。

404.2 - Web 服務擴展鎖定策略阻止本請求。

404.3 - MIME 映射策略阻止本請求。

405 - 用來訪問本頁面的 HTTP 謂詞不被允許(方法不被允許)

406 - 客戶端瀏覽器不接受所請求頁面的 MIME 類型。

407 - 要求進行代理身份驗證。

412 - 前提條件失敗。

413 - 請求實體太大。

414 - 請求 URI 太長。

415 - 不支持的媒體類型。

416 - 所請求的范圍無法滿足。

417 - 執行失敗。

423 - 鎖定的錯誤。

500 - 服務器內部錯誤。

500.12 - 應用程序正忙于在 Web 服務器上重新啟動。

500.13 - Web 服務器太忙。

500.15 - 不允許直接請求 Global.asa.

500.16 - UNC 授權憑據不正確。這個錯誤代碼為 IIS 6.0 所專用。

500.18 - URL 授權存儲不能打開。這個錯誤代碼為 IIS 6.0 所專用。

500.100 - 內部 ASP 錯誤。

501 - 服務器無法完成請求的功能。

502 - 服務器用作網關或代理服務器時收到了無效響應。

502.1 - CGI 應用程序超時。

502.2 - CGI 應用程序出錯。

503 - 服務不可用。這個錯誤代碼為 IIS 6.0 所專用。

504 - 網關超時。

505 - HTTP 版本不受支持。

英文版:
100:Continue
101:Switching Protocols
102:Processing
200:OK
201:Created
202:Accepted
203:Non-Authoriative Information
204:No Content
205:Reset Content
206:Partial Content
207:Multi-Status
300:Multiple Choices
301:Moved Permanently
302:Found
303:See Other
304:Not Modified
305:Use Proxy
306:(Unused)
307:Temporary Redirect
400:Bad Request
401:Unauthorized
402:Payment Granted
403:Forbidden
404:File Not Found
405:Method Not Allowed
406:Not Acceptable
407:Proxy Authentication Required
408:Request Time-out
409:Conflict
410:Gone
411:Length Required
412:Precondition Failed
413:Request Entity Too Large
414:Request-URI Too Large
415:Unsupported Media Type
416:Requested range not satisfiable
417:Expectation Failed
422:Unprocessable Entity
423:Locked
424:Failed Dependency
500:Internal Server Error
501:Not Implemented
502:Bad Gateway
503:Service Unavailable
504:Gateway Timeout
505:HTTP Version Not Supported
507:Insufficient Storage

常見的 HTTP 狀態代碼及其原因

200 - 成功。  IIS 已成功處理發送的請求。

304 - 未修改。 客戶端請求的內容已在其緩存中,內容自緩存以來尚未被修改過。客戶端使用內容的緩存副本,而不從服務器下載內容。

401.1 - 登錄失敗。 登錄不成功,可能因為用戶名或密碼訪問無效。

401.3 - 服務列表對資源的限制而未獲得授權。 表示存在NTFS權限問題?;蛘邔υ噲D訪問的文件具備相應的權限,也可能發生此錯誤。

403.1 - 執行訪問被禁止。

下面是導致此錯誤信息的兩個常見原因:

您沒有足夠的執行許可。例如,如果試圖訪問的 ASP 頁所在的目錄權限設為“無”,或者,試圖執行的 CGI 腳本所在的目錄權限為“只允許腳本”,將出現此錯誤信息。若要修改執行權限,請在 Microsoft 管理控制臺 (MMC)中右擊目錄,然后依次單擊屬性和目錄選項卡,確保為試圖訪問的內容設置適當的執行權限。

您沒有將試圖執行的文件類型的腳本映射設置為識別所使用的謂詞(例如,GET 或 POST)。若要驗證這一點,請在 MMC 中右擊目錄,依次單擊屬性、目錄選項卡和配置,然后驗證相應文件類型的腳本映射是否設置為允許所使用的謂詞。

403.2 - 讀訪問被禁止。驗證是否已將IIS設置為允許對目錄進行讀訪問。另外,如果您正在使用默認文件,請驗證該文件是否存在。

403.3 - 寫訪問被禁止。 驗證IIS權限和NTFS限是否已設置以便向該目錄授予寫訪問權。

403.4 - 要求 SSL.禁用要求安全通道選項,或使用 HTTPS 代替 HTTP 來訪問該頁面。

403.5 - 要求 SSL 128.禁用要求 128 位加密選項,或使用支持 128 位加密的瀏覽器以查看該頁面。

403.6 - IP地址被拒絕。服務器配置拒絕訪問您目前的IP地址。

403.7 - 要求客戶端證書。您已把您的服務器配置為要求客戶端身份驗證證書,但您未安裝有效的客戶端證書。

403.8 - 站點訪問被拒絕。您已為您用來訪問服務器的域設置了域名限制。

403.9 - 用戶數過多。與該服務器連接的用戶數量超過了IIS設置的連接數。

403.12 - 拒絕訪問映射表。 您要訪問的頁面要求提供客戶端證書,但映射到您的客戶端證書的用戶 ID 已被拒絕訪問該文件。

404 - 未找到。 發生此錯誤的原因是您試圖訪問的文件已被移走或刪除。

500 - 內部服務器錯誤。 造成500錯誤常見原因有:ASP語法出錯、ACCESS數據庫連接語句出錯、文件引用與包含路徑出錯、使用了服務器不支持的組件如FSO等

500.12 - 服務器錯誤:Web 服務器上的應用程序正在重新啟動。 這表示您在 IIS 重新啟動應用程序的過程中試圖加載 ASP 頁。刷新頁面后,此信息即會消失。如果刷新頁面后,此信息再次出現,可能是防病毒軟件正在掃描 Global.asa 文件。

500-100.ASP - ASP 錯誤。 如果試圖加載的 ASP 頁中含有錯誤代碼,將出現此錯誤信息。若要獲得更確切的錯誤信息,請禁用友好 HTTP 錯誤信息。默認情況下,只會在默認 Web 站點上啟用此錯誤信息。

502 - 網關錯誤。 如果試圖運行的 CGI 腳本不返回有效的 HTTP 標頭集,將出現此錯誤信息。

1、錯誤號401.1 - 未經授權:訪問由于憑據無效被拒絕。由于用戶匿名訪問使用的賬號(默認是IUSR_機器名)被禁用,或者沒有權限訪問計算機,將造成用戶無法訪問。

解決方案:

(1)查看IIS管理器中站點安全設置的匿名帳戶是否被禁用,如果是,請嘗試用以下辦法啟用:

控制面板->管理工具->計算機管理->本地用戶和組,將IUSR_機器名賬號啟用。如果還沒有解決,請繼續下一步。

(2)查看本地安全策略中,IIS管理器中站點的默認匿名訪問帳號或者其所屬的組是否有通過網絡訪問服務器的權限,如果沒有嘗試用以下步驟賦予權限:

開始->程序->管理工具->本地安全策略->安全策略->本地策略->用戶權限分配,雙擊“從網絡訪問此計算機”,添加IIS默認用戶或者其所屬的組。

注意:一般自定義 IIS默認匿名訪問帳號都屬于組,為了安全,沒有特殊需要,請遵循此規則。

2、錯誤號401.2 HTTP 錯誤 401.2 - 未經授權:訪問由于服務器配置被拒絕。原因:關閉了匿名身份驗證

解決方案:

運行inetmgr,打開站點屬性->目錄安全性->身份驗證和訪問控制->選中“啟用匿名訪問”,輸入用戶名,或者點擊“瀏覽”選擇合法的用戶,并兩次輸入密碼后確定。

3、錯誤號:401.3 HTTP 錯誤 401.3 - 未經授權:訪問由于 ACL 對所請求資源的設置被拒絕。

原因:IIS匿名用戶一般屬于Guests組,而我們一般把存放網站的硬盤的權限只分配給administrators組,這時候按照繼承原則,網站文件夾也只有administrators組的成員才能訪問,導致IIS匿名用戶訪問該文件的NTFS權限不足,從而導致頁面無法訪問。

解決方案:給IIS匿名用戶訪問網站文件夾的權限,方法:進入該文件夾的安全選項,添加IIS匿名用戶,并賦予相應權限,一般是讀、寫。



小卓 2009-02-23 17:43 發表評論
]]>
Javascript實現評估用戶輸入密碼的強度http://www.aygfsteel.com/table/articles/255302.html小卓小卓Wed, 18 Feb 2009 08:31:00 GMThttp://www.aygfsteel.com/table/articles/255302.htmlhttp://www.aygfsteel.com/table/comments/255302.htmlhttp://www.aygfsteel.com/table/articles/255302.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/255302.htmlhttp://www.aygfsteel.com/table/services/trackbacks/255302.html

什么是一個安全的密碼呢?本程序按以下的方式進行評估.

1.如果密碼少于5位,那么就認為這是一個弱密碼.

2.如果密碼只由數字、小寫字母、大寫字母或其它特殊符號當中的一種組成,則認為這是一個弱密碼.

3.如果密碼由數字、小寫字母、大寫字母或其它特殊符號當中的兩種組成,則認為這是一個中度安全的密碼.

4.如果密碼由數字、小寫字母、大寫字母或其它特殊符號當中的三種以上組成,則認為這是一個比較安全的密碼.

具體程序如下(演示地址:www.netInter.cn/reg):



小卓 2009-02-18 16:31 發表評論
]]>
常備JS操作http://www.aygfsteel.com/table/articles/255301.html小卓小卓Wed, 18 Feb 2009 08:27:00 GMThttp://www.aygfsteel.com/table/articles/255301.htmlhttp://www.aygfsteel.com/table/comments/255301.htmlhttp://www.aygfsteel.com/table/articles/255301.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/255301.htmlhttp://www.aygfsteel.com/table/services/trackbacks/255301.html閱讀全文

小卓 2009-02-18 16:27 發表評論
]]>
神奇的代碼http://www.aygfsteel.com/table/articles/255299.html小卓小卓Wed, 18 Feb 2009 08:18:00 GMThttp://www.aygfsteel.com/table/articles/255299.htmlhttp://www.aygfsteel.com/table/comments/255299.htmlhttp://www.aygfsteel.com/table/articles/255299.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/255299.htmlhttp://www.aygfsteel.com/table/services/trackbacks/255299.html 只要你在IE瀏覽器任意打開一個網站,然后在瀏覽器上輸入如下代碼

代碼如下
javascript:document.body.contentEditable='true'; document.designMode='on'; void 0
然后回車,你就可以隨心所欲的修改這個網站啦!
想想google的頁面被自己改得面目全非,是不是過足了黑客癮??!

輸入如下代碼,將退出編輯狀態!
javascript:document.body.contentEditable='false'; void 0

注:以上代碼純屬娛樂


小卓 2009-02-18 16:18 發表評論
]]>
frameset使用技巧http://www.aygfsteel.com/table/articles/246383.html小卓小卓Mon, 15 Dec 2008 03:56:00 GMThttp://www.aygfsteel.com/table/articles/246383.htmlhttp://www.aygfsteel.com/table/comments/246383.htmlhttp://www.aygfsteel.com/table/articles/246383.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/246383.htmlhttp://www.aygfsteel.com/table/services/trackbacks/246383.html

框架標記:
         <FRAMESET>
         <FRAME>
  <NOFRAMES>
  <IFRAME>

框架概念 :
  謂框架便是網頁畫面分成幾個框窗,同時取得多個 URL。只需要 <FRAMESET> <FRAME> 即可,面所有框架標記需要放在一個總起的 html 檔,這個檔案只記錄了該框架如何分割 ,不會顯示任何資料,所以不必放入 <BODY> 標記,瀏覽這框架必須讀取這檔案 面不是其他框窗的檔案。<FRAMESET> 是用來劃分框窗,每一窗框由一個 <FRAME> 標 記所標示,<FRAME>必須在 <FRAMESET> 范圍中使用。如下例:

  <frameset cols="50%,*">
               <frame name="hello" src="up2u.html">
               <frame name="hi" src="me2.html">
  </frameset>

  此例中 <FRAMESET> 把畫面分成左右兩相等部分,左便是顯示 up2u.html,右邊則會顯示 me2.html 這檔案,<FRAME> 標記所標示的框窗永遠是按由上而下、由左至右的次序。

<frame>屬性:
         name="..."定義幀的名字
  scr="..."定義在幀中顯示的內容的來源
  frameborder="..."定義幀之間的邊界(0或1)
  margwidth="..."設置幀的邊界和其中內容之間的間距
  margheight="..."設置幀的邊界和其中內容之間的間距化
  noresize="..."使幀的尺寸不能變
  scrolling="..."設置滾動條的表示方式(auto, yes, no)

<frameset>屬性:
         rows="..."設定行的數目
  cols="..."設定列的數目
  onload="..."當載入文檔時的內部事件觸發器
  onunload="..."當卸載文檔時的內部事件觸發器

frameset大致還有如下效果參數

COLS="90,*"
垂直切割畫面(如分左右兩個畫面),接受整數值、百分數, * 則代表占用剩余的空間。數值的個數代表分成的視窗數目且以逗號分隔。例如 COLS="30,*,50%" 可以切成三個視窗,第一個視窗是 30 pixels 的寬度,為一絕對分割,第二個視窗是當分配完第一及第三個視窗后剩下的空間,第三個視窗則占整個視窗畫面的 50% 寬度為一相對分割。你可自己調整數字。  

ROWS="120,*"
這是橫向切割,將畫面上下分開,數值設定同上。 COLS 與 ROWS 兩參數盡量不要放在同一個 <FRAMESET> 標記中,因 Netacape 偶然不能顯示這類型的框架,盡量采用多重分割,如以上各例。

frameborder="0"
設定框架的邊框,其值只有 0 和 1 , 0 表示不要邊框, 1 表示要顯示邊框。  

border="0"
設定框架的邊框厚度,以 pixels 為單位。  

bordercolor="#008000"
設定框架的邊框顏色。顏色值請參考【調色原理】。  

framespacing="5"
表示框架與框架間保留的空白的距離。

frame大致還有如下效果參數:

SRC="a.html"
設定此框窗中要顯示的網頁檔案名稱,每個框窗一定要對應一個網頁檔案。

NAME="top"
設定這個框窗的名稱,這樣才能指定框架來作鏈接,必須但任意命名。  

frameborder=0
設定框架的邊框,其值只有 0 和 1 , 0 表示不要邊框, 1 表示要邊框。  

framespacing="6"
表示框架與框架間的保留的空白的距離。  

bordercolor="#008000"
設定框架的邊框顏色。  

scrolling="Auto"
設定是否要顯示卷軸,YES 表示要顯示卷軸,NO 表示無論如何都不要顯示卷軸,AUTO 視情況而定。

noresize
設定不讓使用者可以改變這個框框的大小,如沒有設定此參數,使用者可隨意地拉動框架改變其大小。  

marginhight=5
表示框架高度部分邊緣所保留的空間。  

marginwidth=5
表示框架寬度部分邊緣所保留的空間。




小卓 2008-12-15 11:56 發表評論
]]>
正則表達式過濾HTML危險腳本http://www.aygfsteel.com/table/articles/246379.html小卓小卓Mon, 15 Dec 2008 03:50:00 GMThttp://www.aygfsteel.com/table/articles/246379.htmlhttp://www.aygfsteel.com/table/comments/246379.htmlhttp://www.aygfsteel.com/table/articles/246379.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/246379.htmlhttp://www.aygfsteel.com/table/services/trackbacks/246379.html在做一些網站(特別是bbs之類)時,經常會有充許用戶輸入html樣式代碼,卻禁止腳本的運行的需求, 以達到豐富網頁樣式,禁止惡意代碼的運行。
當然不能用 htmlencode 和 htmldecode 方法,因為這樣連基本的html代碼會被禁止掉。
我在網上搜索,也沒有找到好的解決辦法,倒是收集了一些腳本攻擊的實例:
1. <script>標記中包含的代碼
2. <a href=
javascript:...中的代碼
3. 其它基本控件的 on...事件中的代碼
4. iframe 和 frameset 中載入其它頁面造成的攻擊
有了這些資料后,事情就簡單多了,寫一個簡單的方法,用正則表達式把以上符合幾點的代碼替換掉:
public string wipescript(string html)
{
system.text.regularexpressions.regex regex1 = new system.text.regularexpressions.regex(@"<script[\s\s]+</script *>",system.text.regularexpressions.regexoptions.ignorecase);
system.text.regularexpressions.regex regex2 = new system.text.regularexpressions.regex(@" href *= *[\s\s]*script *:",system.text.regularexpressions.regexoptions.ignorecase);
system.text.regularexpressions.regex regex3 = new system.text.regularexpressions.regex(@" on[\s\s]*=",system.text.regularexpressions.regexoptions.ignorecase);
system.text.regularexpressions.regex regex4 = new system.text.regularexpressions.regex(@"<iframe[\s\s]+</iframe *>",system.text.regularexpressions.regexoptions.ignorecase);
system.text.regularexpressions.regex regex5 = new system.text.regularexpressions.regex(@"<frameset[\s\s]+</frameset *>",system.text.regularexpressions.regexoptions.ignorecase);
html = regex1.replace(html, ""); //過濾<script></script>標記
html = regex2.replace(html, ""); //過濾href=javascript: (<a>) 屬性
html = regex3.replace(html, " _disibledevent="); //過濾其它控件的on...事件
html = regex4.replace(html, ""); //過濾iframe
html = regex5.replace(html, ""); //過濾frameset
return html;
}
此方法輸入可能包含腳本的html代碼,返回則就是干凈的代碼了。


小卓 2008-12-15 11:50 發表評論
]]>
CSS濾鏡簡要http://www.aygfsteel.com/table/articles/246378.html小卓小卓Mon, 15 Dec 2008 03:48:00 GMThttp://www.aygfsteel.com/table/articles/246378.htmlhttp://www.aygfsteel.com/table/comments/246378.htmlhttp://www.aygfsteel.com/table/articles/246378.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/246378.htmlhttp://www.aygfsteel.com/table/services/trackbacks/246378.htmlCSS濾鏡屬性表:

濾鏡效果 描述
Alpha 設置透明度
Blru 建立模糊效果
Chroma 把指定的顏色設置為透明
DropShadow 建立一種偏移的影象輪廓,即投射陰影
FlipH 水平反轉
FlipV 垂直反轉
Glow 為對象的外邊界增加光效
Grayscale 降低圖片的彩色度
Invert 將色彩、飽和度以及亮度值完全反轉建立底片效果
Light 在一個對象上進行燈光投影
Mask 為一個對象建立透明膜
Shadow 建立一個對象的固體輪廓,即陰影效果
Wave 在X軸和Y軸方向利用正弦波紋打亂圖片
Xray 只顯示對象的輪廓

1、Alpha 濾鏡   

   語法:{FILTER:ALPHA(opacity=opacity,finishopacity=finishopacity,style=style,startx=startx,
starty=starty,finishx=finishx,finishy=finishy)}

2、Blur 濾鏡

語法:對于HTML:{filter:blur(add=add,direction=direction,strength=strength)}
            對于Script語言: [oblurfilter=] object.filters.blur
           模糊效果

3、FlipH, FlipV 濾鏡

語法:{filter:filph} ,{filter:filpv} 分別是水平反轉和垂直反轉

4、Chroma 濾鏡

語法:{filter:chroma(color=color)}
         使用”Chroma"屬性可以設置一個對象中指定的顏色為透明色,參數COLOR即要透明的顏色。下面是蘭色文字,然后用Chroma 濾鏡過濾掉蘭色,就成了下面的樣子。

5、DropShadow 濾鏡

語法:{filter:dropshadow(color=color,offx=ofx,offy=offy,positive=positive)}
        
“DropShaow"顧名思義就是添加對象的陰影效果。

6、Glow 濾鏡

語法:{filter:glow(color=color,strength)}
當對一個對象使用"glow"屬性后,這個對象的邊緣就會產生類似發光的效果。“COLOR”是指定發光的顏色,“STRENGTH”則是強度的表現,可以從1到255之間的任何整數來指定這個力度。如filter:glow(color=red,strength=10)

7、Gray ,Invert,Xray 濾鏡

語法:{filter:gray} ,{filter:invert},{filter:xray}

Gray濾鏡是把一張圖片變成灰度圖;Invert濾鏡是把對象的可視化屬性全部翻轉,包括色彩、飽和度、和亮度值;Xray濾鏡是讓對象反映出它的輪廓并把這些輪廓加亮,也就是所謂的“X”光片。

8、Light    濾鏡

語法:Filter{light}

這個屬性模擬光源的投射效果。一旦為對象定義了“LIGHT"濾鏡屬性,那么就可以調用它的“方法(Method)"來設置或者改變屬性。

9、Mask 濾鏡

語法:{filter:mask(color=color)}

使用"MASK"屬性可以為對象建立一個覆蓋于表面的膜,其效果就象戴者有色眼鏡看物體一樣。

10、Shadow 濾鏡

語法:{filter:shadow(color=color,direction=direction)}

11、Wave 濾鏡:

       語法:{filter:wave(add=add,freq=freq,lightstrength=strength,phase=phase,strength=strength)}
           "wave" 屬性把對象按垂直的波形樣式打亂。默認是“TRUE(非0)”,

         “ADD”表示是否要把對象按照波形樣式打亂,
           
“FREQ”是波紋的頻率,也就是指定在對象上一共需要產生多少個完整的波紋,
          “LIGHTSTRENGTH”參數可以對于波紋增強光影的效果,范圍0----100,
         
“PHASE”參數用來設置正弦波的偏移量。
          
“STRENGTH”代表振幅大小。



小卓 2008-12-15 11:48 發表評論
]]>
div的定位問題http://www.aygfsteel.com/table/articles/246377.html小卓小卓Mon, 15 Dec 2008 03:47:00 GMThttp://www.aygfsteel.com/table/articles/246377.htmlhttp://www.aygfsteel.com/table/comments/246377.htmlhttp://www.aygfsteel.com/table/articles/246377.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/246377.htmlhttp://www.aygfsteel.com/table/services/trackbacks/246377.html      大家都知道,為了讓網頁能夠自動地適應用戶設置的分辨率,在網頁制作過程中人們采用了百分比的設置方式,從而頁面的所有元素從新排版,保證原來的格式。但如果你在頁面上使用了層,你會發現當瀏覽器大小改變時,層的位置卻沒有改變,結果它和其他的元素之間的配合出現了錯位現象,頁面變得雜亂無章了。而我們是不能夠強制用戶使用特定的分辨率的,那么就只有想辦法讓層的位置也能夠象表格一樣根據瀏覽器大小的改變而重新定位,這就需要合理地使用相對定位和絕對定位了。

      絕對定位(position:absolute):即層默認的定位方式,絕對于瀏覽器左上角的邊緣開始計算定位數值。

      相對定位(position:relative):層的位置相對于某個元素設置,該元素位置改變,則層的位置相應改變。

      對比兩種定位方式,不難發現,使用相對定位的層才是真正實現設計者思想的方式,從而完全掌握層的排版。

       絕對定位有沒有用呢?當然有用了,當你的網頁全部使用層來排版,而且頁面是使用默認的居左放置的,那么使用默認的絕對定位方式可以方便的排版,提高設計的工作效率。

       在Dreamweaver中,插入的層雖然都是使用的絕對(absolute)定位方式,但是插入的方式不同,帶來的效果是不同的。前面我們已經知道,使用菜單插入的層是沒有定位的坐標的,只有當你使用鼠標拖動該層改變其位置后,才會寫入坐標值。而拖拉出來的層的初始位置坐標就是鼠標開始動作時的坐標。

       請明確一個概念:由Dreanweaver賦予坐標值的層是絕對于瀏覽器邊緣定位的層。不帶坐標值的層則是相對于某元素定位的層!

       所以,最簡單的設置相對定位層的的方式就是:選定插入層的位置(例如某個單元格或者頁面中某處)將光標停留在該位置,然后選擇Insert-->Layer,即可在該位置創建一個固定大小的層,這個層就是相對于該位置定位的了。需要注意,采用這種方式創建的層,你只可以使用鼠標調整它的大小,絕對不可以移動它的位置!也就是說,在屬性面板上,層的位置欄中(Left Top)絕對不可以有數值。

       很多情況下,插入的層的位置并不一定準確,特別是Dreamweaver并非真正的所見即所得的軟件,網頁的排版只有到瀏覽器中顯示才可以真正看到排版的表現,所以上面所說的方法就顯的過于簡單而容易出問題了。這個時候,你需要給層一個定位的參照物,讓它真正地做到相對的定位。

       簡單的參照物可以是一個父層,即先插入一個相對定位的空白的層,在此層中插入你真正需要的層,而這個層是可以隨意拖拉改變位置的。但這樣畢竟在網頁中多插入了一個空白的層,我想它一定不是專業的網頁設計師所希望的。下面我們介紹使用CSS來實現真正的相對定位的層。

       我們需要先設置一個CSS Class,來定義定位的方式為相對:

      .ceng { position: relative; }
      然后,賦予你所需要的參照物(可以是 table,tr,td... )一個 CSS屬性為這個類。這樣瀏覽器就會以它的左上角為原點,建立新的坐標系。再在這個參照物的下級插入層,則層絕對于該參照物定位,如果你需要改變層的位置,你可以直接在層的屬性面板上輸入Left Top的數值(不可以使用鼠標拖拉),切記此數值的坐標原點是你所指定的參照物,而不是瀏覽器的邊緣(在Dreamweaver中編輯時,該層看起來象是絕對于頁面邊緣定位的,但在瀏覽器中,它是絕對于你所指定的參照物的)。

      很多朋友使用層是為了等到動態的效果,例如使用時間線讓某個物體運動起來,增加網頁的動感,那么相對定位后的層還可以運動嗎?回答當然是肯定的。由于定義對象的兩個位置需要拖動該對象改變位置,所以使用簡單的層定位的方法是不行的,但如果你使用CSS來設置相對定位的效果的話,那么就完全可以實現了。只是需要注意,定義運動的初始位置和結束位置時,你仍然不可以使用鼠標拖拉,而只能自行輸入Left和Top的數值。



小卓 2008-12-15 11:47 發表評論
]]>
IE瀏覽器圖片亂飛代碼http://www.aygfsteel.com/table/articles/246376.html小卓小卓Mon, 15 Dec 2008 03:46:00 GMThttp://www.aygfsteel.com/table/articles/246376.htmlhttp://www.aygfsteel.com/table/comments/246376.htmlhttp://www.aygfsteel.com/table/articles/246376.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/246376.htmlhttp://www.aygfsteel.com/table/services/trackbacks/246376.html在帶圖的IE地址欄中輸如下代碼:

javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.images; DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5}R++}setInterval('A()',5); void(0);

好玩不?



小卓 2008-12-15 11:46 發表評論
]]>
層的絕對居中應用http://www.aygfsteel.com/table/articles/246374.html小卓小卓Mon, 15 Dec 2008 03:36:00 GMThttp://www.aygfsteel.com/table/articles/246374.htmlhttp://www.aygfsteel.com/table/comments/246374.htmlhttp://www.aygfsteel.com/table/articles/246374.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/246374.htmlhttp://www.aygfsteel.com/table/services/trackbacks/246374.html1、利用負邊距方法,絕對定位使容器相對屏幕絕對居中,此時的被嵌套容器只能為絕對大小。(標準)
<div style="background:#f00; width:740px; height:340px; left:50%; margin:-170px 0 0 -370px; position:absolute; top:50%;"></div>

2、老外給出的另類方法,巧妙利用display:inline-block;,IE6.0測試通過。(標準)

注意height:100%是關鍵,edge與container沒有嵌套關系:

<style>
body { margin:0; height:100%;}
#edge { width:0; height:100%; display:inline-block; vertical-align:middle;}
#container { text-align:center; width:100%; display:inline-block; vertical-align:middle;}
</style>

<!-- required for xhtml1.1 validation only -->
<span id="edge"></span>
<span id="container">
   <div style="width:200px; height:50px; background:#f00; line-height:50px;">僅IE6.0環境下實現</div>
</span>

還有不介紹了...



小卓 2008-12-15 11:36 發表評論
]]>
頁面字體放大放小http://www.aygfsteel.com/table/articles/246372.html小卓小卓Mon, 15 Dec 2008 03:33:00 GMThttp://www.aygfsteel.com/table/articles/246372.htmlhttp://www.aygfsteel.com/table/comments/246372.htmlhttp://www.aygfsteel.com/table/articles/246372.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/246372.htmlhttp://www.aygfsteel.com/table/services/trackbacks/246372.html<script>
function turnnum(m) {
var o1=document.all('num');
var o2=document.all('txt');
i=parseInt(o1.value);
if (m!=0) i++;
else i--;
o1.value=i.toString(10);
eval('o2.style.fontSize="'+o1.value+'px"')}
</script>

<div id=txt style="line-height:18px;text-indent: 0px;font-size:12px;">
請您用下面的按鈕加減這段文字的text-indent屬性的值(單位是px)??匆豢磿l生什么,然后您就會明白這個屬性的意義。</div>
<div style="background:#CCCCCC;height:24px;padding:2px;">
<input id=num type=text value="0" size=19 readonly>&nbsp;
<input type=button value="&nbsp;+&nbsp;" onclick="turnnum(9)">&nbsp;
<input type=button value="&nbsp;-&nbsp;" onclick="turnnum(0)">
</div>



小卓 2008-12-15 11:33 發表評論
]]>
ajax檢測用戶名(email格式的用戶名)http://www.aygfsteel.com/table/articles/246370.html小卓小卓Mon, 15 Dec 2008 03:31:00 GMThttp://www.aygfsteel.com/table/articles/246370.htmlhttp://www.aygfsteel.com/table/comments/246370.htmlhttp://www.aygfsteel.com/table/articles/246370.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/246370.htmlhttp://www.aygfsteel.com/table/services/trackbacks/246370.html<input name=email class=clear_input id=email maxlength="50" value="<%=email%>" onBlur="javascript:checkEnglish()"/>
<span id=reg_email_error style="DISPLAY: none">ReadyState</span>

function checkEnglish(){
if (!CheckIfEnglish(document.insertForm.email.value )) {
   alert("請輸入數字,字母和下劃線!");
   document.insertForm.email.value="";
   document.insertForm.email.focus();
   return false;
}
else {
   doCheck();
   return true;
}
}

function CheckIfEnglish( String ){
      var Letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_";
      var i;
      var c;
     if(String.charAt( 0 )=='-')
        return false;
     if( String.charAt( String.length - 1 ) == '-' )
           return false;
     for( i = 0; i < String.length; i ++ ){
           c = String.charAt( i );
           if (Letters.indexOf( c ) < 0)
           return false;
     }
     return true;
}

ajax.js

//定義XMLHttpRequest對象實例
var http_request = false;
//定義可復用的http請求發送函數
function send_request(method,url,content,responseType,callback) {//初始化、指定處理函數、發送請求的函數
     http_request = false;
     //開始初始化XMLHttpRequest對象
     if(window.XMLHttpRequest) { //Mozilla 瀏覽器
         http_request = new XMLHttpRequest();
         if (http_request.overrideMimeType) {//設置MiME類別
             http_request.overrideMimeType("text/xml");
         }
     }
     else if (window.ActiveXObject) { // IE瀏覽器
         try {
             http_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
             try {
                 http_request = new ActiveXObject("Microsoft.XMLHTTP");
             } catch (e) {}
         }
     }
     if (!http_request) { // 異常,創建對象實例失敗
         window.alert("不能創建XMLHttpRequest對象實例.");
         return false;
     }
     if(responseType.toLowerCase()=="text") {
         //http_request.onreadystatechange = processTextResponse;
         http_request.onreadystatechange = callback;
     }
     else if(responseType.toLowerCase()=="xml") {
         //http_request.onreadystatechange = processXMLResponse;
         http_request.onreadystatechange = callback;
     }
     else {
         window.alert("響應類別參數錯誤。");
         return false;
     }
     // 確定發送請求的方式和URL以及是否異步執行下段代碼
     if(method.toLowerCase()=="get") {
         http_request.open(method, url, true);
     }
     else if(method.toLowerCase()=="post") {
         http_request.open(method, url, true);
         http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
     }
     else {
         window.alert("http請求類別參數錯誤。");
         return false;
     }
     http_request.send(content);
}
// 處理返回文本格式信息的函數
function processTextResponse() {
     if (http_request.readyState == 4) { // 判斷對象狀態
         if (http_request.status == 200) { // 信息已經成功返回,開始處理信息
             //alert(http_request.responseText);
             alert("Text文檔響應。");
         } else { //頁面不正常
             alert("您所請求的頁面有異常。");
         }
     }
}
//處理返回的XML格式文檔的函數
function processXMLResponse() {
     if (http_request.readyState == 4) { // 判斷對象狀態
         if (http_request.status == 200) { // 信息已經成功返回,開始處理信息
             //alert(http_request.responseXML);
             alert("XML文檔響應。");
         } else { //頁面不正常
             alert("您所請求的頁面有異常。");
         }
     }
}

function doCheck() {
      var f = document.forms[0];
         if(f.email.value!="") {
             document.getElementById("reg_email_error").innerHTML = "系統正在處理您的請求,請稍后。";
             send_request("GET","checkUsername.jsp?email="+f.email.value,null,"text",showFeedbackInfo);
         }
         else {
             document.getElementById("reg_email_error").innerHTML = "請輸入用戶名稱。";
         }    
}

checkUsername.jsp

<%@ page contentType="text/html; charset=gbk"%>
<%@ page import="com.beyoung.blog.hql.admin.huiyuangguanli.HuiyuangguanliHql" %>
<%@ page import="com.beyoung.blog.bean.Huiyuangguanli" %>
<%@ page import="com.beyoung.blog.util.strDate.PubFun" %>
<%
String name=request.getParameter("email");
name=PubFun.toGBK(name);
System.out.println(name);
System.out.println(" :"+HuiyuangguanliHql.getHuiyuangguanliHql().getHuiyuangguanliKey(name));
if(!HuiyuangguanliHql.getHuiyuangguanliHql().getHuiyuangguanliKey(name)){  
   out.println("<font color='#FF0000'>用戶名稱["+name+"]已占用!</font>");
}
else{
out.println("<font color='#088EOF'>用戶名稱["+name+"]尚未被注冊,您可以繼續。</font>");
}
%>



小卓 2008-12-15 11:31 發表評論
]]>
jsp ajax 延遲加載..http://www.aygfsteel.com/table/articles/246344.html小卓小卓Mon, 15 Dec 2008 02:43:00 GMThttp://www.aygfsteel.com/table/articles/246344.htmlhttp://www.aygfsteel.com/table/comments/246344.htmlhttp://www.aygfsteel.com/table/articles/246344.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/246344.htmlhttp://www.aygfsteel.com/table/services/trackbacks/246344.html<html>
<script language="javascript">
function aaa(){
setTimeout("showComment('<%=request.getParameter("userid")%>')",5000) ;    //延遲加載
}
function showVistor(){
document.getElementById("objID").innerHTML="加載完畢";
}
function showComment(userid){
var ajaxobj=new AJAX();
ajaxobj.method="GET";
ajaxobj.url="blogProcess.jsp?action=showComment&userid="+userid;
ajaxobj.callback=function(){
    $F("commentcon",ajaxobj.gettext());
}     
ajaxobj.send();
}
function $F(objID,html){
$(objID).innerHTML=html;
}
function $(objID) {
   return document.getElementById(objID)
}
</script>
<body>
<div id="objID">&nbsp;加載中......<script>aaa()</script></div>
</body>
</html>



小卓 2008-12-15 10:43 發表評論
]]>
window.open的例子和使用方法以及參數說明http://www.aygfsteel.com/table/articles/234167.html小卓小卓Tue, 14 Oct 2008 02:22:00 GMThttp://www.aygfsteel.com/table/articles/234167.htmlhttp://www.aygfsteel.com/table/comments/234167.htmlhttp://www.aygfsteel.com/table/articles/234167.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234167.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234167.html一、window.open()支持環境:

  JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+

  二、基本語法:

  window.open(pageURL,name,parameters)

  其中:

  pageURL 為子窗口路徑 name 為子窗口句柄 parameters 為窗口參數(各參數用逗號分隔)

  三、示例:

<SCRIPT>
<!--
window.open ('page.html','newwindow','height=100,width=400,top=0,left=0,toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no')
//寫成一行
-->
</SCRIPT>

  腳本運行后,page.html將在新窗體newwindow中打開,寬為100,高為400,距屏頂0象素,屏左0象素,無工具條,無菜單條,無滾動條,不可調整大小,無地址欄,無狀態欄。

  請對照。上例中涉及的為常用的幾個參數,除此以外還有很多其他參數,請見四。

  四、各項參數

  其中yes/no也可使用1/0;pixel value為具體的數值,單位象素。

參數 | 取值范圍 | 說明
| |
alwaysLowered | yes/no | 指定窗口隱藏在所有窗口之后
alwaysRaised | yes/no | 指定窗口懸浮在所有窗口之上
depended | yes/no | 是否和父窗口同時關閉
directories | yes/no | Nav2和3的目錄欄是否可見
height | pixel value | 窗口高度
hotkeys | yes/no | 在沒菜單欄的窗口中設安全退出熱鍵
innerHeight | pixel value | 窗口中文檔的像素高度
innerWidth | pixel value | 窗口中文檔的像素寬度
location | yes/no | 位置欄是否可見
menubar | yes/no | 菜單欄是否可見
outerHeight | pixel value | 設定窗口(包括裝飾邊框)的像素高度
outerWidth | pixel value | 設定窗口(包括裝飾邊框)的像素寬度
resizable | yes/no | 窗口大小是否可調整
screenX | pixel value | 窗口距屏幕左邊界的像素長度
screenY | pixel value | 窗口距屏幕上邊界的像素長度
scrollbars | yes/no | 窗口是否可有滾動欄
titlebar | yes/no | 窗口題目欄是否可見
toolbar | yes/no | 窗口工具欄是否可見
Width | pixel value | 窗口的像素寬度
z-look | yes/no | 窗口被激活后是否浮在其它窗口之上

  例子說明:

【1、最基本的彈出窗口代碼】

其實代碼非常簡單:

<SCRIPT LANGUAGE="javascript">
<!--
window.open ('page.html')
-->
</SCRIPT>

  因為著是一段javascripts代碼,所以它們應該放在<SCRIPT LANGUAGE="javascript">標簽和</script>之間。<!-- 和 -->是對一些版本低的瀏覽器起作用,在這些老瀏覽器中不會將標簽中的代碼作為文本顯示出來。要養成這個好習慣啊。

  window.open ('page.html') 用于控制彈出新的窗口page.html,如果page.html不與主窗口在同一路徑下,前面應寫明路徑,絕對路徑(http://)和相對路徑(../)均可。用單引號和雙引號都可以,只是不要混用。

  這一段代碼可以加入HTML的任意位置,<head>和</head>之間可以,<body>間</body>也可以,越前越早執行,尤其是頁面代碼長,又想使頁面早點彈出就盡量往前放。

  【2、經過設置后的彈出窗口】

  下面再說一說彈出窗口的設置。只要再往上面的代碼中加一點東西就可以了。我們來定制這個彈出的窗口的外觀,尺寸大小,彈出的位置以適應該頁面的具體情況。

<SCRIPT LANGUAGE="javascript">
<!--
window.open ('page.html', 'newwindow', 'height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')
//寫成一行
-->
</SCRIPT>

  參數解釋:

<SCRIPT LANGUAGE="javascript"> js腳本開始;
window.open 彈出新窗口的命令;
'page.html' 彈出窗口的文件名;
'newwindow' 彈出窗口的名字(不是文件名),非必須,可用空''代替;
height=100 窗口高度;
width=400 窗口寬度;
top=0 窗口距離屏幕上方的象素值;
left=0 窗口距離屏幕左側的象素值;
toolbar=no 是否顯示工具欄,yes為顯示;
menubar,scrollbars 表示菜單欄和滾動欄。
resizable=no 是否允許改變窗口大小,yes為允許;
location=no 是否顯示地址欄,yes為允許;
status=no 是否顯示狀態欄內的信息(通常是文件已經打開),yes為允許;
</SCRIPT> js腳本結束

【3、用函數控制彈出窗口】

下面是一個完整的代碼。
<html>
<head>
<script LANGUAGE="JavaScript">
<!--
function openwin() { window.open ("page.html", "newwindow", "height=100, width=400, toolbar=
no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
//寫成一行
}
//-->
</script>
</head>
<body onload="openwin()">
...任意的頁面內容...
</body>
</html>

  這里定義了一個函數openwin(),函數內容就是打開一個窗口。在調用它之前沒有任何用途。
怎么調用呢?

  方法一:<body onload="openwin()"> 瀏覽器讀頁面時彈出窗口;
  方法二:<body onunload="openwin()"> 瀏覽器離開頁面時彈出窗口;
  方法三:用一個連接調用:

  <a href="#" onclick="openwin()">打開一個窗口</a>

  注意:使用的“#”是虛連接。

  方法四:用一個按鈕調用:

  <input type="button" onclick="openwin()" value="打開窗口">

  【4、同時彈出2個窗口】

  對源代碼稍微改動一下:

<script LANGUAGE="JavaScript">
<!--
function openwin()
{ window.open ("page.html", "newwindow", "height=100, width=100, top=0,left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
//寫成一行
window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
//寫成一行
}
//-->
</script>

  為避免彈出的2個窗口覆蓋,用top和left控制一下彈出的位置不要相互覆蓋即可。最后用上面說過的四種方法調用即可。

  注意:2個窗口的name(newwindows和newwindow2)不要相同,或者干脆全部為空。OK?

【5、主窗口打開文件1.htm,同時彈出小窗口page.html】

如下代碼加入主窗口<head>區:
<script language="javascript">
<!--
function openwin()
{window.open("page.html","","width=200,height=200")
}
//-->
</script>

  加入<body>區:

<a href="1.htm" onclick="openwin()">open</a>即可。

【6、彈出的窗口之定時關閉控制】

  下面我們再對彈出的窗口進行一些控制,效果就更好了。如果我們再將一小段代碼加入彈出的頁面(注意是加入到page.html的HTML中,可不是主頁面中,否則...),讓它10秒后自動關閉是不是更酷了?

  首先,將如下代碼加入page.html文件的<head>區:

<script language="JavaScript">
function closeit()
{setTimeout("self.close()",10000) file://毫秒}
</script>

  然后,再用<body onload="closeit()"> 這一句話代替page.html中原有的<BODY>這一句就可以了。(這一句話千萬不要忘記寫啊!這一句的作用是調用關閉窗口的代碼,10秒鐘后就自行關閉該窗口)

【7、在彈出窗口中加上一個關閉按鈕】

<FORM>
<INPUT TYPE='BUTTON' VALUE='關閉' onClick='window.close()'>
</FORM>

  呵呵,現在更加完美了!

【8、內包含的彈出窗口-一個頁面兩個窗口】

  上面的例子都包含兩個窗口,一個是主窗口,另一個是彈出的小窗口。

  通過下面的例子,你可以在一個頁面內完成上面的效果。

<html>
<head>
<SCRIPT LANGUAGE="JavaScript">
function openwin()
{OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no");
//寫成一行
OpenWindow.document.write("<TITLE>例子</TITLE>")
OpenWindow.document.write("<BODY BGCOLOR=#ffffff>")
OpenWindow.document.write("<h1>Hello!</h1>")
OpenWindow.document.write("New window opened!")
OpenWindow.document.write("</BODY>")
OpenWindow.document.write("</HTML>")
OpenWindow.document.close()}
</SCRIPT>
</head>
<body>
<a href="#" onclick="openwin()">打開一個窗口</a>
<input type="button" onclick="openwin()" value="打開窗口">
</body>
</html>

  看看 OpenWindow.document.write()里面的代碼不就是標準的HTML嗎?只要按照格式寫更多的行即可。千萬注意多一個標簽或少一個標簽就會出現錯誤。記得用OpenWindow.document.close()結束啊。

【9、終極應用--彈出的窗口之Cookie控制】

  回想一下,上面的彈出窗口雖然酷,但是有一點小毛病(沉浸在喜悅之中,一定沒有發現吧?)比如你將上面的腳本放在一個需要頻繁經過的頁面里(例如首頁),那么每次刷新這個頁面,窗口都會彈出一次,是不是非常煩人?:-(有解決的辦法嗎?Yes! ;-) Follow me.

  我們使用cookie來控制一下就可以了。

  首先,將如下代碼加入主頁面HTML的<HEAD>區:

<script>
function openwin()
{window.open("page.html","","width=200,height=200")}
function get_cookie(Name)
{var search = Name + "="
var returnvalue = "";
if (document.cookie.length > 0) {
offset = document.cookie.indexOf(search)
if (offset != -1) {
offset += search.length
end = document.cookie.indexOf(";", offset);
if (end == -1)
end = document.cookie.length;
returnvalue=unescape(document.cookie.substring(offset,end))
}
}
return returnvalue;
}
function loadpopup(){
if (get_cookie('popped')==''){
openwin()
document.cookie="popped=yes"
}
}
</script>

  然后,用<body onload="loadpopup()">(注意不是openwin而是loadpop?。。┨鎿Q主頁面中原有的<BODY>這一句即可。你可以試著刷新一下這個頁面或重新進入該頁面,窗口再也不會彈出了。真正的Pop-Only-Once!

  寫到這里彈出窗口的制作和應用技巧基本上算是完成了,俺也累壞了,一口氣說了這么多,希望對正在制作網頁的朋友有所幫助俺就非常欣慰了。

  需要注意的是,JS腳本中的的大小寫最好前后保持一致。



小卓 2008-10-14 10:22 發表評論
]]>
深入研究JScript語法——常量和變量http://www.aygfsteel.com/table/articles/234153.html小卓小卓Tue, 14 Oct 2008 01:48:00 GMThttp://www.aygfsteel.com/table/articles/234153.htmlhttp://www.aygfsteel.com/table/comments/234153.htmlhttp://www.aygfsteel.com/table/articles/234153.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234153.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234153.html
前面的例子中:

return "<font color=gray>"+hit+"</font>"


使用了變量和常量,"<font color=gray>"和"</font>"是文本常量,hit是變量。

加號(+)則將三者加成一個文本:"<font color=gray>100</font>",如果hit為100的話。

 

數值常量

    這個很簡單,上過數學課的都應該知道如何表示數字,JScript中沒有任何特別。

123
0
-100
100.123
1E3        (1000)

都是合法的數字常量

文本常量

    這個用的最多,因為經常要動態的生成HTML文本。常量必須用引號括起來:

"abc"

"123"

"文本常量"

都是合法的文本常量,為什么要用引號?完全沒有編程經驗的人可能會有些疑惑,其實很簡單,
計算機需要把常量和變量區別開。

變量賦值

    a = "abc"

變量a的值為"abc"了。為什么比較時要用==,為了和賦值區別開呀!

    b = a + "123"

變量b的值為"abc123"了。如果常量不加引號如何和變量區別呢?

    b = "a" + "123"

變量b的值為"a123"

 

那么如果文本中包含引號如何?比如如何表示:

<input type=button value="A A">

因為按鈕的名稱里有空格,那么必須用雙引號括起來,如何表示這個文本常量?

JScript還可以使用單引號:

'<input type=button value="A A">'

在單引號中就可以直接使用雙引號了。反過來在雙引號括起來的常量里可以直接使用單引號。

"<input type=button value='A A'>"

那么當常量里兩個引號都有該怎么辦?這就需要使用轉義符號反斜杠\

"abc'def\"ghi"

在常量中可以用“\"”來表示一個雙引號。而且還有:

\r\n        表示回車
\\          表示一個反斜杠

 

 

function myname(name){

    if (name=="小青"){
       document.write("<input type=button value='隱藏小青' onclick=\"mytext.style.display='none'\">")
    }
    else
       document.write(name)

}

上面的函數,當輸入name為“小青”時,輸出:

<input type=button value='隱藏' onclick="mytext.style.display='none'">

 

變量定義

    JScript中可以不預先定義變量就直接使用,但是這樣往往會帶來潛在問題,
所以建議大家使用變量前都先定義好。

    變量有兩種類型,定義在函數內部的為局部變量。

<script>
function myfunc(){

//變量定義使用var,下面定義了變量a
var a

//可以一次定義多個變量,用逗號分開
var i,j,k

//定義的時候還可以給變量賦初值
var a="acb"

var a=123,b="ddd"

}
</script>

局部變量只在函數內有效,離開函數該變量就不存在了。

如果定義在函數外則為全局變量:

<script>
//定義一個全局變量a
var a
</script>

該變量在所有函數內外都將有效,除非函數內定義了一個相同名稱的變量

<script>
//定義全局變量a
var a=100

function myfunc(){

var a="abc"

//函數輸出的是abc,函數內的變量屏蔽了同名全局變量
document.write(a)

}
</script>

如果不使用var來定義,那么變量是全局變量。因此如果你不明確定義變量在使用,
就可能誤用了全局變量,比如:

<script>
//定義全局變量a
var a="dddd"

...

function myfunc(){
    //函數內只想使用一個臨時的變量保存返回結果
    a=b+...

    ...

    return a

}
</script>

那么一旦執行過myfunc,則原先的全局變量的值就被破壞了,這就可能引起其實使用
該全局變量的程序出錯!因此強烈建議大家都明確定義變量,而且盡量少使用全局變量

小卓 2008-10-14 09:48 發表評論
]]>
多級下拉菜單的級連顯示問題http://www.aygfsteel.com/table/articles/234150.html小卓小卓Tue, 14 Oct 2008 01:41:00 GMThttp://www.aygfsteel.com/table/articles/234150.htmlhttp://www.aygfsteel.com/table/comments/234150.htmlhttp://www.aygfsteel.com/table/articles/234150.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234150.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234150.html

多級下拉菜單的級連顯示問題。

在這里,我為了實現公司-部門級連顯示問題,我編寫了leader_add_competence_dialogquery.jsp ,web.xml,SelectCropDepartServlet.java 類。

其中注意的是leader_add_competence_dialogquery中的.jspChange_Select() javascript函數中的/selectCropDepart是在web.xml中定義的servlet類。我們在實現應用當中需要修改的用紅字標出。

其中leader_add_competence_dialogquery.jsp代碼如下:

<%@ page contentType="text/html; charset=gbk" language="java" import="java.sql.*" errorPage="" %>

<%@ page import="pub.*" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

<html>

<head>

<title>添加領導權限</title>

<link href="../css/putong.css" type="text/css" rel="stylesheet">

<base target="_self">

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">

<META HTTP-EQUIV="Expires" CONTENT="0">

</head>

<script language="javascript">

    var req;

    window.onload=function(){

    }

       function Change_Select(){      

       var zhi = document.getElementById('Corp').value;

         var url = "../selectCropDepart?id=" + escape(zhi);

        //alert(url);

         if (window.XMLHttpRequest) {

             req = new XMLHttpRequest();

         }else if (window.ActiveXObject) {

             req = new ActiveXObject("Microsoft.XMLHTTP");

         }

        if(req){

             req.open("GET", url, true);

             req.onreadystatechange = callback;

             req.send(null);       

         }  

    }

   

    function callback() {

    if (req.readyState == 4) {

        if (req.status == 200) {

                 parseMessage();

       // update the HTML DOM based on whether or not message is valid

        }else{

            alert ("Not able to retrieve description" +req.status+req.statusText);

 

        }      

 

    }

   }

  

   function parseMessage() {

    var xmlDoc = req.responseXML.documentElement;

    var xSel = xmlDoc.getElementsByTagName('select');

    var select_root = document.getElementById('Depart');

    select_root.options.length=0;

    for(var i=0;i<xSel.length;i++)

    {   

        var xValue = xSel[i].childNodes[0].firstChild.nodeValue;

    var xText = xSel[i].childNodes[1].firstChild.nodeValue;

    var option = new Option(xText,xValue);

    try

       {

              select_root.add(option);   

       }

       catch(e){

       }  

    }

    }

       function AddLeaderCompetence(){

           var key=document.all.HiddenKey.value;      document.from1.action="leader_ctl.jsp?Oper=addCompetence&Key="+key;

           document.from1.submit();

    }

</script>

<body>

<%

       String strUserID=request.getParameter("Key");

               session.setAttribute("EmployUserID",strUserID);

%>

<form name="from1" action="leader_ctl.jsp"  method="post">

<table cellSpacing="0" cellPadding="0" width="100%" bgColor="#bfcae6" border="0" background="../images/subtitle.gif">

    <tr>

       <td width="99%" height="26"><FONT face="宋體">

          <DIV align="left"><FONT face="宋體" color="#ffffff">&nbsp;&nbsp;當前位置:系統管理&gt;&gt;領導設置&gt;&gt;添加領導權限       </FONT>

           </DIV>

           </FONT>

       </td>

    </tr>

  </table>

   <input type="hidden" name="HiddenKey" value="<%=strUserID%>" >

  <table width="100%" border="0" cellpadding="2" cellspacing="1" bgcolor="#AABDE0">

  <tr bgcolor="#FFFFFF">

  <td align="right">公司:</td>

  <td>   

    <SELECT name="Corp" id="Corp"  onChange="Change_Select()" >

      <OPTION value="all" selected>所有公司</OPTION></SELECT></td>

  </tr>

  <tr bgcolor="#FFFFFF">

  <td align="right">部門:</td>

  <td><SELECT name="Depart" id="Depart">

      <OPTION value="all" selected>所有部門</OPTION></SELECT></td>

  </tr>

  <tr bgcolor="#FFFFFF">

  <td colspan="2" align="center"><input type="button" onClick="AddLeaderCompetence();" class="button" style="width:80px" value="保存">&nbsp;&nbsp;&nbsp;&nbsp;<input type="button" class="button" value="關閉" onClick="window.close();" style="width:80px"> </td> 

  </tr>

  </table> 

</form>

</body>

<%   

    Conn conn=new Conn();

    String m1Script="";

    //String m2Script="";

    m1Script=PubClass.BindAllCorpList("document.all.Corp");

    //m2Script=PubClass.BindAllDepartList("document.all.Depart",""+session.getAttribute("cropid"));

    //sPositionList=conn.bindDropListSel("document.all.PositionName","select * from sys08_Position","PositionName","PositionID");

%>

<%= m1Script%>

</html>

 

Web.xml代碼如下:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

    xmlns="

    xmlns:xsi="

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

   

   <servlet>

    <servlet-name>selectCropDepart</servlet-name>

    <servlet-class>pub.SelectCropDepartServlet</servlet-class>

  </servlet>

  <servlet-mapping>

        <servlet-name>selectCropDepart</servlet-name>

        <url-pattern>/selectCropDepart</url-pattern> 

  </servlet-mapping>

</web-app>

 

SelectCropDepartServlet.java  Servlet類代碼如下

/**

 * 從sys04_Machine表中取數據進行二級下拉菜單(公司,部門)及關聯的servlet類

 * @author 鄧浩

  */

public class SelectCropDepartServlet extends HttpServlet {

       public SelectCropDepartServlet() {

              super();

       }

       public void destroy() {

              super.destroy(); }

       /**

        * The doGet method of the servlet. <br>

        *

        * This method is called when a form has its tag value method equals to get.

        *

        * @param request the request send by the client to the server

        * @param response the response send by the server to the client

        * @throws ServletException if an error occurred

        * @throws IOException if an error occurred

        */

       public void doGet(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

              response.setContentType("text/xml");

              response.setCharacterEncoding("UTF-8");

              response.setHeader("Cache-Control", "no-cache");      

              String targetId = request.getParameter("id").toString();

              String xml_start ="<selects>";

             String xml_end = "</selects>";

             String xml = "";

             try{

                    Conn  conn=new Conn();

                    DataTable  dt=new DataTable();

                    String Sql="select * from sys04_Machine where cropid="+targetId;

                    ////System.out.println("Sql:"+Sql);

                     xml+= "<select><value>all</value><text>所有部門</text></select>" ;

                    int i=0;

                    if  (conn.querySql(Sql,dt)){

                           while  (i<dt.getRowCount()){

                                  xml+= "<select><value>"+dt.getItemForName(i,"MachID").toString()+"</value><text>"+dt.getItemForName(i,"MachName").toString()+"</text></select>";  

                                  i=i+1;

                           }

                    }

                 String last_xml = xml_start + xml + xml_end;

                 //System.out.println("last_xml:"+last_xml);

                //  last_xml = new String(last_xml.getBytes("UTF-8"), "GB2312");

                response.getWriter().write(last_xml);

             }// try

             catch  (Exception e){

                    System.out.print(e.getMessage());

             }      

       }

       public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{

              doGet(request,response);

      }

       public void init() throws ServletException {

       }

}



小卓 2008-10-14 09:41 發表評論
]]>
XML WebService完全實例詳細解析http://www.aygfsteel.com/table/articles/234087.html小卓小卓Mon, 13 Oct 2008 10:23:00 GMThttp://www.aygfsteel.com/table/articles/234087.htmlhttp://www.aygfsteel.com/table/comments/234087.htmlhttp://www.aygfsteel.com/table/articles/234087.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234087.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234087.html首先,我們必須了解什么是webservice.就概念上來說,可能比較復雜,不過我們可以有個宏觀的了解:webservice就是個對外的接口,里面有 函數可供外部客戶調用(注意:里面同樣有客戶不可調用的函數).假若我們是服務端,我們寫好了個webservice,然后把它給了客戶(同時我們給了他 們調用規則),客戶就可以在從服務端獲取信息時處于一個相對透明的狀態.即是客戶不了解(也不需要)其過程,他們只獲取數據.

  webservice傳遞的數據只能是序列化的數據,典型的就是xml數據,這里我們也只討論xml數據的傳輸.

  有了一些對xml webservice的初步了解后,我們將切入正題,即是用一個具體的webservice事例的形式來講解具體的webservice用法,用具體的事例來講解一個概念我想怎么也要比單純的說理能讓人容易理解吧.

  這里,我們將以一個簡單的分布式課件搜索系統為例來講解.使用VS2003為編譯環境,C#為語言,SqlServcer2000為數據庫.(這個例子來 源于一位網上朋友的文章的啟發,覺得很能代表webservice的特點,就按那個想法做了這么個系統來示例了)

  首先,明確我們要做什么.我們需要一個對客戶的接口,也就是個站點,我們把它稱做ServiceGatherSite,它是何種形式都無所謂,甚至它本身 并不需要數據庫,它只是提供給用戶一個查詢的接口,真正的服務,普通用戶是不接觸到的.然后,這里我們還需要若干個提供服務的站點,我們可以稱它們為資源 站,這里為簡單起見,假設有兩個資源站,分別叫WebSiteA,WebSiteB,它們可以是不對外公布的,只是為了豐富查詢數據而存在.最后,是我們 最需要關注的東西---資源站提供給ServiceGatherSite的服務.兩個資源站,就有兩個服務,我們稱為SiteAService和 SiteBService.兩個服務間沒有任何關系,內部提供的方法也完全沒關聯,只是需要把方法如何使用告訴ServiceGatherSite,意思 是,服務只提供查詢接口,返回的數據如何處理,服務本身并不管,全由使用服務的站點分配.

  寫了這么多,算是簡要的介紹了下有關xml webservice的概念和我們這個例子的結構,下篇文章,我們將開始真正進入代碼的設計階段.

  上篇文章介紹了些webservice的基本特性和我們例子的結構,這篇文章我們將開始具體的代碼編寫工作.

  這個專題主要講述的是webservice,因此這里我們的代碼以Webservice相關為主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只將簡略介紹.

  在VS2003中,開發一個webservice并不是件困難的事,首先,我們新建一個webservice項目(文件->新建->項目->C#->Web服務應用程序)

  建完這個工程,我們將看到一個叫Service1.asmx的文件,這就是webservice的標準文件,它也有UI的概念,不過我們一般不關注,因 此,我們查看其cs代碼文件.如果你什么都還沒做的話,將看見一個被注釋掉的helloworld的WebMethod,把注釋去掉,在運行,你就可以得 到最簡單的webservice運行實例了.點擊"helloworld"將執行其方法.顯然,這個函數對我們的意義只在于宏觀的了解了下web服務的寫 法.

  下面,我們將開始具體介紹webservice的寫法.在代碼文件里,如果我們寫了一個函數后,希望此函數成為外部可調用的接口函數,我們必須在函數上面 添上一行代碼[WebMethod(Description="函數的描述信息")],如果你的函數沒有這個申明,它將不能被用戶引用.如:

 

  [WebMethod(Description="最簡單的方法")]
  public string HelloWorld()
  {
  return "Hello World";
  }
  這個函數就是外部可調用的接口函數,對用戶來說相當于一個API.如果某用戶在引用了這個服務后,他調用HelloWorld()方法,他就將獲得"HelloWorld"這個返回值.
  看到這里,我們是不是發現,其實webservice并不是那么的神秘,它也不過只是個接口,對我們而言,側重點依然是接口函數的編寫.下面,我將給出我們的例子所需要的接口函數.
  [WebMethod(Description="查詢以獲取需要的課件信息")]
  public XmlDataDocument GetSiteAData(string AssignName)
  {
  XmlDataDocument xd=new XmlDataDocument(); //
  DataSet ds=new DataSet();
  CStoreProc cp=new CStoreProc("SearchAssign");
  cp.AddParIn("@keywords",SqlDbType.VarChar,30,AssignName);
  cp.AddParOut("@res",SqlDbType.Int);
  if(cp.SelectProc()) //如果執行成功,存儲過程
  {
  cp.myData.EnforceConstraints=false; //不進行格式嚴格檢查
  if((int)cp.GetReturnValue("@res")==-1)
  {
  string xml="";
  xd.LoadXml(xml);
  return xd;
  }
  xd=new XmlDataDocument(cp.myData);
  XmlNode root1=xd.DocumentElement;
  XmlNodeList roots=root1.SelectNodes("list");
  foreach(XmlNode roota in roots) //為所有元素加上站點名稱標記
  {
  XmlElement Link=xd.CreateElement("SiteName");
  Link.InnerText=ConfigurationSettings.AppSettings["SiteName"].ToString();
  roota.AppendChild(Link);
  }
  return xd;
  }
  else return null;
  }

 

  這是獲取資源站點信息的一個接口函數.里面大部分的代碼,我想對于有一定asp.net基礎的朋友來說,都應該是一看就明白,這里只說明下CStoreProc,這是我封裝的一個存儲過程類,主要功能是執行各種類型的存儲過程.

  細心的朋友可能會發現這個函數的返回類型似乎比較特殊,是個xml的文檔.我們在前面已經說過,webservice只能傳輸序列化數據,xml顯然滿足 條件,但比如hash表之類的非序列化數據,是不能傳輸的,xml使用最為廣泛,而且考慮到跨平臺應用,所以這里我們只以xml數據的傳輸來示例.

  接上篇文章,我們先簡單解釋下GetSiteAData(string AssignName)函數.

  函數功能很簡單,只是要返回查詢結果,其數據格式是XmlDataDocument.當查詢失敗時(無匹配查詢結果),我們構造一個xml,返回一個空記 錄.否則,我們把查詢后的dataset生成一個XmlDataDocument,接下來,由于該項目的需要,我加入了一個循環,添加dataset里所 沒有的節點,站點名稱.在這之后,算是完成了一個符合我們期望格式的xml數據文檔,我們把它返回.

  好了,webservice的方法函數介紹完了(這里還有個web服務方法,稍后介紹),接下來我們的任務是怎么調用它了.首先把webservice的 項目編譯完成,假定我們這個服務是針對資源站點A的,我們不妨稱其為ServiceA.先單獨運行asmx文件,執行GetSiteAData (string AssignName)方法,將提示你輸入參數,你輸入要搜索的內容,點確認,將返回給你一個xml數據,并在ie上顯示出來,這就是你搜索到的內容拉.

  這里對ServiceA的工作再做點介紹,在我們這個項目里,它是資源站點A提供的服務,意思是,它查詢的數據將全來源于站點A,而站點A資源添加在本項目也有專門的工程實現.

  好了,回到正題.這里我介紹vs調用webservice的方法,其實其他平臺的調用方法也是大同小異.首先我們介紹web引用方式,這種方式我強烈建議 調試時使用,非常方便.右擊引用,點添加web引用,輸入你的webservice地址,如:http: //localhost/aspxproject/WebServiceSolution/SiteBService/service1.asmx,你必 須保證你輸入的webservice存在.然后引用即可,注意:web引用名將作為你加入的webservice的名字空間.比如你輸入了:SiteA, 那服務的實例化將是這樣:SiteA.Service1 serviceA=new SiteA.Service1();(Service1是服務的類名).

  完成了這一步,service的調用似乎變的那么簡單,我們已經實現了遠程實例化,接下來的遠程調用也是一樣的容易.下面給出資源采集站ServiceGatherSite的綁定代碼(只采集A站點的信息)

 

  //綁定數據
  public void BindData()
  {
  serviceA=new SiteA.Service1();
  DataSet ds=new DataSet();
  XmlNode xmlNode1;
  XmlDataDocument xd=new XmlDataDocument();
  StringBuilder xmlString1;
  xmlNode1=serviceA.GetSiteAData(strSearch);
  if(xmlNode1==null) //--存儲過程執行失敗
  return;
  xmlString1=new StringBuilder(xmlNode1.OuterXml);
  if(xmlString1.ToString().Equals(""))
  return ;
  xd.LoadXml(xmlString1.ToString());
  ds.ReadXml(new XmlNodeReader(xd));
  DataGrid1.DataSource=ds.Tables["list"].DefaultView;
  DataGrid1.DataBind();
  }

 

  此段代碼給出了xml轉化成dataset的解決方案,雖然這不是必須的,但畢竟在asp.net里,dataset占的作用之重,誰都知道的.其他的請 朋友們先看(呵呵,個中高手就免了),在下篇文章中將會有對它的一些解釋與及多服務分布調用的解決方案,寫了三篇了,發現似乎還是有些朋友看的,那我就獻 丑繼續寫下去好了,大家有什么意見也希望提出,在下的理解存在偏駁也再所難免,希望諒解:)

  接上篇文章,我們先簡單說明下綁定函數.首先實例化ServiceA,這個和一般類的實例化并沒有不同..接下來用xmlNode1來接受函數的返回值,接下來是構造xml,并將其轉化為dataset,這是通用的方法,如果是剛接觸不久的朋友,最好能記下這種方法.

  接下來給出異步調用兩個服務的代碼

 

  //綁定數據
  public void BindData()
  {
  IAsyncResult ar1;
  IAsyncResult ar2;
  serviceA=new SiteA.Service1();
  serviceB=new SiteB.Service1();
  DataSet ds=new DataSet();
  XmlNode xmlNode1,xmlNode2;
  XmlDataDocument xd=new XmlDataDocument();
  StringBuilder xmlString1,xmlString2;
  //--簡單的異步調用
  ar1=serviceA.BeginGetSiteAData(strSearch,null,null);
  ar2=serviceB.BeginGetSiteAData(strSearch,null,null);
  xmlNode1=serviceA.EndGetSiteAData(ar1);
  xmlNode2=serviceB.EndGetSiteAData(ar2);
  //----------
  if(xmlNode1==null&&xmlNode2==null) //--存儲過程執行失敗
  return;
  xmlString1=new StringBuilder(xmlNode1.OuterXml);
  xmlString2=new StringBuilder(xmlNode2.OuterXml);
  xmlString1=MakeNewXmlString(xmlString1,xmlString2); //生成新的xml
  if(xmlString1.ToString().Equals(""))
  return ;
  xd.LoadXml(xmlString1.ToString());
  ds.ReadXml(new XmlNodeReader(xd));
  DataGrid1.DataSource=ds.Tables["list"].DefaultView;
  DataGrid1.DataBind();
  }
  //生成新XML
  public StringBuilder MakeNewXmlString(StringBuilder str1,StringBuilder str2)
  {
  str1=str1.Replace("","");
  str2=str2.Replace("","");
  str1.Append(str2.ToString());
  return str1;
  }

 

  這有兩個需要注意的地方,一個是xml構造,還有就是異步調用的實現,請讀者,自己理解

  下面講下通過dll來引用webservice的方法,我只把流程介紹下.

  首先,在ie輸入服務的地址,如:http://www.xxx.com/service.asmx

  然后寫輸入http://www.xxx.com/service.asmx?wsdl

  打開后,另存為xxx.wsdl

  然后用vs的命令提示符來編譯:wsdl /namespace:SiteA ServiceA.wsdl

  生成名字空間為sitea的代理類

  最后csc /out:ServiceA.dll /t:library Service1.cs ,其中service1.cs為代理類文件

  最后引用dll就可以了.



小卓 2008-10-13 18:23 發表評論
]]>
Javascript代碼混淆綜合解決方案http://www.aygfsteel.com/table/articles/234086.html小卓小卓Mon, 13 Oct 2008 10:20:00 GMThttp://www.aygfsteel.com/table/articles/234086.htmlhttp://www.aygfsteel.com/table/comments/234086.htmlhttp://www.aygfsteel.com/table/articles/234086.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234086.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234086.htmlJavascript 代碼混淆的目的

Javascript 是一種解釋執行的腳本語言,主要應用于 Web 領域的客戶端的瀏覽器中;由于 Javascript 解釋執行的特性,代碼必須明文下載到客戶端,并且可以很容易的進行調試,使得 Javascript 代碼的保護非常困難;

不同的人對 Javascript 代碼的保護有不同的看法;有的人辛苦努力的代碼,卻可以被競爭對手輕易獲得,他們就非常希望能有保護 Javascript 代碼的方案,但現有的方案可能無法滿足他們的要求;很多人認為 Javascript 語言很簡單,Javascript 代碼沒有保護的價值,可能是他們的代碼確實簡單,或者他們并不了解 Javascript 語言強大的功能;還有的人認為現在都開源了,還保護代碼干什么,當然開源的人是值得敬佩的,但對別人的代碼的開源要求,卻不是合理的。

為了提高用戶的體驗,出現了 Web 2.0 技術,并隨著 AJAX 和富界面技術的發展,Javascript 在 Web 應用上的重要性越來越高,Javascript 代碼的復雜性、功能和技術含量也越來越高,對Javascript 代碼保護的需要也越來越迫切。

Javascript 在線混淆器的目的是為 Javascript 代碼保護的需求,提供一種全新的綜合解決方案,包括編碼規則和免費的在線混淆器。

 

混淆和加密的區別

很多人將這兩者混在一起討論,實際上兩者的目的有一定的區別,采取的手段也有很大的不同。加密主要是為了防止未經授權的使用,對這種情況即使破解了加密,也只能非法使用,并不一定能獲得軟件的代碼邏輯;但對于腳本來說,防止對代碼進行訪問的措施,也屬于加密,對這種情況,破解了加密,就獲得了代碼;而混淆是在無法阻止他人獲取代碼的情況下,采取的保護代碼的邏輯不被他人理解的措施;對于混淆的代碼,他人很難理解,無法進行修改和重新應用;
對于生成機器碼的語言,比如 C 語言,只需要考慮未經授權的訪問,幾乎不需考慮代碼的保護;因為對編譯后的軟件,只能反匯編為匯編語言代碼,幾乎無法分析出代碼的邏輯。
對于生成中間代碼的語言,比如 Java 和 C#,即需要考慮未經授權的訪問,又需考慮代碼的保護;;因為對編譯后的軟件,可以很容易的反編譯為較高級的語言,從而了解到代碼中的邏輯,并較容易的破解加密。而混淆后,即難于理解代碼的邏輯,也不易找到加密點所在。
對于腳本語言,比如 Javascript,只能混淆,難以加密;因為腳本都是明文存在的,很容易調試的,通過跟蹤可以較容易的破解上面兩種目的的加密。但是混淆后的代碼是難于理解代碼的邏輯的。

我們只涉及到對 Javascript 腳本進行混淆,而不涉及加密;對于涉及到 Javascript 的系統的加密,我們建議不要將加密點放在 Javascript 腳本內,而是放在服務端的編譯程序內,因為編譯程序的加密可以采用更多的保護方式,加密的強度也更高。

我們首先要分析 Javascript 語言和混淆相關的特點,和現有的混淆產品的不足,然后再提出我們對 Javascript 代碼混淆的解決方案,最后是我們的 Javascript 在線混淆器。


Javascript 語言和混淆相關的特性

Javascript 是一種解釋執行的腳本語言,相對編譯類型的語言有很多自身的特性,而其中一些特性會對代碼混淆帶來很大的困難。

無法定義類的屬性和方法的名稱是否需要被混淆

Javascript 是一種基于原型的語言,沒有嚴格的類型定義。在自定義的類中,對于需要外部訪問的屬性和方法,不能進行混淆;對于內部訪問的屬性和方法,需要進行混淆;但Javascript 語言本身,無法對屬性和方法進行這樣的區分。為此我們要尋找一種變通的機制來識別屬性和方法的名稱是否需要混淆。

存在大量的系統定義的核心的和客戶端的方法和屬性不能被混淆

Javascript 語言本身定義了大量的核心的類、方法和屬性;瀏覽器中也定義了大量的客戶端的類、方法和屬性;這些類、方法和屬性都不能夠被混淆,然而這些類、方法和屬性的數量太大,無法通過枚舉來避免混淆;為此我們需要尋找一種方法來標識這些類、屬性和方法。

無法定義全局變量是否需要被混淆

全局變量是 window 對象的屬性,局部變量是函數對象的屬性;所有的局部變量都是可以和應該被混淆的,而全局變量有的需要混淆,有的不能混淆;但全局變量和局部變量的表現形式是一樣的,難以區分;而且全局變量本身更無法定義是否需要被混淆。為此我們要找到一種方法來區分不能混淆的全局變量,和需要混淆的全局變量及局部變量。

Javascript 語言的這些特點,都對代碼的混淆帶來了很大的困難,如果不解決這幾個問題,Javascript 代碼的混淆就缺少實用的價值。

 

現有 Javascript 混淆產品的問題

當我們需要混淆 Javascipt 代碼的時候,首先考察了市面上現有的產品,和一些論壇里對混淆的思路,但這些產品和思路都不能滿足我們的要求。

有一個商品化的 Javascript 混淆產品,采用了和一種 C# 混淆工具相似的混淆方式,分析了代碼里所有的標識符,對一些系統預設的標識符不混淆,對其他的進行混淆,同時提供用戶對標識符的混淆進行選擇和配置;這個產品的功能很多很復雜,但有一個很大的問題,就是預設的標識符有限,對于代碼中用到的大量的系統定義的屬性和方法,會進行混淆,為此需要自己手工配置,避免對這些屬性和方法的混淆,這對于大型的系統幾乎是一個不可能完成的任務。

有一些論壇里也討論到混淆的思路,包括一些示例,這些思路更多的是改變標識符的表現形式,有的是用編碼字符串的關聯數組替換屬性,比如將 xx.dd 替換為 xx["\x64\x64"];更復雜的是把 "\x64\x64" 之類保存到字符串數組,然后調用字符串數組作為關聯數組的下標;這種思路可以避免上面的問題,但有一個更大的問題,就是混淆是可逆的,被混淆的標識符僅僅是被轉換成了16進制的形式,可以很容易的恢復。

正是現有產品的不足,促使我們不得不研究自己的解決方案。我們的解決方案也是經過了幾個版本,一開始的版本要復雜的多,花費了很大的工作量,但結果并不理想;幾經修改才找到現有的解決方案;雖然開始的大量工作,最后幾乎都廢棄了,但沒有前面的工作,也就沒有后面的結果;所以即使您可能會認為我們的方案簡單,那也只是我們努力的結果,而不是過程;而且簡單的東西,往往是有效的。


Javascript 代碼混淆綜合解決方案

通過前面對 Javascript 的特性和相關混淆產品的分析,使我們認識到如果僅僅是在混淆器上下功夫是不夠的;因為 Javascript 語言本身對混淆的功能有很大的限制,無法解決。為此我們設計了一個綜合的解決方案,就是 Javascript 在線混淆器規則,只要是按照規則編寫的 Javascipt 代碼,都能使用 Javascript 在線混淆器混淆進行混淆。

Javascript 在線混淆器的規則并不復雜,但能夠解決 Javascript 語言本身的特性和其他混淆產品遇到的問題。

規則一、所有用 window 約束的類、變量和函數都不混淆,其他的類、變量和函數都混淆。

全局的類、變量和函數本身都是 window 的屬性,用不用 window 約束,從邏輯的角度是一樣的。但我們可以借用 window 的約束來區分對全局的類、變量和函數是否需要進行混淆。

用 window 的約束必須是前后一致的,不但包括類、變量和函數的定義,也包括類、變量和函數的調用。

局部的類、變量和函數,因為沒有 window 約束,所以都是混淆的。
類型 混淆 不混淆
類定義 function Class1(){...} window.Class1 = function(){...}
函數定義 function Method1(){...} window.Method1 = function(){...}
變量定義 var Param1 = 1; window.Param1 = 1;
生成類的實例 var object1 = new Class1(); var object1 = new window.Class1();
函數調用 Method1(); window.Method1()
變量引用 var newParam = Param1; var newParam = window.Param1;

規則二、所有以小寫字符開頭的屬性和方法都不混淆,以其他字母開頭的屬性和方法都混淆,用 window 約束的屬性和方法應用規則一。

JavaScript 核心和客戶端中有大量的系統定義的方法和屬性不能被混淆,而這些方法和屬性絕大多數都是以小寫字母開始的,本規則保證了系統定義的方法和屬性不被混淆。在 Javascript 客戶端中僅有極少數的系統定義的以大寫字符起始的方法和屬性,對于這種情況,可以采用關聯數組的方式避免被混淆,比如 object1["Method1"]();此方法也適用于第三方控件中可能會有的以大寫字符起始的方法和屬性的情況。

此規則也使我們可以在自定義的類中標識方法和屬性是否被混淆,對于需要外部調用不能混淆的方法和屬性,采用小寫字母起始,對于內部的方法和屬性,采用其他字母起始。
類型 混淆 不混淆
類方法定義 Class1.Method1 = function(){...} Class1.method1 = function(){...}
Class1["Method1"] = function(){...}
對象方法定義 Class1.prototype.Method1 = function(){...} Class1.prototype.method1 = function(){...}
Class1.prototype["Method1"] = function(){...}
類屬性定義 Class1.Prop1 = 1; Class1.prop1 = 1;
Class1["Prop1"] = 1;
對象屬性定義 object1.Prop1 = 1; object1.prop1 = 1;
object1["Prop1"] = 1;
類方法調用 Class1.Method1(); Class1.method1 ();
Class1["Method1"]();
對象方法調用 object1.Method1(); object1.method1 ();
object1["Method1"]();

Javascript 在線混淆器的核心規則就是以上兩點,另外還有幾點說明。

標識符的混淆采用 Hash 算法,不可逆

Hash 算法是不可逆的,所以不能根據混淆后的標識符,來直接推出混淆前的標識符;但 Hash 算法依賴于 .Net 系統的實現,大多數的時候,.Net 的 Hash 算法是不變的,就是同一個標識符的混淆結果是一樣的;如果能夠枚舉足夠多的標識符,仍然可能根據相同的混淆結果,知道混淆前的標識符。

如何調用混淆后的類、方法和屬性

對于混淆代碼的內部調用,只要采用相同的規則,要么都混淆,要么都不混淆,就能正確的調用。

對于混淆代碼的外部調用,可以有兩種方式,一種是不混淆,代碼內部采用不混淆的規則,外部采用不混淆的可理解的標識符調用;另一種是混淆,代碼內部采用混淆的規則,外部也采用混淆后的不可理解的標識符調用,但此方式依賴于 .Net Hash 算法的實現,在不同版本的 .Net 實現中的 Hash 算法有可能不同,以至混淆后的標識符不一致,從而導致重新混淆后,需要替換原來混淆的標識符。

為何有“清除空格,保留分號后的回車”的選項

Javascript 語法要求全局函數的結尾必須有分號或回車,如果遺漏了分號,而又清除了所有的回車,總是提示第一行缺少分號,無法定位錯誤所在;采用本選項可以有助于尋找缺少的分號的位置。

以下 Javascript 語言的保留字不混淆

break, case, catch, continue, debugger, default, delete, do, else, false, finally, for, function, if, in, instanceof, new, null, return, switch, this, throw, true, try, typeof, var, while, with

混淆器預定義了一些 window 的屬性和方法

Javascript 核心類和函數是不能被混淆的,他們實質上都是 window 的屬性和方法,按照規則應該用 window 約束,以避免被混淆;但對于 Object、Array、Date、ActiveXObject 等核心類,混淆器已經預定義不會混淆,不需要再用 window 約束。對于 alert 等 window 常用的方法和 document 等 window 常用的客戶端屬性,也有預定義。其他需要預定義的類和方法,我們會逐步添加;沒有預定義的全局類和函數,如果不能混淆,必須用 window 約束。

以下全局的類、變量和方法不混淆

ActiveXObject, alert, Array, Boolean, Date , document, Math, Number, Object, RegExp, String, window



小卓 2008-10-13 18:20 發表評論
]]>
JavaScript常用檢測腳本實例代碼http://www.aygfsteel.com/table/articles/234085.html小卓小卓Mon, 13 Oct 2008 10:17:00 GMThttp://www.aygfsteel.com/table/articles/234085.htmlhttp://www.aygfsteel.com/table/comments/234085.htmlhttp://www.aygfsteel.com/table/articles/234085.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234085.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234085.html

/*

-------------------------------------------------------------------------------

文件名稱:check.js

說明:JavaScript腳本,用于檢查網頁提交表單的輸入數據

版本:1.0

*/

 

/*

用途:校驗ip地址的格式

輸入:strIP:ip地址

返回:如果通過驗證返回true,否則返回false;

 

*/

function isIP(strIP) {

if (isNull(strIP)) return false;

var re=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g //匹配IP地址的正則表達式

if(re.test(strIP))

{

if( RegExp.$1 <256 && RegExp.$2<256 && RegExp.$3<256 && RegExp.$4<256) return true;

}

return false;

}

 

/*

用途:檢查輸入字符串是否為空或者全部都是空格

輸入:str

返回:

如果全是空返回true,否則返回false

*/

function isNull( str ){

if ( str == "" ) return true;

var regu = "^[ ]+$";

var re = new RegExp(regu);

return re.test(str);

}

 

 

/*

用途:檢查輸入對象的值是否符合整數格式

輸入:str 輸入的字符串

返回:如果通過驗證返回true,否則返回false

 

*/

function isInteger( str ){ 

var regu = /^[-]{0,1}[0-9]{1,}$/;

return regu.test(str);

}

 

/*

用途:檢查輸入手機號碼是否正確

輸入:

s:字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function checkMobile( s ){  

var regu =/^[1][3][0-9]{9}$/;

var re = new RegExp(regu);

if (re.test(s)) {

return true;

}else{

return false;

}

}

 

 

/*

用途:檢查輸入字符串是否符合正整數格式

輸入:

s:字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function isNumber( s ){  

var regu = "^[0-9]+$";

var re = new RegExp(regu);

if (s.search(re) != -1) {

return true;

} else {

return false;

}

}

 

/*

用途:檢查輸入字符串是否是帶小數的數字格式,可以是負數

輸入:

s:字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function isDecimal( str ){  

if(isInteger(str)) return true;

var re = /^[-]{0,1}(\d+)[\.]+(\d+)$/;

if (re.test(str)) {

if(RegExp.$1==0&&RegExp.$2==0) return false;

return true;

} else {

return false;

}

}

 

/*

用途:檢查輸入對象的值是否符合端口號格式

輸入:str 輸入的字符串

返回:如果通過驗證返回true,否則返回false

 

*/

function isPort( str ){ 

return (isNumber(str) && str<65536);

}

 

/*

用途:檢查輸入對象的值是否符合E-Mail格式

輸入:str 輸入的字符串

返回:如果通過驗證返回true,否則返回false

 

*/

function isEmail( str ){ 

var myReg = /^[-_A-Za-z0-9]+@([_A-Za-z0-9]+\.)+[A-Za-z0-9]{2,3}$/;

if(myReg.test(str)) return true;

return false;

}

 

/*

用途:檢查輸入字符串是否符合金額格式

格式定義為帶小數的正數,小數點后最多三位

輸入:

s:字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function isMoney( s ){  

var regu = "^[0-9]+[\.][0-9]{0,3}$";

var re = new RegExp(regu);

if (re.test(s)) {

return true;

} else {

return false;

}

}

/*

用途:檢查輸入字符串是否只由英文字母和數字和下劃線組成

輸入:

s:字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function isNumberOr_Letter( s ){//判斷是否是數字或字母

 

var regu = "^[0-9a-zA-Z\_]+$";

var re = new RegExp(regu);

if (re.test(s)) {

return true;

}else{

return false;

}

}

/*

用途:檢查輸入字符串是否只由英文字母和數字組成

輸入:

s:字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function isNumberOrLetter( s ){//判斷是否是數字或字母

 

var regu = "^[0-9a-zA-Z]+$";

var re = new RegExp(regu);

if (re.test(s)) {

return true;

}else{

return false;

}

}

/*

用途:檢查輸入字符串是否只由漢字、字母、數字組成

輸入:

value:字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function isChinaOrNumbOrLett( s ){//判斷是否是漢字、字母、數字組成

 

var regu = "^[0-9a-zA-Z\u4e00-\u9fa5]+$";  

var re = new RegExp(regu);

if (re.test(s)) {

return true;

}else{

return false;

}

}

 

/*

用途:判斷是否是日期

輸入:date:日期;fmt:日期格式

返回:如果通過驗證返回true,否則返回false

*/

function isDate( date, fmt ) {

if (fmt==null) fmt="yyyyMMdd";

var yIndex = fmt.indexOf("yyyy");

if(yIndex==-1) return false;

var year = date.substring(yIndex,yIndex+4);

var mIndex = fmt.indexOf("MM");

if(mIndex==-1) return false;

var month = date.substring(mIndex,mIndex+2);

var dIndex = fmt.indexOf("dd");

if(dIndex==-1) return false;

var day = date.substring(dIndex,dIndex+2);

if(!isNumber(year)||year>"2100" || year< "1900") return false;

if(!isNumber(month)||month>"12" || month< "01") return false;

if(day>getMaxDay(year,month) || day< "01") return false;

return true;

}

 

function getMaxDay(year,month) {

if(month==4||month==6||month==9||month==11)

return "30";

if(month==2)

if(year%4==0&&year%100!=0 || year%400==0)

return "29";

else

return "28";

return "31";

}

 

/*

用途:字符1是否以字符串2結束

輸入:str1:字符串;str2:被包含的字符串

返回:如果通過驗證返回true,否則返回false

 

*/

function isLastMatch(str1,str2)

var index = str1.lastIndexOf(str2);

if(str1.length==index+str2.length) return true;

return false;

}

 

 

/*

用途:字符1是否以字符串2開始

輸入:str1:字符串;str2:被包含的字符串

返回:如果通過驗證返回true,否則返回false

 

*/

function isFirstMatch(str1,str2)

var index = str1.indexOf(str2);

if(index==0) return true;

return false;

}

 

/*

用途:字符1是包含字符串2

輸入:str1:字符串;str2:被包含的字符串

返回:如果通過驗證返回true,否則返回false

 

*/

function isMatch(str1,str2)

var index = str1.indexOf(str2);

if(index==-1) return false;

return true;

}

 

 

/*

用途:檢查輸入的起止日期是否正確,規則為兩個日期的格式正確,

且結束如期>=起始日期

輸入:

startDate:起始日期,字符串

endDate:結束如期,字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function checkTwoDate( startDate,endDate ) {

if( !isDate(startDate) ) {

alert("起始日期不正確!");

return false;

} else if( !isDate(endDate) ) {

alert("終止日期不正確!");

return false;

} else if( startDate > endDate ) {

alert("起始日期不能大于終止日期!");

return false;

}

return true;

}

 

/*

用途:檢查輸入的Email信箱格式是否正確

輸入:

strEmail:字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function checkEmail(strEmail) {

//var emailReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;

var emailReg = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;

if( emailReg.test(strEmail) ){

return true;

}else{

alert("您輸入的Email地址格式不正確!");

return false;

}

}

 

/*

用途:檢查輸入的電話號碼格式是否正確

輸入:

strPhone:字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function checkPhone( strPhone ) {

var phoneRegWithArea = /^[0][1-9]{2,3}-[0-9]{5,10}$/;

var phoneRegNoArea = /^[1-9]{1}[0-9]{5,8}$/;

var prompt = "您輸入的電話號碼不正確!"

if( strPhone.length > 9 ) {

if( phoneRegWithArea.test(strPhone) ){

return true;

}else{

alert( prompt );

return false;

}

}else{

if( phoneRegNoArea.test( strPhone ) ){

return true;

}else{

alert( prompt );

return false;

}

 

 

}

}

 

 

/*

用途:檢查復選框被選中的數目

輸入:

checkboxID:字符串

返回:

返回該復選框中被選中的數目

 

*/

 

function checkSelect( checkboxID ) {

var check = 0;

var i=0;

if( document.all(checkboxID).length > 0 ) {

for(  i=0; i<document.all(checkboxID).length; i++ ) {

if( document.all(checkboxID).item( i ).checked  ) {

check += 1;

}

 

 

 

 

}

}else{

if( document.all(checkboxID).checked )

check = 1;

}

return check;

}

 

function getTotalBytes(varField) {

if(varField == null)

return -1;

 

var totalCount = 0;

for (i = 0; i< varField.value.length; i++) {

if (varField.value.charCodeAt(i) > 127)

totalCount += 2;

else

totalCount++ ;

}

return totalCount;

}

 

function getFirstSelectedValue( checkboxID ){

var value = null;

var i=0;

if( document.all(checkboxID).length > 0 ){

for(  i=0; i<document.all(checkboxID).length; i++ ){

if( document.all(checkboxID).item( i ).checked ){

value = document.all(checkboxID).item(i).value;

break;

}

}

} else {

if( document.all(checkboxID).checked )

value = document.all(checkboxID).value;

}

return value;

}

 

 

function getFirstSelectedIndex( checkboxID ){

var value = -2;

var i=0;

if( document.all(checkboxID).length > 0 ){

for(  i=0; i<document.all(checkboxID).length; i++ ) {

if( document.all(checkboxID).item( i ).checked  ) {

value = i;

break;

}

}

} else {

if( document.all(checkboxID).checked )

value = -1;

}

return value;

}

 

function selectAll( checkboxID,status ){

 

if( document.all(checkboxID) == null)

return;

 

if( document.all(checkboxID).length > 0 ){

for(  i=0; i<document.all(checkboxID).length; i++ ){

 

document.all(checkboxID).item( i ).checked = status;

}

} else {

document.all(checkboxID).checked = status;

}

}

 

function selectInverse( checkboxID ) {

if( document.all(checkboxID) == null)

return;

 

if( document.all(checkboxID).length > 0 ) {

for(  i=0; i<document.all(checkboxID).length; i++ ) {

document.all(checkboxID).item( i ).checked = !document.all(checkboxID).item( i ).checked;

}

} else {

document.all(checkboxID).checked = !document.all(checkboxID).checked;

}

}

 

function checkDate( value ) {

if(value=='') return true;

if(value.length!=8 || !isNumber(value)) return false; 

var year = value.substring(0,4);

if(year>"2100" || year< "1900")

return false;

 

var month = value.substring(4,6);

if(month>"12" || month< "01") return false;

 

var day = value.substring(6,8);

if(day>getMaxDay(year,month) || day< "01") return false;

 

return true; 

}

 

/*

用途:檢查輸入的起止日期是否正確,規則為兩個日期的格式正確或都為空

且結束日期>=起始日期

輸入:

startDate:起始日期,字符串

endDate:  結束日期,字符串

返回:

如果通過驗證返回true,否則返回false

 

*/

function checkPeriod( startDate,endDate ) {

if( !checkDate(startDate) ) {

alert("起始日期不正確!");

return false;

} else if( !checkDate(endDate) ) {

alert("終止日期不正確!");

return false;

} else if( startDate > endDate ) {

alert("起始日期不能大于終止日期!");

return false;

}

return true;

}

 

/*

用途:檢查證券代碼是否正確

輸入:

secCode:證券代碼

返回:

如果通過驗證返回true,否則返回false

 

*/

function checkSecCode( secCode ) {

if( secCode.length !=6 ){

alert("證券代碼長度應該為6位");

return false;

}

 

if(!isNumber( secCode ) ){

alert("證券代碼只能包含數字");

 

 

return false;

}

return true;

}

 

/****************************************************

function:cTrim(sInputString,iType)

description:字符串去空格的函數

parameters:iType:1=去掉字符串左邊的空格

 

2=去掉字符串左邊的空格

0=去掉字符串左邊和右邊的空格

return value:去掉空格的字符串

****************************************************/

function cTrim(sInputString,iType)

{

var sTmpStr = ' ';

var i = -1;

 

if(iType == 0 || iType == 1)

{

while(sTmpStr == ' ')

{

++i;

sTmpStr = sInputString.substr(i,1);

}

sInputString = sInputString.substring(i);

}

 

if(iType == 0 || iType == 2)

{

sTmpStr = ' ';

i = sInputString.length;

while(sTmpStr == ' ')

{

--i;

sTmpStr = sInputString.substr(i,1);

}

sInputString = sInputString.substring(0,i+1);

}

return sInputString;

}

 

/*

-------------------------------------------------------------------------------

說明:JavaScript腳本,驗證表單中的數據項  begin

-------------------------------------------------------------------------------

 

*/

function checkForm(objFrm){

var len = 0;

len = objFrm.elements.length;

 

var i = 0;

var objCheck;

//文本框

for(i = 0; i < len; i ++){

objCheck = objFrm.elements[i];

if(objCheck.type =="text" && !f_checkTextValid(objCheck) ){

return false;

 

 

 

}

}

//下拉框

for(i = 0; i < len; i ++){

objCheck = objFrm.elements[i];

if(objCheck.type =="select-one" && !f_checkSelectValid(objCheck) ){

return false;

 

 

 

}

}

//時間段有效

if( f_checkStartAndEndDate(objFrm) == false) return false;

 

return true;

}

function f_checkSelectValid(obj){

//alert("check select");

if(obj.options.length <= 0){

alert("下拉選框無數據!");

return false;

 

}

return true;

}

function f_checkStartAndEndDate(frm){

var len = frm.elements.length;

if(len == null && len == 0) return true;

var i=0;

var temp;

var objCheck;

var objStartDate;

var objEndDate;

//alert("start date period check");

try{

for(i=0; i< len ; i++){

objCheck = frm.elements[i];

temp = objCheck.name;

if( temp.indexOf("startDate") >0 ||temp.indexOf("beginDate")>0 )

objStartDate = objCheck;

if( temp.indexOf("endDate") > 0 )

objEndDate = objCheck;

 

}

//alert(objStartDate.value);

//alert(objEndDate.value);

if(objStartDate.value==null || objStartDate.value =="" || objStartDate.value ==null || objStartDate.value ==""){

return true;

}

return checkTwoDate(objStartDate.value, objEndDate.value);

 

//alert("end date period check");

}catch(E){}

return true;

}

 

function f_checkTextValid(obj){

//不能為空

if(obj.getAttribute("isNeed") != null){

if(f_isNotNull(obj) == false) return false;

}

//不能超過長度

if(obj.getAttribute("maxlength") != null){

if(f_checkLength(obj) == false) return false;

}

var checkType ="";

checkType = obj.getAttribute("checkType");

if(checkType==null||checkType=="") return true;

//

if (checkType.indexOf("number") >=0){

if(f_isNumber(obj) == false)  return false;

if(f_checkNumType(obj,checkType) == false)  return false;

 

}

//

if (checkType.indexOf("positive") >=0){

if(f_isNumber(obj) == false)  return false;

if(f_isPositive(obj)==false)  return false;

if(f_checkNumType(obj,checkType) == false)  return false;

 

}

if (checkType.indexOf("date") >=0){

if(f_checkDate(obj) == false) return false;

 

}

 

/*

switch(checkType){

case "number": if(f_isNumber(obj) == false) return false;break;

case "date": if(f_checkDate(obj) == false) return false;break;

default:

}

*/

return true;

}

 

function f_isNotNull(obj){

if(obj.value == ""){

f_alert(obj, " 不允許為空值!");

return false;

}

return true;

}

 

function f_isNumber(obj){

if(isNaN(obj.value)){

f_alert(obj," 應為數值類型");

return false;

 

 

}

return true;

 

}

function f_checkDate(obj) {

if(checkDate(obj.value) ==false){

f_alert(obj," 不是合法日期格式!");

return false;

 

 

}

return true;

}

 

function f_checkLength(obj){

if(getTotalBytes(obj) > Math.abs( obj.getAttribute("maxlength") ) ){

f_alert(obj," 超出長度限制!");

return false;

 

 

}

return true;

 

}

 

function  f_alert(obj,alertStr){

var fielName = obj.getAttribute("fieldName");

if(fielName == null)

fielName = "";

alert(fielName + "\n" +alertStr);

obj.select();

obj.focus();

}

 

function f_checkNumType(obj, numType){

//假設: 已經進行數字類型判斷

 

var strTemp;

var numpric;

var numLen;

var strArr;

var defaultLen = 19;

var defaultpric = 5;

 

try{

if(numType == null|| numType =="") return f_checkNumLenPrec(obj,defaultLen, defaultpric);

if(numType.indexOf("(") < 0 || numType.indexOf(")") < 0 ) return f_checkNumLenPrec(obj,defaultLen, defaultpric);

strTemp = numType.substr( numType.indexOf("(") + 1 ,numType.indexOf(")") - numType.indexOf("(") -1 );

if(strTemp == null||strTemp =="") return f_checkNumLenPrec(obj,defaultLen, defaultpric);

strArr = strTemp.split(",");

 

numLen = Math.abs( strArr[0] );

numpric = Math.abs( strArr[1] );

 

return f_checkNumLenPrec(obj,numLen, numpric);

}catch(e){

alert("in f_checkNumType = " + e);

return f_checkNumLenPrec(obj,defaultLen, defaultpric);

}

 

}

 

function f_checkNumLenPrec(obj, len, pric){

var numReg;

var value = obj.value;

var strValueTemp, strInt, strDec;

 

//alert(value + "=====" + len + "====="+ pric);

try{

 

 

 

numReg =/[\-]/;

strValueTemp = value.replace(numReg, "");

strValueTemp = strValueTemp.replace(numReg, "");

//整數

if(pric==0){

numReg =/[\.]/;

//alert(numReg.test(value));

if(numReg.test(value) == true){

f_alert(obj, "輸入必須為整數類型!");

return false;

 

}

 

 

 

}

 

if(strValueTemp.indexOf(".") < 0 ){

//alert("lennth==" + strValueTemp);

 

 

if(strValueTemp.length >( len - pric)){

f_alert(obj, "整數位不能超過"+ (len - pric) +"位");

return false;

}

 

}else{

strInt = strValueTemp.substr( 0, strValueTemp.indexOf(".") );

 

 

//alert("lennth==" + strInt);

 

 

if(strInt.length >( len - pric)){

f_alert(obj, "整數位不能超過"+ (len - pric) +"位");

return false;

}

 

 

 

strDec = strValueTemp.substr( (strValueTemp.indexOf(".")+1), strValueTemp.length );

 

 

//alert("pric==" + strDec);

 

 

if(strDec.length > pric){

f_alert(obj, "小數位不能超過"+  pric +"位");

return false;

}

 

 

}

 

return true;

}catch(e){

alert("in f_checkNumLenPrec = " + e);

return false;

}

 

}

 

function f_isPositive(obj){

var numReg =/[\-]/;

if(numReg.test(obj.value) == true){

f_alert(obj, "必須為正數!");

return false;

}

return true;

 

}

 

 

/*

function selectedCheckboxCount(form)

功能說明:對Form中選中的可選項計數

 

參數說明:

form:指定的表單

*/

function selectedCheckboxCount(form){

var length =0;

var i=0;

var count =0;

eles = form.elements;

while(i<eles.length){

obj= eles.item(i);

//type = obj.attributes.item("type").nodeValue;

 

type = obj.type;

if(type == "checkbox"){

if(obj.checked){

count++;

}

}

i++;

}

return count;

}

 

//得到字節長度

function getByteLen(str)

{

var l = str.length;

var n = l;

for ( var i=0; i<l; i++ )

 

if ( str.charCodeAt(i) <0 || str.charCodeAt(i) >255 )

n=n+1;

return n

}

 

/*

說明:

1.清除表格中的數據(0.0 和 0)

2.如果cell中沒有數據,則自動加上一個空格

3.清除空白行的checkbox

 

參數:

clearzero:是否清除"0"、"0.0",false不清除、true清除(默認為true)

tablename:要清除的表格名字,默認為sortTable

*/

function clear_table(clearzero,tablename)

{

var tobject;

if(tablename==null)

tobject=gmobj("sortTable");

else

tobject=gmobj(tablename);

//如果table未定義,則不進行過濾

 

if(tobject==null)

return;

 

 

//如果函數調用參數為空,表示要清除0、0.0;反之,不要清除0、0.0。

var clear = (clearzero==null)?true:clearzero;

 

//清除0、0.0,填補空格

var rows = tobject.rows;

var j=0;

for(var i=0;i<rows.length;i++)

{

//取得第一個cell的屬性clear,如果為1,表示該行沒有數據,則清除該行所有數據

 

while(tobject.rows[i].cells[j] != null)

{

if(clear)

{

if(tobject.rows[i].cells[j].innerHTML==0 ||tobject.rows[i].cells[j].innerHTML==0.0||tobject.rows[i].cells[j].innerHTML=="")

tobject.rows[i].cells[j].innerText=" ";

}

else

{

if (tobject.rows[i].cells[j].innerHTML=="")

tobject.rows[i].cells[j].innerText=" ";

}

j++;

}

j=0;

 

}

return true;

}

 

function gmobj(mtxt)  /* Get object by object name */

{

if (document.getElementById) {

m=document.getElementById(mtxt);

} else if (document.all) {

m=document.all[mtxt];

} else if (document.layers) {

m=document.layers[mtxt];

}

return m;

}

/*

-------------------------------------------------------------------------------

說明:JavaScript腳本,驗證表單中的數據項  end

-------------------------------------------------------------------------------
*/
/*
用途:檢查輸入字符串是否是帶小數的數字格式,可以是負數(并且滿足規定的精度)

輸入:str:字符串
l:總位數
d:小數點后位數
返回:
如果通過驗證返回true,否則返回false
*/
function isDecimal( str,l,d ){  
if(isInteger(str)) {
if (l==null)  return true;
if (str<0) l--;
if (str.length<=l) return true;
}
var re = /^[-]{0,1}(\d+)[\.]+(\d+)$/;
if (re.test(str)) {
if (l==null)  return true;
if (d==null) d=0;
if(RegExp.$1==0&&RegExp.$2==0) return false;
if (RegExp.$1.length+RegExp.$2.length<=l
&& RegExp.$2.length<=d)  return true;
}
return false;
}
onclick="isNull('Co.PageForm.CompetitorName');"



小卓 2008-10-13 18:17 發表評論
]]>
javascript用回車鍵實現Tab鍵功能http://www.aygfsteel.com/table/articles/234081.html小卓小卓Mon, 13 Oct 2008 10:10:00 GMThttp://www.aygfsteel.com/table/articles/234081.htmlhttp://www.aygfsteel.com/table/comments/234081.htmlhttp://www.aygfsteel.com/table/articles/234081.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234081.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234081.html很多羅嗦的客戶,喜歡提出這些需求!其實實現也不難!代碼如下:

我前段時間看了MS的ASP.NET講座,在里面談到了如何讓"回車鍵"使文本框的焦點一個個下移.其中提了三種方法,最好的一種是這樣的:

 用客戶端腳本在頁面添加document的onkeydown事件,讓頁面在接受到回車事件后,進行Tab鍵的功能,即只要把event的keyCode由13變為9

 VBScript代碼:

 <script language="vbscript">

 sub document_onkeydown

    if event.keyCode=13 then

      event.keyCode=9

   end if

 end sub

</script>

Javascript代碼如下:

<script language="javascript" for="document" event="onkeydown">

<!--

  if(event.keyCode==13)

     event.keyCode=9;

-->

</script>

這樣的處理方式,可以實現焦點往下移動,但對于按鈕也起同樣的作用,一般的客戶在輸入完資料以后,跳到按鈕后,最好能直接按"回車"進行數據的提交.因此,對上面的方法要進行一下修改,應該對于"提交"按鈕不進行焦點轉移.而直接激活提交.

 

因此我對上面的代碼進行了一個修改,即判斷事件的"源",是否為提交按鈕,代碼如下:

<script language="javascript" for="document" event="onkeydown">

<!--

  if(event.keyCode==13 && event.srcElement.type!='button' && event.srcElement.type!='submit' && event.srcElement.type!='reset' && event.srcElement.type!='textarea' && event.srcElement.type!='')

     event.keyCode=9;

-->

</script>

判斷是否為button, 是因為在HTML上會有type="button"

判斷是否為submit,是因為HTML上會有type="submit"

判斷是否為reset,是因為HTML上的"重置"應該要被執行

判斷是否為空,是因為對于HTML上的"<a>鏈接"也應該被執行,這種情況發生的情況不多,可以使用"tabindex=-1"的方式來取消鏈接獲得焦點.



小卓 2008-10-13 18:10 發表評論
]]>
JavaScript判斷數字的合法性http://www.aygfsteel.com/table/articles/234079.html小卓小卓Mon, 13 Oct 2008 10:08:00 GMThttp://www.aygfsteel.com/table/articles/234079.htmlhttp://www.aygfsteel.com/table/comments/234079.htmlhttp://www.aygfsteel.com/table/articles/234079.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234079.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234079.html//驗證是否為數字
   function isNumber(oNum)
   {
  if(!oNum) return false;
  var strP=/^\d+(\.\d+)?$/;
  if(!strP.test(oNum)) return false;
  try{
  if(parseFloat(oNum)!=oNum) return false;
  }
  catch(ex)
  {
   return false;
  }
  return true;
   }


小卓 2008-10-13 18:08 發表評論
]]>
防止代碼復制http://www.aygfsteel.com/table/articles/234076.html小卓小卓Mon, 13 Oct 2008 10:07:00 GMThttp://www.aygfsteel.com/table/articles/234076.htmlhttp://www.aygfsteel.com/table/comments/234076.htmlhttp://www.aygfsteel.com/table/articles/234076.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234076.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234076.html

//插入 document.body.oncopy event事件中
//或者 <body>的"oncopy"屬性
function copyCode()
{
 try
 {
  var range = document.selection.createRange();
  if (document.selection.type != "none")
  {
   var parent = range.parentElement();
   var parentName = parent.tagName;
   if (parentName != null)
   {
    if (parentName.toLowerCase() == "pre")
    {
     // Replace superfluous <br> tags in a <pre> block.
     var re = /<br>/gi;
     var code = range.htmlText.replace(re, "\r\n");

     // Replace non-breaking spaces.
     re = /&nbsp;/gi;
     code = code.replace(re, " ");

     // Replace & characters.
     re = /&amp;/gi;
     code = code.replace(re, "&");

     // Replace < characters.
     re = /&lt;/gi;
     code = code.replace(re, "<");

     // Replace > characters.
     re = /&gt;/gi;
     code = code.replace(re, ">");
     
     // CJM: Remove colorization
     re = /<\/?span([^>])*>/gi;
     code = code.replace(re, "");

     if (code != null)
     {
      window.event.returnValue = false;
      window.clipboardData.setData("Text", code);
     }
    }
   }
  }
 }
 catch(e) {}
}

<HTML>
<HEAD>
<TITLE>防復制 </TITLE>
<SCRIPT language=javascript src="/blog/js/oncopy.js">
</SCRIPT>

<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="feiyun">
<META NAME="Keywords" CONTENT="nocopy">
<META NAME="Description" CONTENT="no copy">
</HEAD>
<BODY  oncopy="return copyCode();" >
<FONT COLOR="#FF0000">防代碼復制,不信你試試(只防止代碼復制,其他可以復制)</FONT><BR>
<TABLE>
<TR>
 <TD>aa</TD>
 <TD>bb</TD>
 <TD>cc</TD>
</TR>
<TR>
 <TD>dd</TD>
 <TD>ee</TD>
 <TD>ff</TD>
</TR>
</TABLE>

<PRE lang=vbscript>&lt;%
<SPAN class=vb-statement>option</SPAN> <SPAN class=vb-statement>explicit</SPAN>
<SPAN class=vb-statement>dim</SPAN> fso
<SPAN class=vb-statement>set</SPAN> fso = createobject(<SPAN class=vb-string>&quot;scripting.filesystemobject&quot;</SPAN>)
<SPAN class=vb-statement>dim</SPAN> asplines, jslines, aspbytes, jsbytes, aspwords
iterate(server.mappath(<SPAN class=vb-string>&quot;/web_api&quot;</SPAN>))
response.write <SPAN class=vb-string>&quot;ASP:
Total Lines Coded: &quot;</SPAN> &amp; asplines &amp; <SPAN class=vb-string>&quot;
Total Bytes: &quot;</SPAN> &amp; aspbytes &amp; <SPAN class=vb-string>&quot;
Total Individual Elements (words) Typed: &quot;</SPAN> &amp; aspwords
response.write <SPAN class=vb-string>&quot;
JScript:
Total Lines Coded: &quot;</SPAN> &amp; jslines &amp; <SPAN class=vb-string>&quot;
&quot;</SPAN> &amp; <SPAN class=vb-string>&quot;Total Bytes: &quot;</SPAN> &amp; jsbytes
<SPAN class=vb-statement>function</SPAN> iterate(path)
    <SPAN class=vb-statement>dim</SPAN> folder, folders, files, file, ts, txt, arr, f
    <SPAN class=vb-statement>set</SPAN> folder = fso.getfolder(path)
    <SPAN class=vb-statement>set</SPAN> files = folder.files
    <SPAN class=vb-statement>dim</SPAN> rx, c
    <SPAN class=vb-statement>set</SPAN> rx = <SPAN class=vb-keyword>new</SPAN> regexp
    rx.ignorecase = <SPAN class=vb-keyword>true</SPAN>
    rx.global = <SPAN class=vb-keyword>true</SPAN>
    rx.pattern = <SPAN class=vb-string>&quot;  +&quot;</SPAN>
    <SPAN class=vb-statement>for</SPAN> <SPAN class=vb-statement>each</SPAN> file in files
        <SPAN class=vb-statement>if</SPAN> right(file.name,<SPAN class=vb-literal>4</SPAN>)=<SPAN class=vb-string>&quot;.asp&quot;</SPAN> <SPAN class=vb-keyword>or</SPAN> right(file.name,<SPAN class=vb-literal>3</SPAN>)=<SPAN class=vb-string>&quot;.js&quot;</SPAN> <SPAN class=vb-statement>then</SPAN>
            <SPAN class=vb-statement>set</SPAN> ts = file.openastextstream
            <SPAN class=vb-statement>if</SPAN> ts.atendofstream <SPAN class=vb-statement>then</SPAN> txt = <SPAN class=vb-string>&quot;&quot;</SPAN> <SPAN class=vb-statement>else</SPAN> txt = ts.readall
            ts.close
            txt = rx.replace(txt,<SPAN class=vb-string>&quot; &quot;</SPAN>)
            txt = replace(txt,vbcrlf&amp;vbcrlf,vbcrlf)
            arr = split(replace(txt,vbcrlf,<SPAN class=vb-string>&quot; &quot;</SPAN>),<SPAN class=vb-string>&quot; &quot;</SPAN>)
            aspwords = aspwords + ubound(arr)
            arr = split(txt,vbcrlf)
            <SPAN class=vb-statement>if</SPAN> right(file.name,<SPAN class=vb-literal>4</SPAN>)=<SPAN class=vb-string>&quot;.asp&quot;</SPAN> <SPAN class=vb-statement>then</SPAN>
                asplines = asplines + ubound(arr)
                aspbytes = aspbytes + len(txt)
            <SPAN class=vb-statement>else</SPAN>
                jslines = jslines + ubound(arr)
                jsbytes = jsbytes + len(txt)
            <SPAN class=vb-statement>end</SPAN> <SPAN class=vb-statement>if</SPAN>
        <SPAN class=vb-statement>end</SPAN> <SPAN class=vb-statement>if</SPAN>
    <SPAN class=vb-statement>next</SPAN>
    <SPAN class=vb-statement>set</SPAN> folders = folder.subfolders
    <SPAN class=vb-statement>for</SPAN> <SPAN class=vb-statement>each</SPAN> f in folders
        iterate f.path
    <SPAN class=vb-statement>next</SPAN>
<SPAN class=vb-statement>end</SPAN> <SPAN class=vb-statement>function</SPAN>
%&gt;</PRE>

</BODY>
</HTML>



小卓 2008-10-13 18:07 發表評論
]]>
用JavaScript腳本將當地時間轉換成其它時區http://www.aygfsteel.com/table/articles/234072.html小卓小卓Mon, 13 Oct 2008 10:00:00 GMThttp://www.aygfsteel.com/table/articles/234072.htmlhttp://www.aygfsteel.com/table/comments/234072.htmlhttp://www.aygfsteel.com/table/articles/234072.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234072.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234072.html毫無疑問,用JavaScript腳本可以通過直接查看用戶的時鐘,方便地在網頁上顯示本地時間。但是,如果你想顯示不同地區的時間—--例如,如果你的本部在別的國家,你想查看“本國”時間而非當地時間,又該怎么辦呢?

要做到這一點,必須進行各種時間計算才能將當地時間轉換為目的時間。本文將解釋如何進行這些計算。

第一步:

事情的第一步是獲得當地時間。在JavaScript中,這無疑可以通過初始化一個Data()對象來輕松完成。

// create Date object for current location

d = new Date();

通過調用Data()對象的getTime()方法,即可顯示1970年1月1日后到此當時時間之間的毫秒數。

// convert to msec since Jan 1 1970

localTime = d.getTime();

第二步:

下一步,通過Data()對象的getTimezoneOffset()方法來找出當地時間偏移值。在缺省情況下,此方法以分鐘顯示時區偏移值結果,因此在早先的計算中要將此值轉換成毫秒。

// obtain local UTC offset and convert to msec

localOffset = d.getTimezoneOffset() * 60000;

注意,getTimezoneOffset()方法的負返回值表示當地時間在全球標準時間(UTC)之前,而正返回值則表示當地時間在全球標準時間(UTC)之后。

注意:萬一你想知道我是如何得到60000這個倍增因數的,記住1000毫秒等于一秒,而一分鐘等于60秒。因此 ,將分鐘轉換成毫秒,要用60乘以1000等于60000。

第三步

將本地時間與本地時區偏移值相加得到當前國際標準時間(UTC)。

// obtain UTC time in msec

utc = localTime + localOffset;

這里,變量utc包含當前國際標準時間(UTC)。但是,此時間以1970年1月1日到現在所含有的毫秒數來表示。暫時讓它這樣表示,因為還要進行一些計算。

第四步

得到國際標準時間(UTC)后,再獲得目標城市的國際標準時間(UTC)小時偏移值,把它轉換成毫秒,再加上國際標準時間(UTC)。

// obtain and add destination's UTC time offset

// for example, Bombay

// which is UTC + 5.5 hours

offset = 5.5;

bombay = utc + (3600000*offset);

注意:萬一你想知道我是如何得到3600000這個倍增因數的,記住1000毫秒等于一秒,而一小時等于3600秒。因此 ,將小時轉換成毫秒,要用3600乘以1000等于3600000。

此時,變量bombay包含印度孟買城的當地時間。此當地時間以1970年1月1日到現在所含有的毫秒數來表示。顯然,這不是很合理,因此我們還要進行一些計算。

第五步

通過初始化一個新的Data()對象,并調用此對象的toLocalString()方法,我們將前一步中計算得到的時間值轉換成一個大家可以看得懂的日期/時間字符串。

// convert msec value to date string

nd = new Date(bombay);

document.writeln("Bombay time is " + nd.toLocaleString() + "<br>");

這樣轉換就完成了!

總結

理解上面的步驟后,我們再看一看這段腳本(列表A),它建立一個緊湊,自定義的函數calcTime()來執行所有的計算并返回一個時間值。

列表A

<html>

<head>

<script language="JavaScript">

// function to calculate local time

// in a different city

// given the city's UTC offset

function calcTime(city, offset) {

// create Date object for current location

d = new Date();

 

// convert to msec

// add local time zone offset

// get UTC time in msec

utc = d.getTime() + (d.getTimezoneOffset() * 60000);

 

// create new Date object for different city

// using supplied offset

nd = new Date(utc + (3600000*offset));

 

// return time as a string

return "The local time in " + city + " is " + nd.toLocaleString();

}

// get Bombay time

alert(calcTime('Bombay', '+5.5'));

// get Singapore time

alert(calcTime('Singapore', '+8'));

// get London time

alert(calcTime('London', '+1'));

</script>

</head>

<body>

</body>

</html>

這里,函數calcTime()接受一個城市名及它的國際標準時間(UTC)偏移值(按小時計)。然后內部執行所有上面描述的計算,并返回一個包含此城市當地時間的字符串。

以下是列表A輸出內容的一些樣本。

孟買當地時間為2005年8月1日,星期一下午4時43分51秒

新加坡當地時間為2005年8月1日,星期一下午7時13分51秒

倫敦當地時間為2005年8月1日,星期一下午12時13分51秒

下次你坐下來為你的網頁編寫時區腳本時,這段腳本有望節省你的一些時間。享受一下!!



小卓 2008-10-13 18:00 發表評論
]]>
JavaScript腳本語言描述:document 文擋對象詳解http://www.aygfsteel.com/table/articles/234071.html小卓小卓Mon, 13 Oct 2008 09:58:00 GMThttp://www.aygfsteel.com/table/articles/234071.htmlhttp://www.aygfsteel.com/table/comments/234071.htmlhttp://www.aygfsteel.com/table/articles/234071.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234071.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234071.html注:頁面上元素name屬性和JavaScript引用的名稱必須一致包括大小寫
   否則會提示你一個錯誤信息 "引用的元素為空或者不是對象"
---------------------------------------------------------------------

對象屬性
document.title             //設置文檔標題等價于HTML的<title>標簽
document.bgColor           //設置頁面背景色
document.fgColor           //設置前景色(文本顏色)
document.linkColor         //未點擊過的鏈接顏色
document.alinkColor        //激活鏈接(焦點在此鏈接上)的顏色
document.vlinkColor        //已點擊過的鏈接顏色
document.URL               //設置URL屬性從而在同一窗口打開另一網頁
document.fileCreatedDate   //文件建立日期,只讀屬性
document.fileModifiedDate  //文件修改日期,只讀屬性
document.fileSize          //文件大小,只讀屬性
document.cookie            //設置和讀出cookie
document.charset           //設置字符集 簡體中文:gb2312
---------------------------------------------------------------------
對象方法
document.write()                  //動態向頁面寫入內容
document.createElement(Tag)       //創建一個html標簽對象
document.getElementById(ID)       //獲得指定ID值的對象
document.getElementsByName(Name)  //獲得指定Name值的對象
---------------------------------------------------------------------

images集合(頁面中的圖象)

a)通過集合引用
document.images             //對應頁面上的<img>標簽
document.images.length      //對應頁面上<img>標簽的個數
document.images[0]          //第1個<img>標簽          
document.images[i]          //第i-1個<img>標簽

b)通過nane屬性直接引用
<img name="oImage">
document.images.oImage      //document.images.name屬性

c)引用圖片的src屬性
document.images.oImage.src  //document.images.name屬性.src

d)創建一個圖象
var oImage
oImage = new Image()
document.images.oImage.src="/1.jpg"
同時在頁面上建立一個<img>標簽與之對應就可以顯示

<html>
<img name=oImage>
<script language="javascript">
   var oImage
   oImage = new Image()
   document.images.oImage.src="/1.jpg"
</script>
</html>

----------------------------------------------------------------------

forms集合(頁面中的表單)

a)通過集合引用
document.forms                 //對應頁面上的<form>標簽
document.forms.length          //對應頁面上<form>標簽的個數
document.forms[0]              //第1個<form>標簽
document.forms[i]              //第i-1個<form>標簽
document.forms[i].length       //第i-1個<form>中的控件數
document.forms[i].elements[j]  //第i-1個<form>中第j-1個控件

b)通過標簽name屬性直接引用
<form name="Myform"><input name="myctrl"></form>
document.Myform.myctrl         //document.表單名.控件名

-----------------------------------------------------------------------
<html>
<!--Text控件相關Script-->
<form name="Myform">
<input type="text" name="oText">
<input type="password" name="oPswd">
<form>
<script language="javascript">
//獲取文本密碼框的值
document.write(document.Myform.oText.value)
document.write(document.Myform.oPswd.value)
</script>
</html>
-----------------------------------------------------------------------
<html>
<!--Select控件相關Script-->
<form name="Myform">
<select name="oSelect">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</form>

<script language="javascript">
   //遍歷select控件的option項
   var length
   length=document.Myform.oSelect.length
   for(i=0;i<length;i++)
   document.write(document.Myform.oSelect[i].value)
</script>

<script language="javascript">
   //遍歷option項并且判斷某個option是否被選中
   for(i=0;i<document.Myform.oSelect.length;i++){
   if(document.Myform.oSelect[i].selected!=true)
   document.write(document.Myform.oSelect[i].value)
   else
   document.write("<font color=red>"+document.Myform.oSelect[i].value+"</font>")  
   }
</script>

<script language="javascript">
   //根據SelectedIndex打印出選中的option
   //(0到document.Myform.oSelect.length-1)
   i=document.Myform.oSelect.selectedIndex
   document.write(document.Myform.oSelect[i].value)
</script>

<script language="javascript">
   //動態增加select控件的option項
   var oOption = document.createElement("OPTION");
   oOption.text="4";
   oOption.value="4";
   document.Myform.oSelect.add(oOption);
</script>
<html>
-----------------------------------------------------------------------
<Div id="oDiv">Text</Div>
document.all.oDiv                       //引用圖層oDiv
document.all.oDiv.style                
document.all.oDiv.style.display=""      //圖層設置為可視
document.all.oDiv.style.display="none"  //圖層設置為隱藏
/*document.all表示document中所有對象的集合
只有ie支持此屬性,因此也用來判斷瀏覽器的種類*/



小卓 2008-10-13 17:58 發表評論
]]>
javascript事件查詢綜合http://www.aygfsteel.com/table/articles/234070.html小卓小卓Mon, 13 Oct 2008 09:54:00 GMThttp://www.aygfsteel.com/table/articles/234070.htmlhttp://www.aygfsteel.com/table/comments/234070.htmlhttp://www.aygfsteel.com/table/articles/234070.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234070.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234070.html

click() 對象.click() 使對象被點擊。
closed 對象.closed 對象窗口是否已關閉true/false
clearTimeout(對象) 清除已設置的setTimeout對象
clearInterval(對象) 清除已設置的setInterval對象
confirm("提示信息") 彈出確認框,確定返回true取消返回false
cursor:樣式 更改鼠標樣式 hand crosshair text wait help default auto e/s/w/n-resize

event.clientX 返回最后一次點擊鼠標X坐標值;
event.clientY 返回最后一次點擊鼠標Y坐標值;
event.offsetX 返回當前鼠標懸停X坐標值
event.offsetY 返回當前鼠標懸停Y坐標值

document.write(document.lastModified) 網頁最后一次更新時間
document.ondblclick=x 當雙擊鼠標產生事件
document.onmousedown=x 單擊鼠標鍵產生事件

document.body.scrollTop; 返回和設置當前豎向滾動條的坐標值,須與函數配合,
document.body.scrollLeft; 返回和設置當前橫向滾動務的坐標值,須與函數配合,
document.title document.title="message"; 當前窗口的標題欄文字
document.bgcolor document.bgcolor="顏色值"; 改變窗口背景顏色
document.Fgcolor document.Fgcolor="顏色值"; 改變正文顏色
document.linkcolor document.linkcolor="顏色值"; 改變超聯接顏色
document.alinkcolor document.alinkcolor="顏色值"; 改變正點擊聯接的顏色
document.VlinkColor document.VlinkColor="顏色值"; 改變已訪問聯接的顏色
document.forms.length 返回當前頁form表單數
document.anchors.length 返回當前頁錨的數量
document.links.length 返回當前頁聯接的數量
document.onmousedown=x 單擊鼠標觸發事件
document.ondblclick=x 雙擊鼠標觸發事件
defaultStatus window.status=defaultStatus; 將狀態欄設置默認顯示

function function xx(){...} 定義函數
isNumeric 判斷是否是數字
innerHTML xx=對象.innerHTML 輸入某對象標簽中的html源代碼
innerText divid.innerText=xx 將以div定位以id命名的對象值設為XX

location.reload(); 使本頁刷新,target可等于一個刷新的網頁

Math.random() 隨機涵數,只能是0到1之間的數,如果要得到其它數,可以為*10,再取整
Math.floor(number) 將對象number轉為整數,舍取所有小數
Math.min(1,2) 返回1,2哪個小
Math.max(1,2) 返回1,2哪個大

navigator.appName 返回當前瀏覽器名稱
navigator.appVersion 返回當前瀏覽器版本號
navigator.appCodeName 返回當前瀏覽器代碼名字
navigator.userAgent 返回當前瀏覽器用戶代標志

onsubmit onsubmit="return(xx())" 使用函數返回值
opener opener.document.對象 控制原打開窗體對象

prompt xx=window.prompt("提示信息","預定值"); 輸入語句
parent parent.框架名.對象 控制框架頁面

return return false 返回值
random 隨機參數(0至1之間)
reset() form.reset(); 使form表單內的數據重置

split("") string.split("") 將string對象字符以逗號隔開
submit() form對象.submit() 使form對象提交數據

String對象的 charAt(x)對象 反回指定對象的第多少位的字母
lastIndexOf("string") 從右到左詢找指定字符,沒有返回-1
indexOf("string") 從左到右詢找指定字符,沒有返回-1
LowerCase() 將對象全部轉為小寫
UpperCase() 將對象全部轉為大寫
substring(0,5) string.substring(x,x) 返回對象中從0到5的字符
setTimeout("function",time) 設置一個超時對象
setInterval("function",time) 設置一個超時對象

toLocaleString() x.toLocaleString() 從x時間對象中獲取時間,以字符串型式存在
typeof(變量名) 檢查變量的類型,值有:String,Boolean,Object,Function,Underfined

window.event.button==1/2/3 鼠標鍵左鍵等于1右鍵等于2兩個鍵一起按為3
window.screen.availWidth 返回當前屏幕寬度(空白空間)
window.screen.availHeight 返回當前屏幕高度(空白空間)
window.screen.width 返回當前屏幕寬度(分辨率值)
window.screen.height 返回當前屏幕高度(分辨率值)
window.document.body.offsetHeight; 返回當前網頁高度
window.document.body.offsetWidth; 返回當前網頁寬度
window.resizeTo(0,0) 將窗口設置寬高
window.moveTo(0,0) 將窗口移到某位置
window.focus() 使當前窗口獲得焦點
window.scroll(x,y) 窗口滾動條坐標,y控制上下移動,須與函數配合
window.open() window.open("地址","名稱","屬性")
屬性:toolbar(工具欄),location(地址欄),directions,status(狀態欄),
menubar(菜單欄),scrollbar(滾動條),resizable(改變大小), width(寬),height(高),fullscreen(全 屏),scrollbars(全屏時無滾動條無參 數,channelmode(寬屏),left(打開窗口x坐標),top(打開窗口y坐標)
window.location = 'view-source:' + window.location.href 應用事件查看網頁源代碼;

a=new Date(); //創建a為一個新的時期對象
y=a.getYear(); //y的值為從對象a中獲取年份值 兩位數年份
y1=a.getFullYear(); //獲取全年份數 四位數年份
m=a.getMonth(); //獲取月份值
d=a.getDate(); //獲取日期值
d1=a.getDay(); //獲取當前星期值
h=a.getHours(); //獲取當前小時數
m1=a.getMinutes(); //獲取當前分鐘數
s=a.getSeconds(); //獲取當前秒鐘數

對象.style.fontSize="文字大小";
單位:mm/cm/in英寸/pc帕/pt點/px象素/em文字高
1in=1.25cm
1pc=12pt
1pt=1.2px(800*600分辯率下)

文本字體屬性:
fontSize大小
family字體
color顏色
fontStyle風格,取值為normal一般,italic斜體,oblique斜體且加粗
fontWeight加粗,取值為100到900不等,900最粗,light,normal,bold
letterSpacing間距,更改文字間距離,取值為,1pt,10px,1cm
textDecoration:文字修飾;取值,none不修飾,underline下劃線,overline上劃線
background:文字背景顏色,
backgroundImage:背景圖片,取值為圖片的插入路徑

點擊網頁正文函數調用觸發器:

1.onClick 當對象被點擊
2.onLoad 當網頁打開,只能書寫在body中
3.onUnload 當網頁關閉或離開時,只能書寫在body中
4.onmouseover 當鼠標懸于其上時
5.onmouseout 當鼠標離開對象時
6.onmouseup 當鼠標松開
7.onmousedown 當鼠標按下鍵
8.onFocus 當對象獲取焦點時
9.onSelect 當對象的文本被選中時
10.onChange 當對象的內容被改變
11.onBlur 當對象失去焦點
onsubmit=return(ss())表單調用時返回的值

直線 border-bottom:1x solid black
虛線 border-bottom:1x dotted black
點劃線 border-bottom:2x dashed black
雙線 border-bottom:5x double black
槽狀 border-bottom:1x groove black
脊狀 border-bottom:1x ridge black

1.邊緣高光glow(color=顏色,strength=亮光大小)



小卓 2008-10-13 17:54 發表評論
]]>
javascript驗證給定的日期的合法性http://www.aygfsteel.com/table/articles/234069.html小卓小卓Mon, 13 Oct 2008 09:53:00 GMThttp://www.aygfsteel.com/table/articles/234069.htmlhttp://www.aygfsteel.com/table/comments/234069.htmlhttp://www.aygfsteel.com/table/articles/234069.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234069.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234069.html

<script language="javascript">

//驗證給定的日期是否合法   ,參數格式要求:yyyy-mm-dd 可以根據情況更改正則表達式
function isDate(oStartDate)
{
    //對日期格式進行驗證 要求為2000-2099年  格式為 yyyy-mm-dd 并且可以正常轉換成正確的日期
    var pat_hd=/^20\d{2}-((0[1-9]{1})|(1[0-2]{1}))-((0[1-9]{1})|([1-2]{1}[0-9]{1})|(3[0-1]{1}))$/;
 
 try{
     if(!pat_hd.test(oStartDate)){throw "日期非法!";}
  var arr_hd=oStartDate.split("-");
  var dateTmp;
  dateTmp= new Date(arr_hd[0],parseFloat(arr_hd[1])-1,parseFloat(arr_hd[2]));
  if(dateTmp.getFullYear()!=parseFloat(arr_hd[0]) || dateTmp.getMonth()!=parseFloat(arr_hd[1]) -1 || dateTmp.getDate()!=parseFloat(arr_hd[2]))
  {
   throw "日期非法!";
  }
 }
 catch(ex)
 {
  if(ex.description)
   {return false;}
   else
    {return false;}
 }
 return true;
}

//調用

alert(isDate("2005-12-12"));
alert(isDate("2004-13-30"));
alert(isDate("2005-12-32"));
alert(isDate("2005-02-30"));

</script>



小卓 2008-10-13 17:53 發表評論
]]>
實現一個日期下拉菜單http://www.aygfsteel.com/table/articles/234068.html小卓小卓Mon, 13 Oct 2008 09:50:00 GMThttp://www.aygfsteel.com/table/articles/234068.htmlhttp://www.aygfsteel.com/table/comments/234068.htmlhttp://www.aygfsteel.com/table/articles/234068.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234068.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234068.html

這篇文章的主旨是弄清楚如何根據實際需求實現一個聯動菜單以及聯動菜單的原理,實例是實現一個日期選擇下拉菜單。本文調試環境為IE6/firefox1.5。

首先來分析一下日期下拉菜單的需求。建議大家在寫任何程序的時候都應該在動手編程之前想清楚自己需要些什么,這樣編程才有效率。

年份: 一般來說有一個有效年份,比如說1900年至當前年份才是為效的,這個要根據實際需求來確定,如果是該下拉菜單是用來選擇出生年月日還得把最大的年份減到一定的數目,如果有人的生日選擇了2005年(即當前的年份),那是不正常的。

月份:沒有什么特殊需求,不管是哪一年都是有十二個月。

天數:每個月的天數都可能是不定的,當然這可以根據一定的算法求出來,而它的根據就是當前選擇的年份和月份。月份都有一個固定的天數,即一、三、五、七、八、十、十二月是三十一天,而四、六、九、十一月是三十天,二月份要根據當年是否為閏年判斷是二十八天還是二十九天。求當月的天數我提出一個比較簡單的算法,可以只根據當前的年份和月份就可以求出當月的天數,這會在后邊講一講思路并將其實現。

好了,現在我們來具體實現這個日期聯動下拉菜單。

聯動下拉菜單是以兩個或多個select元素為單位的,為了讓這些菜單更多緊密的工作,我們可以實現一個類用來管理它們的初始化、事件,在這里就使用DateSelector為類名,它有三個屬性,分別為年、月、日的下拉菜單,而這三個select元素是由構造函數的參數傳進來的,另外為了更靈活地使用它,我們還可以再給DateSelector類的構造函數增加一個(Date對象)或三個參數(int數值),表示初始化的年月日。由于參數個數不定,我們可以不將另外增加的參數寫入參數表里,而是在運行時判斷arguments對象的length屬性來執行不同的操作。arguments對象存儲了當前函數的參數信息,可以查閱一下相關的資料比如說《Windows腳本技術》。

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>如何實現一個日期下拉菜單</title>
<script type="text/javascript">
function DateSelector(selYear, selMonth, selDay)
{
    this.selYear = selYear;
    this.selMonth = selMonth;
    this.selDay = selDay;
}
</script>
</head>
<body>
</body>
</html>

接下來開始對聯動菜單進行初始化,首先是年份,我們可以給類增加一個MinYear屬性表示最小的年份,再增加一個MaxYear表示最大的年份,實現一個InitYearSelect方法初始化年份,實現一個InitMonthSelect方法初始化月份。由于這幾個屬性和方法的思路都是很簡單,就不一一講解,看看代碼是怎么寫的應該就能夠明白,如果對類方面有不清楚有地方可以參考我發表在無憂腳本另一篇文章《由淺到深了解JavaScript類》。

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>如何實現一個日期下拉菜單</title>
<script type="text/javascript">
function DateSelector(selYear, selMonth, selDay)
{
    this.selYear = selYear;
    this.selMonth = selMonth;
    this.selDay = selDay;
    this.InitYearSelect();
    this.InitMonthSelect();
}

// 增加一個最大年份的屬性
DateSelector.prototype.MinYear = 1900;

// 增加一個最大年份的屬性
DateSelector.prototype.MaxYear = (new Date()).getFullYear();

// 初始化年份
DateSelector.prototype.InitYearSelect = function()
{
    // 循環添加OPION元素到年份select對象中
    for(var i = this.MaxYear; i >= this.MinYear; i--)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到年份select對象
        this.selYear.appendChild(op);
    }
}

// 初始化月份
DateSelector.prototype.InitMonthSelect = function()
{
    // 循環添加OPION元素到月份select對象中
    for(var i = 1; i < 13; i++)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到月份select對象
        this.selMonth.appendChild(op);
    }
}
</script>
</head>
<body>
<select id="selYear"></select>
<select id="selMonth"></select>
<select id="selDay"></select>
<script type="text/javascript">
var selYear = window.document.getElementById("selYear");
var selMonth = window.document.getElementById("selMonth");
var selDay = window.document.getElementById("selDay");

// 新建一個DateSelector類的實例,將三個select對象傳進去
new DateSelector(selYear, selMonth ,selDay);
</script>
</body>
</html>

接下來要對天數進行初始化了,前邊有說過天數是不定的,那要如何準確求出它的天數呢?我們稍加分析就知道每個月的最后一天就是該月的天數,相當于下一個月的第一天的前一天,比如說我們要求2005年11月的天數,那我們只需要得到2005年12月一日的前一天即可得到2005年11月最后一天??梢越oDateSelector添加一個方法DaysInMonth來實現該功能。

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>如何實現一個日期下拉菜單</title>
<script type="text/javascript">
function DateSelector(selYear, selMonth, selDay)
{
    this.selYear = selYear;
    this.selMonth = selMonth;
    this.selDay = selDay;
    this.InitYearSelect();
    this.InitMonthSelect();
}

// 增加一個最大年份的屬性
DateSelector.prototype.MinYear = 1900;

// 增加一個最大年份的屬性
DateSelector.prototype.MaxYear = (new Date()).getFullYear();

// 初始化年份
DateSelector.prototype.InitYearSelect = function()
{
    // 循環添加OPION元素到年份select對象中
    for(var i = this.MaxYear; i >= this.MinYear; i--)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到年份select對象
        this.selYear.appendChild(op);
    }
}

// 初始化月份
DateSelector.prototype.InitMonthSelect = function()
{
    // 循環添加OPION元素到月份select對象中
    for(var i = 1; i < 13; i++)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到月份select對象
        this.selMonth.appendChild(op);
    }
}

// 根據年份與月份獲取當月的天數
DateSelector.DaysInMonth = function(year, month)
{
    var date = new Date(year, month, 0);
    return date.getDate();
}
</script>
</head>
<body>
<select id="selYear"></select>
<select id="selMonth"></select>
<select id="selDay"></select>
<script type="text/javascript">
var selYear = window.document.getElementById("selYear");
var selMonth = window.document.getElementById("selMonth");
var selDay = window.document.getElementById("selDay");

// 新建一個DateSelector類的實例,將三個select對象傳進去
new DateSelector(selYear, selMonth ,selDay);
alert("2004年2月的天數為" + DateSelector.DaysInMonth(2004, 2));
alert("2005年2月的天數為" + DateSelector.DaysInMonth(2005, 2));
</script>
</body>
</html>

很明顯,這種方法根本不需要考慮到該年份是否為閏年就可以輕松求出指定月的天數。另外,有些網友可能會對“var date = new Date(year, month, 0);”這句代碼覺得奇怪,傳入的是2005,2,0,這看起來似乎是求二月份第一天的前一天即一月份的最后一天,為什么還會得到二月份的天數?這里必須說明一天,JavaScript的Date對象里的月份是由0開始到11結束,也就是說0表示一月,2表示三月,所以就有這種錯覺,在使用JavaScript的Date對象時要特別注意這一點。

好了,天數的算法也解決了,那么我們可以輕松寫出一個InitDaySelect方法來初始化天數了,在這個方法里要根據當前年份下拉菜單和月份下拉菜單的值算出該月的天數,由于天數是變動的,因此我們在該方法里也可事先清空天數下拉菜單的內容。

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>如何實現一個日期下拉菜單</title>
<script type="text/javascript">
function DateSelector(selYear, selMonth, selDay)
{
    this.selYear = selYear;
    this.selMonth = selMonth;
    this.selDay = selDay;
    this.InitYearSelect();
    this.InitMonthSelect();
    this.InitDaySelect();
}

// 增加一個最大年份的屬性
DateSelector.prototype.MinYear = 1900;

// 增加一個最大年份的屬性
DateSelector.prototype.MaxYear = (new Date()).getFullYear();

// 初始化年份
DateSelector.prototype.InitYearSelect = function()
{
    // 循環添加OPION元素到年份select對象中
    for(var i = this.MaxYear; i >= this.MinYear; i--)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到年份select對象
        this.selYear.appendChild(op);
    }
}

// 初始化月份
DateSelector.prototype.InitMonthSelect = function()
{
    // 循環添加OPION元素到月份select對象中
    for(var i = 1; i < 13; i++)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到月份select對象
        this.selMonth.appendChild(op);
    }
}

// 根據年份與月份獲取當月的天數
DateSelector.DaysInMonth = function(year, month)
{
    var date = new Date(year, month, 0);
    return date.getDate();
}

// 初始化天數
DateSelector.prototype.InitDaySelect = function()
{
    // 使用parseInt函數獲取當前的年份和月份
    var year = parseInt(this.selYear.value);
    var month = parseInt(this.selMonth.value);
   
    // 獲取當月的天數
    var daysInMonth = DateSelector.DaysInMonth(year, month);
   
    // 清空原有的選項
    this.selDay.options.length = 0;
    // 循環添加OPION元素到天數select對象中
    for(var i = 1; i <= daysInMonth ; i++)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到天數select對象
        this.selDay.appendChild(op);
    }
}
</script>
</head>
<body>
<select id="selYear"></select>
<select id="selMonth"></select>
<select id="selDay"></select>
<script type="text/javascript">
var selYear = window.document.getElementById("selYear");
var selMonth = window.document.getElementById("selMonth");
var selDay = window.document.getElementById("selDay");

// 新建一個DateSelector類的實例,將三個select對象傳進去
new DateSelector(selYear, selMonth ,selDay);
</script>
</body>
</html>

現在已經寫好幾個方法用來初始化三個下拉菜單的選項了,我們需要做的是讓它們結合并動起來。如果年份或月份有變動,那么應該重新計算天數并且重新初始化天數,這可以通過selYear和selMonth的onchange來實現。由于這三個下拉菜單是要緊密聯動的,因此特地給它們增加一個屬性Selector,值為當前的DateSelector實例。同時實現selYear和selMonth的onchange,如果發生onchange則調用InitDaySelect重新初始化selDay下拉菜單。

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>如何實現一個日期下拉菜單</title>
<script type="text/javascript">
function DateSelector(selYear, selMonth, selDay)
{
    this.selYear = selYear;
    this.selMonth = selMonth;
    this.selDay = selDay;
    this.InitYearSelect();
    this.InitMonthSelect();
    this.InitDaySelect();
    this.selYear.Group = this;
    this.selMonth.Group = this;
   
    // 給年份、月份下拉菜單添加處理onchange事件的函數
    if(window.document.all != null) // IE
    {
        this.selYear.attachEvent("onchange", DateSelector.Onchange);
        this.selMonth.attachEvent("onchange", DateSelector.Onchange);
    }
    else // Firefox
    {
        this.selYear.addEventListener("change", DateSelector.Onchange, false);
        this.selMonth.addEventListener("change", DateSelector.Onchange, false);
    }
}

// 增加一個最大年份的屬性
DateSelector.prototype.MinYear = 1900;

// 增加一個最大年份的屬性
DateSelector.prototype.MaxYear = (new Date()).getFullYear();

// 初始化年份
DateSelector.prototype.InitYearSelect = function()
{
    // 循環添加OPION元素到年份select對象中
    for(var i = this.MaxYear; i >= this.MinYear; i--)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到年份select對象
        this.selYear.appendChild(op);
    }
}

// 初始化月份
DateSelector.prototype.InitMonthSelect = function()
{
    // 循環添加OPION元素到月份select對象中
    for(var i = 1; i < 13; i++)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到月份select對象
        this.selMonth.appendChild(op);
    }
}

// 根據年份與月份獲取當月的天數
DateSelector.DaysInMonth = function(year, month)
{
    var date = new Date(year, month, 0);
    return date.getDate();
}

// 初始化天數
DateSelector.prototype.InitDaySelect = function()
{
    // 使用parseInt函數獲取當前的年份和月份
    var year = parseInt(this.selYear.value);
    var month = parseInt(this.selMonth.value);
   
    // 獲取當月的天數
    var daysInMonth = DateSelector.DaysInMonth(year, month);
   
    // 清空原有的選項
    this.selDay.options.length = 0;
    // 循環添加OPION元素到天數select對象中
    for(var i = 1; i <= daysInMonth ; i++)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到天數select對象
        this.selDay.appendChild(op);
    }
}

// 處理年份和月份onchange事件的方法,它獲取事件來源對象(即selYear或selMonth)
// 并調用它的Group對象(即DateSelector實例,請見構造函數)提供的InitDaySelect方法重新初始化天數
// 參數e為event對象
DateSelector.Onchange = function(e)
{
    var selector = window.document.all != null ? e.srcElement : e.target;
    selector.Group.InitDaySelect();
}
</script>
</head>
<body>
<select id="selYear"></select>
<select id="selMonth"></select>
<select id="selDay"></select>
<script type="text/javascript">
var selYear = window.document.getElementById("selYear");
var selMonth = window.document.getElementById("selMonth");
var selDay = window.document.getElementById("selDay");

// 新建一個DateSelector類的實例,將三個select對象傳進去
new DateSelector(selYear, selMonth ,selDay);
</script>
</body>
</html>

到此為止我們已經基本實現DateSelector類要提供的功能了,為了更靈活地控制它,我們應該給它增加設定初始值的功能。一般來說有兩種需求,第一種是傳入一個Date對象,第二種是傳入三個值分別表示年、月、日,也就是說我們必須重載構造函數,形式如下:

function DateSelector(selYear, selMonth, selDay)
function DateSelector(selYear, selMonth, selDay, date)
function DateSelector(selYear, selMonth, selDay, year, month, day)

當然,JavaScript沒有重載的概念,但我們可以給它模擬出來,方法就是根據傳入參數的個數(即arguments對象的length)以及類型來判斷,這需要對原有的構造函數進行一定的改動使之更模塊化地實現這三種情況。由于年份和月份是固定不變的,參數只會改變selYear和selMonth的已選選項,而selDay則要根據selYear和selMonth的值再動態生成,因此我們將初始化菜單代碼再提出來寫一個InitSelector方法里,它有三個參數,分別是year, month, day,功能是根據這三個參數來生成相應的菜單選項,我們這次調試使用2004年2月29日為初始值。要設置初始值的時候一般我們會循環訪問option的值,但這里情況特殊,我們是可以根據一定的計算來得到默認選擇的option的下標的。

年份下標 = MaxYear - year
月份下標 = month - 1
天數下標 = day - 1

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>如何實現一個日期下拉菜單</title>
<script type="text/javascript">
function DateSelector(selYear, selMonth, selDay)
{
    this.selYear = selYear;
    this.selMonth = selMonth;
    this.selDay = selDay;
    this.selYear.Group = this;
    this.selMonth.Group = this;
    // 給年份、月份下拉菜單添加處理onchange事件的函數
    if(window.document.all != null) // IE
    {
        this.selYear.attachEvent("onchange", DateSelector.Onchange);
        this.selMonth.attachEvent("onchange", DateSelector.Onchange);
    }
    else // Firefox
    {
        this.selYear.addEventListener("change", DateSelector.Onchange, false);
        this.selMonth.addEventListener("change", DateSelector.Onchange, false);
    }

    if(arguments.length == 4) // 如果傳入參數個數為4,最后一個參數必須為Date對象
        this.InitSelector(arguments[3].getFullYear(), arguments[3].getMonth() + 1, arguments[3].getDate());
    else if(arguments.length == 6) // 如果傳入參數個數為6,最后三個參數必須為初始的年月日數值
        this.InitSelector(arguments[3], arguments[4], arguments[5]);
    else // 默認使用當前日期
    {
        var dt = new Date();
        this.InitSelector(dt.getFullYear(), dt.getMonth() + 1, dt.getDate());
    }
}

// 增加一個最大年份的屬性
DateSelector.prototype.MinYear = 1900;

// 增加一個最大年份的屬性
DateSelector.prototype.MaxYear = (new Date()).getFullYear();

// 初始化年份
DateSelector.prototype.InitYearSelect = function()
{
    // 循環添加OPION元素到年份select對象中
    for(var i = this.MaxYear; i >= this.MinYear; i--)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到年份select對象
        this.selYear.appendChild(op);
    }
}

// 初始化月份
DateSelector.prototype.InitMonthSelect = function()
{
    // 循環添加OPION元素到月份select對象中
    for(var i = 1; i < 13; i++)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到月份select對象
        this.selMonth.appendChild(op);
    }
}

// 根據年份與月份獲取當月的天數
DateSelector.DaysInMonth = function(year, month)
{
    var date = new Date(year, month, 0);
    return date.getDate();
}

// 初始化天數
DateSelector.prototype.InitDaySelect = function()
{
    // 使用parseInt函數獲取當前的年份和月份
    var year = parseInt(this.selYear.value);
    var month = parseInt(this.selMonth.value);
   
    // 獲取當月的天數
    var daysInMonth = DateSelector.DaysInMonth(year, month);
   
    // 清空原有的選項
    this.selDay.options.length = 0;
    // 循環添加OPION元素到天數select對象中
    for(var i = 1; i <= daysInMonth ; i++)
    {
        // 新建一個OPTION對象
        var op = window.document.createElement("OPTION");
       
        // 設置OPTION對象的值
        op.value = i;
       
        // 設置OPTION對象的內容
        op.innerHTML = i;
       
        // 添加到天數select對象
        this.selDay.appendChild(op);
    }
}

// 處理年份和月份onchange事件的方法,它獲取事件來源對象(即selYear或selMonth)
// 并調用它的Group對象(即DateSelector實例,請見構造函數)提供的InitDaySelect方法重新初始化天數
// 參數e為event對象
DateSelector.Onchange = function(e)
{
    var selector = window.document.all != null ? e.srcElement : e.target;
    selector.Group.InitDaySelect();
}

// 根據參數初始化下拉菜單選項
DateSelector.prototype.InitSelector = function(year, month, day)
{
    // 由于外部是可以調用這個方法,因此我們在這里也要將selYear和selMonth的選項清空掉
    // 另外因為InitDaySelect方法已經有清空天數下拉菜單,因此這里就不用重復工作了
    this.selYear.options.length = 0;
    this.selMonth.options.length = 0;
   
    // 初始化年、月
    this.InitYearSelect();
    this.InitMonthSelect();
   
    // 設置年、月初始值
    this.selYear.selectedIndex = this.MaxYear - year;
    this.selMonth.selectedIndex = month - 1;
   
    // 初始化天數
    this.InitDaySelect();
   
    // 設置天數初始值
    this.selDay.selectedIndex = day - 1;
}
</script>
</head>
<body>
<select id="selYear"></select>
<select id="selMonth"></select>
<select id="selDay"></select>
<script type="text/javascript">
var selYear = window.document.getElementById("selYear");
var selMonth = window.document.getElementById("selMonth");
var selDay = window.document.getElementById("selDay");

// 新建一個DateSelector類的實例,將三個select對象傳進去
new DateSelector(selYear, selMonth ,selDay, 2004, 2, 29);
// 也可以試試下邊的代碼
// var dt = new Date(2004, 1, 29);
// new DateSelector(selYear, selMonth ,selDay, dt);
</script>
</body>
</html>

好了,日期下拉菜單已經能夠如我們想象的那樣開始工作了,在調用的時候我們只需要執行new DateSelector(selYear, selMonth ,selDay, 2004, 2, 29);就可以,而且它內部關系緊密,你同一個頁面可以同時運行好幾組日期下拉菜單而互不影響,這也是我要采用類的形式而不是采用一組函數來實現的緣由了,我以后寫的文章也會盡可能采用類的形式,這樣寫出來的代碼使用起來會更加方便。像以往一樣,我也得說88啦,希望大家能夠繼續支持無憂腳本的原創文章,并且踴躍參與到其中來。



小卓 2008-10-13 17:50 發表評論
]]>
距離北京2008年奧運會開幕的倒記時特效http://www.aygfsteel.com/table/articles/234064.html小卓小卓Mon, 13 Oct 2008 09:41:00 GMThttp://www.aygfsteel.com/table/articles/234064.htmlhttp://www.aygfsteel.com/table/comments/234064.htmlhttp://www.aygfsteel.com/table/articles/234064.html#Feedback0http://www.aygfsteel.com/table/comments/commentRss/234064.htmlhttp://www.aygfsteel.com/table/services/trackbacks/234064.html距離北京奧運會開幕還有
<br>
<html>
<head>
<title>倒計時測試</title>
<!--倒計時設置代碼-->
<script language="JavaScript">
<!-- hide script from old browser
var DifferenceHour = -1
var DifferenceMinute = -1
var DifferenceSecond = -1
var Tday = new Date("Aug 8, 2008 20:00:00")   //**倒計時時間點-注意格式
var daysms = 24 * 60 * 60 * 1000
var hoursms = 60 * 60 * 1000
var Secondms = 60 * 1000
var microsecond = 1000
function clock()
{
var time = new Date()
var hour = time.getHours()
var minute = time.getMinutes()
var second = time.getSeconds()
var timevalue = ""+((hour > 12) ? hour-12:hour)
timevalue +=((minute < 10) ? ":0":":")+minute
timevalue +=((second < 10) ? ":0":":")+second
timevalue +=((hour >12 ) ? " PM":" AM")
// document.formnow.now.value = timevalue
var convertHour = DifferenceHour
var convertMinute = DifferenceMinute
var convertSecond = DifferenceSecond
var Diffms = Tday.getTime() - time.getTime()
DifferenceHour = Math.floor(Diffms / daysms)
Diffms -= DifferenceHour * daysms
DifferenceMinute = Math.floor(Diffms / hoursms)
Diffms -= DifferenceMinute * hoursms
DifferenceSecond = Math.floor(Diffms / Secondms)
Diffms -= DifferenceSecond * Secondms
var dSecs = Math.floor(Diffms / microsecond)
if(convertHour != DifferenceHour) document.formnow.dd.value=DifferenceHour
if(convertMinute != DifferenceMinute) document.formnow.hh.value=DifferenceMinute
if(convertSecond != DifferenceSecond) document.formnow.mm.value=DifferenceSecond
document.formnow.ss.value=dSecs
// document.formnow.Tnow.value= DifferenceHour DifferenceMinute + DifferenceSecond + dSecs
setTimeout("clock()",1000)
}
// end hiding -->
</script>
</head>
<!--BODY里面的ONLOAD注意-->
<body onload="clock();return true" text="red">
<!--實現顯示-->
<form name="formnow">
        <input name="dd" type="text" style="border:0;" size=2>
        天
        <input name="hh" type="text" style="border:0;" size=2>
        小時
        <input name="mm" type="text" style="border:0;" size=2>
        分
        <input name="ss" type="text" style="border:0;" size=2>
        秒
  </form>
<!--倒計時完畢-->

小卓 2008-10-13 17:41 發表評論
]]>
主站蜘蛛池模板: 六安市| 上栗县| 博白县| 察隅县| 晋江市| 阳山县| 会泽县| 鄂尔多斯市| 吴旗县| 武邑县| 辽宁省| 江安县| 景宁| 石城县| 梁河县| 霍山县| 天峨县| 内乡县| 株洲县| 三亚市| 板桥市| 康乐县| 海淀区| 瓮安县| 新田县| 诸城市| 阿尔山市| 耿马| 吉木萨尔县| 扎囊县| 公安县| 贡嘎县| 长子县| 会同县| 石景山区| 睢宁县| 湛江市| 银川市| 东乌| 大安市| 三门峡市|