2012年12月4日 星期二

VB 字串轉時間格式


將字串轉為時間格式的三種方法

1.
Dim dt As DateTime
DateTime.TryParse("2003/8/15 上午 03:03:00", dt)

2.
Dim dt As DateTime
dt = DateTime.Parse("2003/8/15 上午 03:03:00")

3.
Dim dt As DateTime
dt = Convert.ToDateTime("2003/8/15 上午 03:03:00")

速度也是由1到3~~~1.最快但是2005才有

2012年11月12日 星期一

vb.程式間隔一段時間執行一次

剛好看到...雖然不符合要用的需求但或許之後用的到..先記錄下來



Private Sub Form_Load()
Timer1.Interval = 1000'把timer1設置成每隔一秒种觸發一次timer事件
End Sub

Private Sub Timer1_Timer()
Static a As Integer, b As Integer'全局變量
a = 1
If a = 60 Then b = 1:a=0'如果a=60了,就證明已經過了一分鐘了。那麼b再加上+1,如果b=5那麼就已經過了5分鐘了。
If b = 5 Then
'這後面寫你想執行的代碼
end if
End Sub

2012年11月9日 星期五

asp網頁編碼big5->utf8處理辦法


處理很久搞不定的big5 透過post將資料傳到utf-8的頁面會出現中文亂碼問題...
總算找到個解決方法..記錄起來
轉錄自:Itano Tomomi

asp網頁採用的編碼(encoding)是用系統預設的語系,在windows 2003底下是big5。那該如何將big5轉成utf8呢?這很簡單(不是團結的故事),使用Session.CodePage跟Server.UrlEncode()就可以了。
sourceURL = "http://itanotomomi.akb48/板野友美.htm"
dim i,utf8URL,tmp,encodingStr

for i=1 to Len(sourceUrl)
  tmp = mid(sourceUrl, i, 1)
  if asc(tmp) < 0 or asc(tmp) > 128 then  '將ascii碼在1~128以外的字元當成中文編成utf8
    Session.CodePage="65001" '先將網頁設成utf8
    encodingStr = Server.UrlEncode(tmp) '將中文編成utf8
    Session.CodePage="950" '再將網頁設為Big5
    utf8URL = utf8URL & encodingStr
  else
    utf8URL = utf8URL & tmp
  end if
next
為什麼要這樣做呢?因為asp使用Server.UrlEncode()進行編碼是採用系統預設的語系,若不更改網頁的語系為utf8,直接使用Server.UrlEncode()的話,會編成big5。而且千萬記得,編成utf8後,要再將Session.CodePage指定回big5,不然以big5為主的asp網站會整個亂掉。
不過若到上面為止,就想直接將encodingStr用response.redirect送出的話,會發現還是找不到網頁。那是因為response.redirect在導向的過程會採用系統預設的語系再編碼過一次...orz...
我目前解決的方式是不用response.redirect,改使用javascript的window.open()。不過缺點是會被瀏覽器擋住。
response.write "<script type='text/javascript'>window.open('" & utf8URL & "');</script>"
以上是純ASP的解決方法,接著介紹透過ASP.NET的解法。
首先是ASP端,將url編碼丟給ASP.NET。這邊採用預設編成big5就可以了,反正主要處理在ASP.NET端。 
sourceURL = "http://itanotomomi.akb48/板野友美.htm"
Response.Redirect "http://itanotomomi.akb48/passUTF8.aspx?q=" & Server.UrlEncode(sourceUrl)
接著在passUTF8.aspx.cs的Page_Load(若使用VB則是passUTF8.aspx.vb)中撰寫下面的語法。
string sourceURL = Request.Url.Query;
sourceURL = HttpUtility.UrlDecode(sourceURL, Encoding.GetEncoding("big5")); //將asp用big5傳來的url decode
sourceURL = sourceURL.Replace("?q=", "");
Response.Redirect(sourceURL);
因為ASP.NET使用utf8,所以將asp傳來的url編成utf8後就可以直接使用Response.Redirect()丟出去了。

2012年10月10日 星期三

Youtube iframe影片蓋住網頁浮動div elem

之前用時就有發現此問題,但當初youtube還可以選舊版程式碼,所以沒特別注意去處理。

最近客戶使用時沒辦法點選舊版程式碼(object),只好用iframe的方式卻發現會蓋住div圖層。

網路上找到了方法,只能說youtube不可能沒發現這問題,但大概就是懶得幫你加這句上去-.-

轉錄自:YIJEN'S BLOG

bug fixed code demo


Before

<iframe width="420" height="315" src="http://www.youtube.com/embed/678uZ7S_tKs" frameborder="0" allowfullscreen=""></iframe>

After

<iframe width="420" height="315" src="http://www.youtube.com/embed/678uZ7S_tKs?wmode=opaque" frameborder="0" allowfullscreen=""></iframe>

2012年9月23日 星期日

asp.net 抓取本月第一天&本月最後一天日期


百度知識家找到的 很實用 筆記起來..

// 本月的第一天           
DateTime firstDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
//本月的最后一天
DateTime lastDate = firstDate.AddMonths(1).AddDays(-1);
 
int weekDay = (short)DateTime.Today.DayOfWeek;
 
//本周一的日期
DateTime monday = DateTime.Today.AddDays(1 - weekDay);
//本周六的日期
DateTime saturday = DateTime.Today.AddDays(6 - weekDay);

2012年9月11日 星期二

ASP.NET 如何取得 Request URL 的各個部分


轉自:

我們在開發網頁應用程式,時常需要去解析網址(Request.Url)的每個片段,進行一些判斷。例如說 "http://localhost:1897/News/Press/Content.aspx/123?id=1#toc ",我們想要取得網址裡第一層目錄的名字(News)用以判斷不同的頁面標題(Page Title)。
我看很多人都用字串的 IndexOf 方法與 Substring 方法:
Request.Url.PathAndQuery.Substring(1, Request.Url.PathAndQuery.IndexOf("/", 1)-1)
這實在太埋沒 .NET 的強大設計了,事實上在 Request 物件就已經提供很多方便的屬性(Property)可供取得網址的片段。
底下這張表就是各種跟 Browser Request 的網址相關的屬性與用法:
網址:http://localhost:1897/News/Press/Content.aspx/123?id=1#toc
Request.ApplicationPath/
Request.PhysicalPathD:\Projects\Solution\web\News\Press\Content.aspx
System.IO.Path.GetDirectoryName(Request.PhysicalPath)D:\Projects\Solution\web\News\Press
Request.PhysicalApplicationPathD:\Projects\Solution\web\
System.IO.Path.GetFileName(Request.PhysicalPath)Content.aspx
Request.CurrentExecutionFilePath/News/Press/Content.aspx
Request.FilePath/News/Press/Content.aspx
Request.Path/News/Press/Content.aspx/123
Request.RawUrl/News/Press/Content.aspx/123?id=1
Request.Url.AbsolutePath/News/Press/Content.aspx/123
Request.Url.AbsoluteUrihttp://localhost:1897/News/Press/Content.aspx/123?id=1
Request.Url.Schemehttp
Request.Url.Hostlocalhost
Request.Url.Port1897
Request.Url.Authoritylocalhost:1897
Request.Url.LocalPath/News/Press/Content.aspx/123
Request.PathInfo/123
Request.Url.PathAndQuery/News/Press/Content.aspx/123?id=1
Request.Url.Query?id=1
Request.Url.Fragment 
Request.Url.Segments/
News/
Press/
Content.aspx/
123
所以當你看了這張表之後,你還會想用 Request.Url.PathAndQuery.Substring(1, Request.Url.PathAndQuery.IndexOf("/", 1)-1) 這種寫法嗎?
用這樣寫 Request.Url.Segments[1].Replace("/", "") 不是又短又直覺嗎? ^_^
以下是產生以上表格的程式碼:
protected void Page_Load(object sender, EventArgs e)
{ 

    StringBuilder sb = new StringBuilder(); 

    sb.Append("<table cellpadding=3 cellspacing=0 border=1>"); 

    sb.Append("<tr><td colspan=2>");
    sb.Append("網址:http://localhost:1897/News/Press/Content.aspx/123?id=1#toc");
    sb.Append("</td></tr>"); 

    // Request.ApplicationPath
    sb.Append("<tr><td>");
    sb.Append("Request.ApplicationPath");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.ApplicationPath + "</b>");
    sb.Append("</td></tr>"); 

    // Request.PhysicalPath
    sb.Append("<tr><td>");
    sb.Append("Request.PhysicalPath");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.PhysicalPath + "</b>");
    sb.Append("</td></tr>"); 

    // System.IO.Path.GetDirectoryName(Request.PhysicalPath)
    sb.Append("<tr><td>");
    sb.Append("System.IO.Path.GetDirectoryName(Request.PhysicalPath)");
    sb.Append("</td><td>");
    sb.Append("<b>" + System.IO.Path.GetDirectoryName(Request.PhysicalPath) + "</b>");
    sb.Append("</td></tr>"); 

    // Request.PhysicalApplicationPath
    sb.Append("<tr><td>");
    sb.Append("Request.PhysicalApplicationPath");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.PhysicalApplicationPath + "</b>");
    sb.Append("</td></tr>"); 

    // System.IO.Path.GetFileName(Request.PhysicalPath)
    sb.Append("<tr><td>");
    sb.Append("System.IO.Path.GetFileName(Request.PhysicalPath)");
    sb.Append("</td><td>");
    sb.Append("<b>" + System.IO.Path.GetFileName(Request.PhysicalPath) + "</b>");
    sb.Append("</td></tr>"); 

    // Request.CurrentExecutionFilePath
    sb.Append("<tr><td>");
    sb.Append("Request.CurrentExecutionFilePath");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.CurrentExecutionFilePath + "</b>");
    sb.Append("</td></tr>"); 

    // Request.FilePath
    sb.Append("<tr><td>");
    sb.Append("Request.FilePath");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.FilePath + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Path
    sb.Append("<tr><td>");
    sb.Append("Request.Path");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Path + "</b>");
    sb.Append("</td></tr>"); 

    // Request.RawUrl
    sb.Append("<tr><td>");
    sb.Append("Request.RawUrl");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.RawUrl + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Url.AbsolutePath
    sb.Append("<tr><td>");
    sb.Append("Request.Url.AbsolutePath");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Url.AbsolutePath + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Url.AbsoluteUri
    sb.Append("<tr><td>");
    sb.Append("Request.Url.AbsoluteUri");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Url.AbsoluteUri + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Url.Scheme
    sb.Append("<tr><td>");
    sb.Append("Request.Url.Scheme");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Url.Scheme + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Url.Host
    sb.Append("<tr><td>");
    sb.Append("Request.Url.Host");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Url.Host + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Url.Port
    sb.Append("<tr><td>");
    sb.Append("Request.Url.Port");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Url.Port + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Url.Authority
    sb.Append("<tr><td>");
    sb.Append("Request.Url.Authority");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Url.Authority + "</b>");
    sb.Append("</td></tr>"); 

    // local Request.Url.LocalPath
    sb.Append("<tr><td>");
    sb.Append("Request.Url.LocalPath");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Url.LocalPath + "</b>");
    sb.Append("</td></tr>"); 

    // Request.PathInfo
    sb.Append("<tr><td>");
    sb.Append("Request.PathInfo");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.PathInfo + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Url.PathAndQuery
    sb.Append("<tr><td>");
    sb.Append("Request.Url.PathAndQuery");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Url.PathAndQuery + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Url.Query
    sb.Append("<tr><td>");
    sb.Append("Request.Url.Query");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Url.Query + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Url.Fragment
    // 原則上你應該無法從 Request.Url.Fragment 取得任何資料,因為通常 Browser 不會送出 #toc 這個部分
    sb.Append("<tr><td>");
    sb.Append("Request.Url.Fragment");
    sb.Append("</td><td>");
    sb.Append("<b>" + Request.Url.Fragment + "</b>");
    sb.Append("</td></tr>"); 

    // Request.Url.Segments
    sb.Append("<tr>");
    sb.Append("<td>");
    sb.Append("Request.Url.Segments");
    sb.Append("</td>");
    sb.Append("<td>");
    string[] segments = Request.Url.Segments;
    foreach (string s in segments)
    {
        sb.Append("<b>" + s + "</b>");
        sb.Append("<br/>");
    }
    sb.Append("</td>");
    sb.Append("</tr>"); 

    sb.Append("</table>"); 

    ltlTable.Text = sb.ToString();
}
注意事項
  • 當程式部署(Deploy)到 IIS 6 之後,假設你的網址是http://localhost:1897/News/Press/Content.aspx/123 ? ,IIS 不知為何會將問號 ( ? ) 給刪除掉,以致於 ASP.NET 使用 Request.Url.Query 是空字串!如果你的程式有判斷到這部分時就要特別注意,因為照理說應該會抓到才對!不知道是不是 IIS 6 的 Bug ?

Request.ServerVariables 所有元素的用法

變數說明
Request.ServerVariables["ALL_HTTP"]Client端發送的所有 HTTP 標題文件
Request.ServerVariables["ALL_RAW"]顯示未處理表格中所有的標題
Request.ServerVariables["APPL_MD_PATH"]顯示 ISAPI DLL 的 (WAM) Application 的資料庫路徑
Request.ServerVariables["APPL_PHYSICAL_PATH"]顯示與資料庫路徑相應的物理路徑
Request.ServerVariables["AUTH_PASSWORD"]該值输入到客户端的鑒定對話中
Request.ServerVariables["AUTH_TYPE"]用户訪問受保護的脚本時,服務器用於檢驗用户的驗證方法
Request.ServerVariables["AUTH_USER"]未被鑒定的用户名
Request.ServerVariables["CERT_COOKIE"]客户端驗證的唯一 ID,以字串方式返回
Request.ServerVariables["CERT_FLAGS"]如有客户端驗證,则 bit0 為 1
如果客户端驗證的驗證人無效(不在伺服器許可的 CA 列表中),bit1 被設置為 1
Request.ServerVariables["CERT_ISSUER"]用户驗證中的頒布者字段(O=MS,OU=IAS,CN=user name,C=USA)
Request.ServerVariables["CERT_KEYSIZE"]安全套接字層連接關键字的位數,如 128
Request.ServerVariables["CERT_SECRETKEYSIZE"]伺服器驗證私人關键字的位數,如 1024
Request.ServerVariables["CERT_SERIALNUMBER"]用户驗證的序列號字段
Request.ServerVariables["CERT_SERVER_ISSUER"]伺服器驗證的頒發者字段
Request.ServerVariables["CERT_SERVER_SUBJECT"]伺服器驗證的主字段
Request.ServerVariables["CERT_SUBJECT"]客户端驗證的主字段
Request.ServerVariables["CONTENT_LENGTH"]客户端發出内容的長度
Request.ServerVariables["CONTENT_TYPE"]内容的數據類型
Request.ServerVariables["GATEWAY_INTERFACE"]伺服器使用的 CGI 規格的修訂
Request.ServerVariables["HTTP_HeaderName"]HeaderName 儲存在標題文件中的值
Request.ServerVariables["HTTPS"]如果請求穿過安全通道(SSL),則返回 ON。如果請求來自非安全通道,则返回 OFF。
Request.ServerVariables["HTTPS_KEYSIZE"]安全套接字層連接關键字的位數,如 128。
Request.ServerVariables["HTTPS_SECRETKEYSIZE"]伺服器驗證私人關键字的位數。如 1024。
Request.ServerVariables["HTTPS_SERVER_ISSUER"]伺服器驗證的頒發者字段
Request.ServerVariables["HTTPS_SERVER_SUBJECT"]伺服器驗證的主字段
Request.ServerVariables["INSTANCE_ID"]文本格式 IIS 實例的 ID
Request.ServerVariables["INSTANCE_META_PATH"]響應请求的 IIS 實例的資料庫路徑
Request.ServerVariables["LOCAL_ADDR"]返回接受請求的伺服器地址
Request.ServerVariables["LOGON_USER"]用户登入 Windows NT® 的帳號
Request.ServerVariables["PATH_INFO"]客户端提供的額外路徑信息
Request.ServerVariables["PATH_TRANSLATED"]PATH_INFO 轉換後的版本,該變數獲取路徑並進行必要的由虛擬至物理的映射
Request.ServerVariables["QUERY_STRING"]查询 HTTP 請求中問號(?)後的信息。
Request.ServerVariables["REMOTE_ADDR"]發出请求的遠程主機的 IP 地址
Request.ServerVariables["REMOTE_HOST"]發出請求的主機名稱
Request.ServerVariables["REMOTE_USER"]用户發送的未映射的用户名字串
Request.ServerVariables["REQUEST_METHOD"]該方法用於提出請求
Request.ServerVariables["SCRIPT_NAME"]執行脚本的虛擬路徑
Request.ServerVariables["SERVER_NAME"]出現在自引用 UAL 中的伺服器主機名、DNS 化名或 IP 地址
Request.ServerVariables["SERVER_PORT"]發送請求的 port
Request.ServerVariables["SERVER_PORT_SECURE"]如果安全端口處理了請求,則為 1,否則為 0。
Request.ServerVariables["SERVER_PROTOCOL"]請求信息協議的名稱和修訂
Request.ServerVariables["SERVER_SOFTWARE"]應答請求並運行網關的伺服器軟件的名稱和版本
Request.ServerVariables["URL"]提供 URL 的基本部分

引用:http://asp.jz123.cn/innerobject/request/intr5vsj.htm

2012年9月5日 星期三

Flash覆蓋到下拉式選單或其它元件


常遇到的問題..目前用此方法都可順利解決 備份自用..

摘自 PTT Web_Design版


 作者  terrylchen (某T)                                      看板  Web_Design
 標題  Re: [問題] 選單被flash擋住
 時間  Wed Nov  4 11:29:23 2009
───────────────────────────────────────
                                                                               
※ 引述《zazai (猛爆小吃團成員10)》之銘言:
前文恕刪


這個問題其實我平常也滿常被問到的,所以回一篇好了。
                                                                               
如果你嵌入flash的方法是用SWFObject之類的方法,
那請手動將參數加上去就好,以SWFObject為例,
就是加上
                                                                               
so.addParam("wmode", "opaque");
                                                                               
但是如果是用DW內建的AC_RunActiveContent.js的話,
那請不要手動加,因為很容易漏掉,
請直接在DW的面板裡面加,程式會自動把所有該加的地方都加上。
                                                                               
1. 點一下要加參數的flash
2. 按下下方屬性面板的「參數」
3. 再跳出的面板左邊加上wmode,右邊加上opaque,然後按確定
                                                                               
這時你如果回去看原始碼,會發現加了三個地方,
第一個是AC_RunActiveContent,
第二個是object裡面的param,
第三個就是embed裡面,
通常手動加最容易漏掉的就是embed裡的這一個,因此導致FF出現錯誤。
不過第二和第三是包在noscript,表示js不能運作下給瀏覽器看的,
所以應該不太可能會發生你說的IE可以FF不能的情況...
還是說你的flash沒有用js嵌入而是直接用object?
                                                                               
                                                                               
另外再順便提一下,常常有人回答加上transparent,其實是不一樣的。
transparent是因為把flash變成透明背景,
而由於剛好下拉選單的位置沒有東西擋到,
所以造成下拉選單蓋在flash上錯覺,
這時候如果你在flash裡面隨便扔個色塊就會把選單擋起來了,
所以正確的值是用opaque而非transparent。
雖然看起來似乎是一樣,但是意義上是不同的。

2012年7月2日 星期一

vb.net的時間格式化

時間格式化的方法



  FormatDateTime(Now, DateFormat.GeneralDate) 10/01/2008 10:55:06 AM
  FormatDateTime(Now, DateFormat.LongDate) Thursday, October 1, 2008
  FormatDateTime(Now, DateFormat.ShortDate) 10/01/2008
  FormatDateTime(Now, DateFormat.LongTime) 10:55:06 AM
  FormatDateTime(Now, DateFormat.ShortTime) 10:55
  

2012年4月18日 星期三

資料庫比對checkbox是否打勾

後台編輯頁面時用的方法..因為是比對字串..若有類似的字串時..不知道會不會發生誤判..

較安全做法大概還是得把值改成123456...再另外去轉成要的字串值可能可以更精確的比對出結果..

前台html


<input name="Application" id="Application1" type="checkbox" value="車位" />車位
<input name="Application" id="Application2" type="checkbox" value="雅房" />雅房
<input name="Application" id="Application3" type="checkbox" value="套房" />套房
<asp:Literal ID="Literal2" runat="server"></asp:Literal>

為了撈資料方便 直接把JS寫到.VB中...再呼叫出來用

.VB的部分程式碼


Literal2.Text = "<script language='javascript'>" & vbCrLf
Literal2.Text &= "var array ='" & oReader("Application") & "';" & vbCrLf
Literal2.Text &= "for (var i=1;i<=16;i++){" & vbCrLf
Literal2.Text &= "  if(array.indexOf(document.getElementById('Application'+i).value) > -1){" & vbCrLf
Literal2.Text &= "      document.getElementById('Application'+i).checked=true" & vbCrLf
Literal2.Text &= "  }" & vbCrLf
Literal2.Text &= "}" & vbCrLf
Literal2.Text &= "</script>" & vbCrLf

oReader("Application")是撈出資料表的資料再定義字串去比對

因為是checkbox..所以只要資料中有的就是要打勾的了 

所以直接用array.indexOf(document.getElementById('Application'+i).value) > -1 去判斷位置 

只要有資料一定是大於-1



2012年4月16日 星期一

2012年2月20日 星期一

JS+HTML的收合面板

參考他人寫法在略做修改... function show1(o){ //alert(window.event.srcElement.id) document.getElementById(o.id+"S").style.display= (document.getElementById(o.id+"S").style.display=="none")?(""):("none"); 123456 利用onclick的函式先給予this來抓取資料 再用函式中o.id抓取該td的id 最後讓該id+上s讓下面的內容id的display可以切換 ------------------------------------------------------------- 本來用 show(){ alert(this.id); } 但發現這樣抓不到 應該是程式無法指向到this得位置... 後來換 alert(window.event.srcElement.id) 就抓到了 但便於撰寫 還是用上面寫法比較乾淨俐落點!

2012年2月19日 星期日

facebook , plurk , twitter推文連結語法


節錄自 重灌狂人

Plurk噗浪推文按鈕語法:
<a href="javascript: void(window.open('http://www.plurk.com/?qualifier=shares&status=' .concat(encodeURIComponent(location.href)) .concat(' ') .concat('&#40;') .concat(encodeURIComponent(document.title)) .concat('&#41;')));">[推到Plurk]</a>
其中「?qualifier=shares」這段裡的「shares」可以改成loves、likes、gives、says...等,如果對方是使用中文的Plurk介面也沒關係,推文時噗浪會自動把「says」轉成「說」,把「likes」轉成「喜歡」。

Twitter噗浪推文按鈕語法:
<a href="javascript: void(window.open('http://twitter.com/home/?status='.concat(encodeURIComponent(document.title)) .concat(' ') .concat(encodeURIComponent(location.href))));">[推到Twitter]</a>

Facebook 推文按鈕語法:
<a href="javascript: void(window.open('http://www.facebook.com/share.php?u='.concat(encodeURIComponent(location.href)) ));">[推到 Facebook]</a>

2012年2月15日 星期三

js收合面版參考


<a href="#" onclick="show<%=i%>();"><%=issueCan.get(i).getName()%></a>

function show0(){
   add0.style.display= (add0.style.display=="none")?(""):("none");
   }

     <td>
       <div id="add<%=i%>" style="display:none">
    
       <%=issueCan.get(i).getContent()%>
</div>
         </td>

參考用的原始碼

2012年1月18日 星期三

使用JS正規法表單資料驗證

3-13:正規表示法:表單資料驗證

以下文章轉載自國立清華大學

為GOOLE庫存頁面

如有侵權請告知會盡速刪除!!

3-13:正規表示法:表單資料驗證

「正規表示法」或「正規式」(Regular expressions)是在 UNIX 世界中發展出來的字串比對技巧,其基本概念是用一套簡單(但功能強大)的符號來比對字串,並可對符合比對條件的字串進行修改或其他運算。事實上,UNIX 的許多軟體或指令都支援正規表示法,例如 grep、sed、awk、ed、vi、emacs 等。(這些東西大概只有像我這樣的 LKK 才會用。)尤其是 Perl,更是將正規表示法發揮的淋漓盡致。
Netscape 及 IE 在第四版後都支援 JavaScript 的正規表示法,特別適用於表單資料的驗證與修改。事實上,JavaScript 的正規表示法和 Perl 幾乎一模一樣,因此,在本章學到的正規表示法,也可以完全適用於 Perl。(一魚兩吃,簡直太棒了!)
JavaScript 的正規式(Regular expressions)是一個內建的物件,其建構函示(Construction functoin)為 RegExp,典型用法如下:

re = new RegExp("pattern", "flag")
上述用法也可以寫成:

re = /pattern/flag
其中,pattern 代表以正規表示法來顯示的字串,flag 則是比對的方式。flag 的值可能有三種,分別解釋如下:
  • g:全域比對(Global match)
  • i:忽略大小寫(Ignore case)
  • gi:全域比對並忽略大小寫
舉例來說,我們的身份證字號的格式是由一個英文字母加上九個數字組合而成,如果我們要求使用者輸入身份證字號,就可以使用 JavaScript 的正規表示法來驗證其格式的正確性。例如,我們可用下列表單來要求使用者輸入身份證字號:

身份證字號:(第一個英文字母需大寫)
在上例中,我們利用 onBlur 事件來進行正規式的比對,換句話說,當使用者填完資料,要離開此欄位的時候,JavaScript 即會測知 onBlur 事件,並呼叫函數 checkID() 來對填入的資料進行驗證。 (欲測試其效果,只需刪除欄位內的任一個字元,再到欄位外點一下,就可以看到警告視窗了。)相關原始碼如下: 在上述原始碼中,/^[A-Z]\d{9}$/ 就是一個正規式,[A-Z] 代表由 A 至 Z 的所有可能英文字母,\d 代表由 0 至 9 的數目字(事實上也可以寫成 [0-9]),{9} 則代表需要有九個數目字,^ 代表字串開始位置,$ 代表字串結束位置,因此 /^[A-Z]\d{9}$/ 就代表可以比對身份證字號的正規式。formElement.value 代表使用者輸入的字串,re.test() 則會傳回 true 或 false,代表比對是否成功。若要不限定是大寫英文字母,只需將正規式改成 /^[a-zA-Z]\d{9}$/g 就可以了!(注意:若不加入 ^ 和 $,那麼 /[A-Z]\d{9}/ 就會比對到其他不合法的身份證字號,例如 AGF123456789 或是 F1234567890 等。因此,加入 ^ 和 $ 可保證比對正確的字串一定是由由一個大寫英文字母加上九個數字所構成。)
事實上,身份證字號本身就有內在的編碼規則,這些規則和使用者的性別有關,因此若要實現較完整的表單驗證,就必須應用較完整的身份證編碼規則
另一個簡單的例子,是要求使用者輸入信用卡號碼,這是一組16個數字的號碼,例如:

信用卡號碼:(格式:xxxx-xxxx-xxxx-xxxx)
當 onBlur 發生時,換句話說,JavaScript 會呼叫函數 checkCreditCard( ) 來對填入的資料進行驗證。相關原始碼如下: 在上例中,很顯然地,/^\d{4}-\d{4}-\d{4}-\d{4}$/ 就代表正確的信用卡格式。
下一個例子,則是用正規表示法來驗證使用者的英文名字,例如:

你的英文全名:(格式:First Last 或 First Middle Last)
當 onBlur 發生時,換句話說,JavaScript 會呼叫函數 checkEnglishName( ) 來對填入的資料進行驗證。相關原始碼如下:
正規式物件的方法可列表如下:
正規式物件的方法功能
re.compile(pattern, flag)對正規式物件 re 進行編譯,以增加比對速度
re.exec(string) 或 re(string)比對正規式,並傳回陣列
re.test(string)比對正規式,並傳回比對結果(成功或失敗)
在上述範例中,我們只用到了正規式物件的 test() 方法來判斷比對是否成功,其他方法會在後序章節提到。
在進行表單資料驗證之前,我們應先進行表單資料修改,例如拿掉不必要的空格、英文字母大小寫轉換等,這些工作也可以由字串的 replace() 方法或正規式的 exec() 方法來達成,這是我們下一節的主題。
在下列的表格中,我們使用幾個簡單的範例來對正規式的應用做較完整的說明:
正規式說明及範例比對不成立之字串
/a/含字母 "a" 的字串,例如:"ab", "bac", "cba""xyz"
/a./含字母 "a" 以及其後任一個字元的字串,例如:"ab", "bac""a", "ba"
/^xy/以 "xy" 開始的字串,例如:"xyz", "xyab""axy", "bxy"
/xy$/以 "xy" 結尾的字串,例如:"axy", "abxy""xya", "xyb"
[13579]包含 "1" 或 "3" 或 "5" 或 "7" 或 "9" 的字串,例如:"a3b", "1xy""y2k"
[0-9]含數字之字串不含數字之字串
[a-z0-9]含數字或小寫字母之字串不含數字及小寫字母之字串
[a-zA-Z0-9]含數字或字母之字串不含數字及字母之字串
b[aeiou]t"bat", "bet", "bit", "bot", "but""bxt", "bzt"
[^0-9]不含數字之字串含數字之字串
[^aeiouAEIOU]不含母音之字串含母音之字串
[^\^]不含 "^" 之字串,例如:"xyz", "abc""xy^", "a^bc"
請注意在上表中,"^" 在兩條斜線中,代表一個字串的開始位置,因此 /^xy/ 代表以 "xy" 開始的字串。 同理,"$" 在兩條斜線中,代表一個字串的結束位置,因此 /xy$/ 代表以 "xy" 結束的字串。 但是如果將 "^" 放在兩個方括弧中,就代表「否定」,因此 [^aeiouAEIOU] 代表不含母音之字串。
有些正規式會常被用到,因此已被定義為特定字元,這些字元可列表說明如下:
正規表示法的特定字元說明等效的正規表示法
\d數字[0-9]
\D非數字[^0-9]
\w數字、字母、底線[a-zA-Z0-9_]
\W非 \w[^a-zA-Z0-9_]
\s空白字元[\r\t\n\f]
\S非空白字元[^\r\t\n\f]
此外,我們可定義字元的重複次數,如下:
正規表示法說明
/a?/零或一個 a
/a+/一或多個 a
/a*/零或多個 a
/a{4}/四個 a
/a{5,10}/五至十個 a
/a{5,}/至少五個 a
/a{,3}至多三個 a
/a.{5}b/a 和 b中間夾五個(非換行)字元
各位現在已經可以慢慢體會到正規表示式的威力了!利用同樣的方法,我們可以對各式各樣的表單輸入進行驗證,請參考下述範例。

注意事項

以 RegExp(pattern, flag) 的方式來建立正規式物件時,若 pattern 包含以反斜線開頭的特殊字元(例如 \d、\w、\s 等)時,我們必須再加上一個反斜線來保留其特殊意義。例如:

re = /\d+\s\w+/g
以 RegExp 為主的等效表示法為:

re = new RegExp("\\d+\\s\\w+", "g");