tbwshc

          #

          Oracle Buys Finnish Open-Source Developer

          Oracle scooped up another small technology company on Friday, announcing its acquisition of Finnish open-source database technology developer Innobase. Financial terms of the deal were not disclosed.

          Innobase, based in Helsinki, is the creator of InnoDB, an add-on storage engine for MySQL. InnoDB is distributed under the GNU GPL (General Public License) open-source license. The software is bundled with MySQL through a contractual agreementb that comes up for renewal next year; Oracle said it expects to negotiate an extension of that contract.


          "Oracle intends to continue developing the InnoDB technology and expand our commitment to open source software," Charles Rozwat, Oracle's executive vice president in charge of database and middleware technology, said in a prepared statement. "Oracle has already developed and contributed an open source clustered file system to Linux. We expect to make additional contributions in the future," he added.


          Oracle, headquartered in Redwood Shores, California, has arranged around a dozen acquisitions in the past year, most of them significantly smaller than its blockbuster, multibillion-dollar PeopleSoft and Siebel Systems buys. Other recent purchases include supply-chain logistics software maker Global Logistics Technologies, retail optimization software developer ProfitLogic, database performance enhancement technology company TimesTen, and a majority stake in Indian banking software vendor i-flex Solutions.

           

          posted @ 2012-07-10 11:05 chen11-1 閱讀(1170) | 評論 (0)編輯 收藏

          IT人士遭遇早衰危機 對象難找老婆難陪

           IT 行業,說起來就讓很多人心動。為啥?專出富豪唄。2012年胡潤少壯派富豪榜中,IT 行業可是最“豐產”的行業。

            做 IT 的人卻叫苦連連:“這個叫隔行如隔山……事實上我們并沒有外界想的那樣光鮮,你們上班的時候我們上班,你們下班的時候我們加班……年輕的時候不覺得,到了 30 歲,忽然有些力不從心的感覺了。”

            這似乎是很多“80后”IT 人士的心聲,在工作了四五年之后,他們一方面面臨身體、精力的瓶頸,另一方面,“90后”又在后面虎視眈眈。

           

            31歲的 IT 精英找不到女友

            劉先生今年 31 歲,是典型的 IT 男,大學一畢業就進入某網絡公司的研發部,到現在已經是公司元老中的元老,也是研發部舉足輕重的人物。

            按理說,像劉先生這樣的真沒什么好擔憂的,位高權重,收入頗豐,但他依然覺得苦惱——做 IT 太費腦,加班時間太多。“我們公司加班非常多,忙到晚上三四點是常有的事情,我們每個人的桌下甚至都放了個躺椅,太累的時候就在辦公室里睡會兒。”

            劉先生告訴記者,前幾年,他倒是每天都充滿干勁,天天加班都無所謂,但現在明顯覺得吃不消了,連著加班幾天,會有疲憊感,體力明顯不如從前。

            “說 IT 行業是吃青春飯的,這話一點不假。我最近在電視劇《心術》里看到一句話,把人比喻為紅蘋果、青蘋果、爛香蕉,說剛進醫院的護士是紅蘋果,上了一年夜班的護士是青蘋果,臉色發青,上了好幾年夜班的護士是爛香蕉。我覺得自己就是根爛香蕉,臉色很差,整個人看起來就是tb亞健康狀態的樣子,甚至看起來比同齡人老。我現在已經有很多白頭發了,可以預見,如果照這樣的強度工作下去,到 45 歲,我出門,估計孩子們都得叫我爺爺——滿頭白發了。”

            劉先生的表弟今年考大學,IT 精英表哥一直是他崇拜的對象,填志愿時更是對表哥讀過的學校的計算機系蠢蠢欲動,并立志要成為表哥那樣的 IT 精英。劉先生趕忙勸說:“做 IT 很辛苦的,常常加班,還很費腦,你還是再考慮考慮,別的行業也可以。”

            因為老加班,劉先生連女朋友都沒有。31歲了,有些同學的孩子都會打醬油了,他還是光棍一個,這也給他很大的壓力。“以前沒感覺,單身也挺快樂的,工作之余自己一個人瞎樂。過年的時候回去參加同學會,看到很多同學都帶孩子來了,我還形單影只,忽然覺得有些迷茫。這幾年的時間都貢獻給工作了,連交女朋友的時間都沒有。”

            劉先生告訴記者,在他們公司,他基本上也是做到頭了:升職基本上已經遭遇天花板;再搞研發身體也吃不消了;轉管理崗位,公司并不認同,也沒有辦法給他合適的位置?,F在他打算自己出來創業,正好有幾個做 IT 的朋友也都有創業打算,他們打算成立軟件公司,專門開發手機軟件,未來幾年應該還是比較有前途的。

            年薪 60 萬的 IT 男沒時間陪家人

            有同樣困擾的還有陳西(化名),他今年 30 歲,24歲大學畢業就從事 IT 業,跳了兩次槽,目前年薪 60 萬元,在杭州某家電子商務公司里做研發。

            陳西說,他其實很享受工作帶來的成就感,但對于為工作而付出的無數個夜晚的加班感覺很無奈。“這幾年關于過勞死的報道很多,很多正值壯年的人因為工作強度太大而猝死。我的一個同事,因為這幾年工作太拼命,最近被查出來肝方面的毛病。我忽然覺得有些恐懼,怕這樣的事情發生在我身上。我今年剛剛當了父親,有了對龍鳳胎,我想好好珍惜生命,看他們長大。我現在特別想過朝九晚五的生活,下班后就回家陪女兒,而不是對著冰冷的電腦加班。我也覺得很對不起我的妻子,她懷孕的時候產檢都是自己去的,我太忙了。我現在想留出更多的時間給家人。”

            陳西告訴記者,他覺得自己在工作上也遇到了瓶頸,公司競爭很激烈,進來的“90后”都很有沖勁,像他們這種“前浪”,一不留神就會被拍死在沙灘上。“像我們做 IT 的,不可能一直做技術,這也是個吃青春飯的行當,一定要在三十左右技術達到一定程度的時候就轉,轉到非技術方面,管理或者是其他方面,或者創業??傊荒芤恢弊觯瑫幸粋€瓶頸,到達一定程度后就不會再往上漲了。我的同事、同學們都有這種感覺,到了 30 歲,就需要改變。”

            采訪中,記者了解到,很多 IT 精英都有像劉先生和陳西這樣的迷茫,長時間超負荷的工作,讓他們沒有自己的時間,很多 IT 男到 30 歲還打著光棍,雖然收入不菲,但因沒有時間,并不受女生的歡迎。

            有些悲觀的 IT 男甚至還萌生了 40 歲退休的想法,希望從此遠

          posted @ 2012-07-06 15:46 chen11-1 閱讀(1298) | 評論 (1)編輯 收藏

          二叉樹三種非遞歸遍歷的區別

          1 #include <iostream>
            2
            3 #define MAXN  100
            4 using namespace stbd;
            5
            6
            7 struct BTNode
            8 {
            9     char tag;
          10     BTNode *left;
          11     BTNode *right;
          12 };
          13
          14 class BTree
          15 {
          16 private:
          17     BTNode **root;
          18     void BuildBTree(BTNode **root);
          19
          20 public:
          21     /*遞歸版本*/
          22     void PreVisit(BTNode *root);
          23     void InVisit(BTNode *root);
          24     void PostVisit(BTNode *root);
          25
          26     /*非遞歸版本*/
          27     void NR_PreVisit(BTNode *root);
          28     void NR_InVisit(BTNode *root);
          29     void NR_PostVisit(BTNode *root);
          30
          31     BTree(BTNode **r);
          32     BTree();
          33 };
          34
          35 BTree::BTree()
          36 {
          37
          38 }
          39
          40 BTree::BTree(BTNode **r)
          41 {
          42     root = r;
          43     /*
          44 *root = new BTNode; 45     (*root)->left = NULL;
          46 (*root)->right = NULL; 47     */
          48     BuildBTree(root);
          49 }
          50
          51 /*先序方式插入結點*/
          52 void BTree::BuildBTree(BTNode **root)
          53 {
          54     char c;
          55    
          56     c = getchar();
          57     if(c == '#')
          58         *root=NULL;
          59     else{
          60         *root = new BTNode;
          61         (*root)->tag = c;
          62         BuildBTree(&(*root)->left);
          63         BuildBTree(&(*root)->right);
          64     }
          65 }
          66
          67 void BTree::PreVisit(BTNode *root)
          68 {
          69     if(root!=NULL)
          70     {
          71         printf("%c ", root->tag );
          72         PreVisit(root->left);
          73         PreVisit(root->right);
          74     }
          75 }
          76
          77 void BTree::InVisit(BTNode *root)
          78 {
          79     if(root!=NULL)
          80     {
          81         InVisit(root->left);
          82         printf("%c ", root->tag );
          83         InVisit(root->right);
          84     }
          85 }
          86
          87 void BTree::PostVisit(BTNode *root)
          88 {
          89     if(root!=NULL)
          90     {
          91         PostVisit(root->left);
          92         PostVisit(root->right);
          93         printf("%c ", root->tag );
          94     }
          95 }
          96
          97 void BTree::NR_PreVisit(BTNode *root)
          98 {
          99     BTNode *s[MAXN];
          100     int top=0;
          101
          102     while(top!=0 || root!=NULL)
          103     {
          104         while(root!=NULL)
          105         {
          106             s[top] = root;
          107             printf("%c ", s[top++]->tag);
          108             root = root->left;
          109         }
          110         if(top>0)
          111         {
          112             root = s[--top];
          113             root = root->right;
          114         }
          115     }
          116 }
          117
          118 void BTree::NR_InVisit(BTNode *root)
          119 {
          120     BTNode *s[MAXN];
          121     int top=0;
          122    
          123     while(top!=0 || root!=NULL)
          124     {
          125         while(root!=NULL)
          126         {
          127             s[top++]=root;
          128             root = root->left;
          129         }
          130         if(top>0)
          131         {
          132             root = s[--top];
          133             printf("%c ", root->tag);
          134             root = root->right;
          135         }
          136     }
          137 }
          138
          139 void BTree::NR_PostVisit(BTNode *root)
          140 {
          141     BTNode *s[MAXN], *tmp=NULL;
          142     int top=0;
          143
          144     while(top!=0 || root!=NULL)
          145     {
          146         while(root!=NULL)
          147         {
          148             s[top++]=root;
          149             root=root->left;
          150         }
          151         if(top>0)
          152         {
          153             root = s[--top];
          154
          155             /*右孩子不存在或者已經訪問過,root出棧并訪問*/
          156             if( (root->right == NULL) || (root->right == tmp) ) 
          157             {
          158                 printf("%c ", root->tag);
          159                 tmp = root;        //保存root指針
          160                 root=NULL;         //當前指針置空,防止再次入棧
          161             }
          162
          163             /*不出棧,繼續訪問右孩子*/
          164             else
          165             {
          166                 top++;             //與root=s[--top]保持平衡
          167                 root = root->right;
          168             }
          169         }
          170     }
          171 }
          172
          173 int main()
          174 {
          175     BTNode *root=NULL;
          176     BTree bt(&root);  //頭指針的地址
          177    
          178     bt.NR_PreVisit(root);
          179     printf("\n");
          180     bt.NR_InVisit(root);
          181     printf("\n");
          182     bt.NR_PostVisit(root);
          183     printf("\n");
          184     return 0;
          185 }
          復制代碼

          先上代碼,tb帶NR(Non-recursive)的表示非遞歸遍歷。

           

          測試數據:

          124#8##5##369###7##

           

          表示的二叉樹:

          用windows自帶的畫圖畫的,的確是粗糙了點。。。

           

          測試結果:

          1 2 4 8 5 3 6 9 7
          4 8 2 5 1 9 6 3 7
          8 4 5 2 9 6 7 3 1

           

           

          一、關于二叉樹的建立

           

            首先要注意二叉樹的創建過程,這里用的是先序方式遞歸插入結點,所以輸入數據的時候,必須按照先序方式輸入,

          左結點或右結點為空的,用#表示。否則,輸入不會有響應,因為遞歸過程還未結束,按CTRL+Z也沒用。當然可以用其

          他方式插入(如中序遞歸插入,后序遞歸插入等)。

           

          二、三種非遞歸遍歷的區別

           

            前序、中序和后序的遞歸遍歷方式比較簡單,這里就不講了。而非遞歸的遍歷方式,只需要用數組存儲結點指針,模擬系統棧的工作機制就可以了。

          先說先序非遞歸遍歷,按照根-左-右的方式訪問的話,需要將當前結點壓棧(同時打印當前結點信息),直到左子樹為空(內層while);然后出棧,訪問

          右結點;后面的操作就跟前面的一樣了(外層while)。

            對于中序非遞歸遍歷,可以看到代碼結構幾乎一模一樣,只是打印結點信息的位置不同而已。這是因為中序遍歷是左-根-右,這樣前序和中序非

          遞歸遍歷(根-左和左-根都是壓棧動作,且出棧動作的對象都是父節點)是一致的。

           

            對于后序非遞歸遍歷,因為后序遍歷是左-右-根,根的訪問是在右孩子之后,而這意味著兩種情況:

            1、右孩子不為空(繼續訪問右孩子);

            2、右孩子為空,從左孩子返回,則需要訪問根結點。

            為了區分這兩種情況(物理形式上從左孩子返回,還是從右孩子返回來訪問根節點),對于右孩子的訪問又需要判斷根結點的右孩子是否為空或者已

          訪問過(右子樹已遍歷過)。除這兩種情況外,都不應該訪問根節點,而是要繼續進入右子樹。

            

          三、補充說明

           

            在后序非遞歸遍歷的else語句中top++純粹是為了使棧保持平衡,因為對于2)繼續訪問右孩子這種情況,不需要出棧,而前面的root[--top]包含

          出棧操作,以此保證棧的正確性(當然可以有其他的處理,這里也是考慮到三種非遞歸遍歷方式的統一性)。

            兩個while不會提高程序的時間復雜度,因為二叉樹的結點個數是固定的,內層while是為了提高算法的邏輯性。

           

          四、遞歸->非遞歸

           

            另外,今天實習看到一個老師寫的非遞歸代碼,非常棒,贊一個!他僅僅是將程序的返回地址和函數的形參、局部變量都保存起來,然后在退出時

          還原現場;同樣是非遞歸,但是這種方式更接近編譯器的處理方式,同操作系統的任務切換也比較一致;所以這種處理方法為遞歸自動轉換為非遞歸奠

          定了基礎。

            分享一下他當場編寫的非遞歸的漢諾塔:

           

          復制代碼
            1 #include <stdio.h>
            2 #include <iostream>
            3 
            4 using namespace std ;
            5 
            6 #define  MAXSIZE  1000 
            7 
            8 struct SNode
            9 {
           10     int  n;
           11     char from ;
           12     char to;
           13     char aux ;
           14     int  label ;
           15 } ;
           16 
           17 struct STK
           18 {
           19     
           20     SNode  stack[MAXSIZE] ;
           21     int sp  ;
           22     STK()
           23     {
           24         sp = 0 ;
           25     };
           26     void push (int n,char from,char to,char aux, int label )
           27     {
           28         if ( sp>= MAXSIZE )
           29         {
           30             printf ( "STK is full!\n" ) ;
           31         }
           32         stack[sp].n = n ;
           33         stack[sp].from = from ;
           34         stack[sp].to = to ;
           35         stack[sp].aux = aux ;
           36         stack[sp++].label = label ;
           37     };
           38     SNode POP()
           39     {
           40         if ( sp <=0 )
           41         {
           42             printf ( "STK is empty!\n" ) ;
           43         }
           44         return stack[--sp] ;
           45     };
           46 } ;
           47 
           48 void move(int n,char from,char to,char aux)
           49 {
           50     if(n==1)
           51     {
           52         cout<<"將#1盤從"<<from<<"移到"<<to<<endl;
           53 }
           54     else
           55     {
           56          move(n-1,from,aux,to);
           57          cout<<"將#"<<n<<"盤從"<<from<<"移到"<<to<<endl;
           58          move(n-1,aux,to,from);
           59 }
           60 }
           61 
           62 
           63 void move_stk(int n,char from,char to,char aux)
           64 {
           65     STK stk ;
           66     char tmp;
           67 S1:
           68     if(n==1)
           69     {
           70         cout<<"將#1盤從"<<from<<"移到"<<to<<endl;
           71     }
           72     else
           73    {
           74     stk.push (n,from,to,aux,2 ) ;
           75     n = n-1 ;
           76     tmp = to ;
           77     to = aux ;  
           78     aux = tmp ;
           79     goto S1;
           80          // move(n-1,from,aux,to);
           81 S2:
           82          cout<<"將#"<<n<<"盤從"<<from<<"移到"<<to<<endl;
           83 
           84     stk.push (n,from,to,aux,3 ) ;
           85     n = n-1 ;
           86     tmp = from ;
           87     from = aux ;  
           88     aux = tmp ;
           89     goto S1;
           90          // move(n-1,aux,to,from);
           91 }
           92 S3:
           93     if ( stk.sp > 0 )
           94     {
           95         SNode sn = stk.POP() ;
           96         n = sn.n ;
           97         from = sn.from;
           98         to = sn.to ;
           99         aux = sn.aux ;
          100         if  ( 1 == sn.label  )
          101             goto S1;
          102         else if ( 2 == sn.label )
          103             goto S2;
          104         else 
          105             goto S3;        
          106     }
          107 }
          108 
          109 
          110 
          111 int main(int argc, char * argv[])
          112 {
          113     move ( 3,'A','B', 'C' );
          114     printf ( "================================\n" ) ;
          115     move_stk ( 3,'A','B', 'C' );
          116 
          117     return 0;
          118 }

          posted @ 2012-07-06 15:45 chen11-1 閱讀(2099) | 評論 (0)編輯 收藏

          客戶端通過 HTTP 代理與 Telnet 服務器通信

          最近遇到一個業務需求:客戶端自動登錄遠程Telnet服務器,然后自動發出一系列指令,返回指令執行結果。

          這里,我采用 TcpClient 來與遠程服務器Telnet服務通信(默認端口:23)。這方面,網絡上有不少的代碼與文章。

          完成之后,因需求變更,遇到了一個新的問題,就是客戶機器需要通過 HTTP 代理來連接公網的 Telnetb 服務器。在這種情況,TcpClien 連接需要經過 HTTP 代理來與服務器通信。這方面代碼幾番求助度娘、谷歌無果。沒辦法,自己分析 HTTP 代理。

           

          代理過程:

          (1)客戶機連接代理服務器;

          (2)代理服務器請求連接Telnet服務器,Telnet服務器返回響應;

          (3)代理服務器將Telnet返回響應傳給客戶端。

           

          HTTP/1.0協議支持的請求方法有:GET、POST、PUT、DELETE、CONNECT等。同樣HTTP代理服務器也這些請求方法。如:使用 GET/POST 方法代理訪問網頁等。

          現在,要用的是 CONNECT 請求方法,去連接 Telnet 服務器。如下:

          CONNECT xxx.xxx.xxx.xxx:23 HTTP/1.0

          User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)

          xxx.xxx.xxx.xxx:23,為Telnet服務IP與端口。

           

          接下來,就是利用HTTP代理,創建一個連接到Telnet服務器的 TcpCient 實例對象。

           

           


          public TcpClient CreateTcpClient(string proxyHost, int proxyPort, string telnetHost, int telnetPort)
                  {
                      IPHostEntry entry = Dns.GetHostEntry(proxyHost);
                      IPEndPoint ipEndPoint = new IPEndPoint(entry.AddressList[0], proxyPort);

                      TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork);
                      tcpClient.Connect(ipEndPoint); // 連接代理服務器.

                      // CONNECT Telnet 服務器
                      string connectCommand = string.Format("CONNECT {0}:{1} HTTP/1.0\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)\n\n", telnetHost, telnetPort);
                      byte[] buffer = Encoding.ASCII.GetBytes(connectCommand);
                      tcpClient.GetStream().Write(buffer, 0, buffer.Length);

                      buffer = new byte[512];
                      int received = tcpClient.GetStream().Read(buffer, 0, 512);
                      string receivedText = Encoding.ASCII.GetString(buffer, 0, received);
                      // 成功.
                      if (receivedText.IndexOf("200") > -1)
                          return tcpClient;
                      return null;
                  }
           

           這樣的 TcpClient 通過代理與 Telnet 服務通信成功。

           

          posted @ 2012-07-06 15:42 chen11-1 閱讀(1291) | 評論 (1)編輯 收藏

          用html+js+css做一個模擬鍵盤

           這個鍵盤用html+js+css搞出來的,做這個沒什么目的,純粹覺得好玩。

              現在暫時的功能有:

              1、可按鍵跟蹤

              2、可大小寫切換

              3、可鼠標點擊輸入

              4、可移動鍵盤位置

              可拓展功能有:

              1、可改變鍵盤大小

              2、可改變主題

              3、對某些按鍵添加事件

              4、結合html5的canvas弄個打字游戲啥的(想想就有趣^_^)

              ps(本人js和css都是菜鳥一枚,不喜可以噴,但請勿涉及家人)

           

          html

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          <head>
              <title></title>
              <link href="Css/keyboard.css" rel="stylesheet" type="text/css" />
              <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
              <script src="Scripts/keyBoard.js" type="text/javascript"></script>
               
          </head>
          <body>
              <input id="state" type="hidden" />
              <input id="txtID" type="text" onclick='openKeyboard("txtID");' />
              <div id="keyboardParent">
              </div>
          </body>
          </html>

           

          keytBoard.js

          View Code
          復制代碼
            1 //移動鍵盤
            2 function dragMing(idORclass1, idORclass2) {
            3     var obj = this; //這里的this是指dragMing對象么
            4     this.idORclass1 = idORclass1; //給dragMing的idORclass1賦值
            5     this.idORclass2 = idORclass2; //給dragMing的idORclass2賦值
            6     this.deltaX = 0;
            7     this.deltaY = 0;
            8 
            9     function dragStart(dragEvent) {
           10         obj.deltaX = dragEvent.clientX - $(obj.idORclass2).offset().left;
           11         obj.deltaY = dragEvent.clientY - $(obj.idORclass2).offset().top;
           12         $(document).bind("mousemove", dragMove);
           13         $(document).bind("mouseup", dragStop);
           14         dragEvent.preventDefault();
           15 
           16     }
           17     function dragMove(dragEvent) {
           18         $(obj.idORclass2).css({
           19             "left": (dragEvent.clientX - obj.deltaX) + "px",
           20             "top": (dragEvent.clientY - obj.deltaY) + "px"
           21         })
           22         dragEvent.preventDefault();
           23 
           24     }
           25     function dragStop() {
           26         $(document).unbind("mousemove", dragMove);
           27         $(document).unbind("mouseup", dragStop);
           28 
           29     }
           30 
           31     $(document).ready(function () {
           32         $(obj.idORclass1).bind("mousedown", dragStart);
           33 
           34     })
           35 }
           36 
           37 
           38 
           39 //繪制鍵盤
           40 function drawKeyboard(type) {
           41     $("#keyboardNum").empty();
           42     $("#keyboardLetterQ").empty();
           43     $("#keyboardLetterA").empty();
           44     $("#keyboardLetterZ").empty();
           45     $("#keyboardSpaceBar").empty();
           46 
           47     if (type == "lower") {
           48         var keyboardNum = { "192": "`", "49": "1", "50": "2", "51": "3", "52": "4", "53": "5", "54": "6", "55": "7", "56": "8", "57": "9", "48": "0", "189": "-", "187": "=", "8": "Backspace" };
           49         var keyboardLetterQ = { "81": "q", "87": "w", "69": "e", "82": "r", "84": "t", "89": "y", "85": "u", "73": "i", "79": "o", "80": "p", "219": "[", "221": "]" };
           50         var keyboardLetterA = { "20": "Caps Lock", "65": "a", "83": "s", "68": "d", "70": "f", "71": "g", "72": "h", "74": "j", "75": "k", "76": "l", "186": ";", "222": "'", "220": "\\" };
           51         var keyboardLetterZ = { "16": "Shift", "90": "z", "88": "x", "67": "c", "86": "v", "66": "b", "78": "n", "77": "m", "188": ",", "190": ".", "191": "/" };
           52         var keyboardSpaceBar = { "32": "Space", "": "Tim" };
           53         var key = "";
           54     }
           55     else {
           56         var keyboardNum = { "192": "~", "49": "!", "50": "@", "51": "#", "52": "$", "53": "%", "54": "^", "55": "&", "56": "*", "57": "(", "48": ")", "189": "_", "187": "+", "8": "Backspace" };
           57         var keyboardLetterQ = { "81": "Q", "87": "W", "69": "E", "82": "R", "84": "T", "89": "Y", "85": "U", "73": "I", "79": "O", "80": "p", "219": "{", "221": "}" };
           58         var keyboardLetterA = { "20": "Caps Lock", "65": "A", "83": "S", "68": "D", "70": "F", "71": "G", "72": "H", "74": "J", "75": "K", "76": "L", "186": ":", "222": "\"", "220": "|" };
           59         var keyboardLetterZ = { "16": "Shift", "90": "Z", "88": "X", "67": "C", "86": "V", "66": "B", "78": "N", "77": "M", "188": "<", "190": ">", "191": "?" };
           60         var keyboardSpaceBar = { "32": "Space", "": "Tim" };
           61         var key = "";
           62     }
           63     $.each(keyboardNum, function (key, value) {
           64         if (value != "Backspace") {
           65             key = $('<div class="simpleKey" name="key" key="' + key + '" value="' + value + '">' + value + '</div>');
           66             $("#keyboardNum").append(key);
           67         }
           68         else {
           69             key = $('<div class="backspaceKey" name="key"  key="' + key + '" value="' + value + '">' + value + '</div>');
           70             $("#keyboardNum").append(key);
           71         }
           72     });
           73 
           74     $.each(keyboardLetterQ, function (key, value) {
           75         key = $('<div class="simpleKey" name="key"  key="' + key + '" value="' + value + '">' + value + '</div>');
           76         $("#keyboardLetterQ").append(key);
           77     });
           78 
           79     $.each(keyboardLetterA, function (key, value) {
           80         if (value != "Caps Lock") {
           81             key = $('<div class="simpleKey" name="key"  key="' + key + '" value="' + value + '">' + value + '</div>');
           82             $("#keyboardLetterA").append(key);
           83         }
           84         else {
           85             key = $('<div class="capslockKey" name="key"  key="' + key + '" value="' + value + '">' + value + '</div>');
           86             $("#keyboardLetterA").append(key);
           87         }
           88     });
           89 
           90     $.each(keyboardLetterZ, function (key, value) {
           91         if (value != "Shift") {
           92             key = $('<div class="simpleKey" name="key"  key="' + key + '" value="' + value + '">' + value + '</div>');
           93             $("#keyboardLetterA").append(key);
           94         }
           95         else {
           96             key = $('<div class="shiftKey" name="key"  key="' + key + '" value="' + value + '">' + value + '</div>');
           97             $("#keyboardLetterA").append(key);
           98         }
           99     });
          100 
          101     $.each(keyboardSpaceBar, function (key, value) {
          102         if (value != "Space") {
          103             key = $('<div class="simpleKey" name="key"  key="' + key + '" value="' + value + '">' + value + '</div>');
          104             $("#keyboardSpaceBar").append(key);
          105         }
          106         else {
          107             key = $('<div class="spaceKey" name="key"  key="' + key + '" value="' + value + '">' + value + '</div>');
          108             $("#keyboardSpaceBar").append(key);
          109         }
          110     });
          111 
          112     addMouseClickEvent();
          113 
          114 
          115 }
          116 
          117 //監聽鼠標點擊事件
          118 function addMouseClickEvent() {
          119     $("#close").click(function () {
          120         closeKeyboard()
          121     });
          122 
          123     $("div[name='key']").hover(function () {
          124         $(this).css("background-color", "Gray");
          125     }, function () {
          126         $(this).css("background-color", "White");
          127     }).click(function () {
          128         var thisValue = $(this).attr("value");
          129         var ID = $("#state").val();
          130         switch (thisValue) {
          131             case "": //"
          132                 $("#" + ID).val($("#" + ID).val() + "\"");
          133                 if ($("#shift").attr("checked") == true) {
          134                     if ($("#capsLock").attr("checked") != true) {
          135                         drawKeyboard("lower");
          136                     }
          137                     $("#shift").attr("checked", false);
          138                 }
          139                 break;
          140             case "Shift":
          141                 $("#shift").attr("checked", $("#shift").attr("checked") == true ? false : true);
          142                 if ($("#shift").attr("checked") == true) {
          143                     drawKeyboard("upper")
          144                 }
          145                 else {
          146                     if ($("#capsLock").attr("checked") != true) {
          147                         drawKeyboard("lower");
          148                     }
          149                 }
          150                 break;
          151             case "Caps Lock":
          152                 $("#capsLock").attr("checked", $("#capsLock").attr("checked") == true ? false : true);
          153                 $("#capsLock").attr("checked") == true ? drawKeyboard("upper") : drawKeyboard("lower");
          154                 $("#shift").attr("checked", false)
          155                 break;
          156             case "Space":
          157                 $("#" + ID).val($("#" + ID).val() + " ");
          158                 break;
          159             case "Backspace":
          160                 $("#" + ID).val($("#" + ID).val().substring(0, $("#" + ID).val().length - 1));
          161                 break;
          162             default:
          163                 $("#" + ID).val($("#" + ID).val() + thisValue);
          164                 if ($("#shift").attr("checked") == true) {
          165                     if ($("#capsLock").attr("checked") != true) {
          166                         drawKeyboard("lower");
          167                     }
          168                     $("#shift").attr("checked", false);
          169                 }
          170 
          171                 break;
          172         }
          173         $("#" + ID).focus();
          174     });
          175 }
          176 
          177 
          178 //監聽鍵盤事件
          179 function addKeydownEvent() {
          180     $("html").keydown(function (event) {
          181         var realkey = String.fromCharCode(event.keyCode);
          182 
          183         //特殊鍵
          184         if (event.keyCode == 32) { realkey = "Space" }
          185         if (event.keyCode == 13) { realkey = "Enter" }
          186         if (event.keyCode == 27) { realkey = " Esc" }
          187         if (event.keyCode == 16) {
          188             realkey = "Shift";
          189             $("#shift").attr("checked", $("#shift").attr("checked") == true ? false : true);
          190             if ($("#shift").attr("checked") == true) {
          191                 drawKeyboard("upper")
          192             }
          193             else {
          194                 if ($("#capsLock").attr("checked") != true) {
          195                     drawKeyboard("lower");
          196                 }
          197             }
          198         }
          199         if (event.keyCode == 17) { realkey = " Ctrl" }
          200         if (event.keyCode == 18) { realkey = "Alt" }
          201         if (event.keyCode == 8) { realkey = "Backspace" }
          202         if (event.keyCode == 20) { realkey = "Caps Lock"; $("#capsLock").attr("checked", $("#capsLock").attr("checked") == true ? false : true); $("#capsLock").attr("checked") == true ? drawKeyboard("upper") : drawKeyboard("lower"); }
          203 
          204 
          205         $("div[name='key']").css("background-color", "White")
          206         $("div[key=" + event.keyCode + "]").css("background-color", "Gray");
          207 
          208         //如果按了shif再按其他鍵并且這個鍵不是shif鍵盤變回小寫
          209         //如果capsLock選中了鍵盤就不用變回小寫
          210         if ($("#shift").attr("checked") == true && event.keyCode != 16) {
          211             if ($("#capsLock").attr("checked") != true) {
          212                 drawKeyboard("lower");
          213             }
          214             $("#shift").attr("checked", false);
          215         }
          216 
          217     });
          218 }
          219 
          220 //打開鍵盤
          221 function openKeyboard(ID) {
          222     $("#keyboard").css("visibility", "visible");
          223     $("#state").val(ID);
          224 }
          225 
          226 //關閉鍵盤
          227 function closeKeyboard() {
          228     $("#keyboard").css("visibility", "hidden")
          229 }
          230 
          231 
          232 $(function () {
          233     var divKeyBoard = '<div id="keyboard" class="keyboard"><div id="keyboardHead"><div><input id="shift" type="checkbox"/>Shift</div><div><input id="capsLock" type="checkbox"/>Caps Lock</div><div id="close" style="border:1px solid black; float:right; width:20px; height:20px; cursor:pointer;"><img src="/Image/close.gif" style=" width:20px; height:20px"/></div></div><div id="keyboardNum"></div><div id="keyboardLetterQ"></div><div id="keyboardLetterA"></div><div id="keyboardLetterZ"></div><div id="keyboardSpaceBar"></div></div>';
          234     $("body").append(divKeyBoard);
          235     drawKeyboard("lower");
          236     addKeydownEvent();
          237     $("#keyboard").css("visibility", "hidden");
          238     var drag = new dragMing("#keyboard", "#keyboard");
          239 
          240 })
          241 
          242       
          1 .keyboard
          2 {
          3     width:800px;
          4     height:300px;
          5     text-align:center;
          6     position:absolute;
          7 }
          8
          9 .keyboard div
          10 {
          11     height:50px;
          12 line-height:50px
          13      float:left
          14 }
          15
          16 #keyboardHead
          17 {
          18 width:800px;
          19     position:relative;
          20 }
          21
          22 #keyboardLetterQ
          23 {
          24     width:800px;
          25     position:relative;
          26     left:75px;
          27 }
          28
          29 #keyboardSpaceBar 30 {
          31     width:800px;
          32     position:relative;
          33     left:200px;
          34     top:52px;
          35 }
          36
          37 .simpleKey
          38 {
          39     width:50px;
          40     border:1px solid black;    
          41 }
          42
          43 .enterKey
          44 {
          45     width:100px;
          46     height:100px;
          47     border:1px solid black;        
          48 }
          49
          50 .shiftKey
          51 {
          52     width:115px;
          53     border:1px solid black;   
          54 }
          55
          56 .backspaceKey
          57 {
          58     width:120px;
          59     border:1px solid black;
          60 }
          61
          62 .capslockKey
          63 {
          64     width:90px;
          65     border:1px solid black;
          66 }
          67
          68 .spaceKey
          69 {
          70     width:300px;
          71     border:1px solid black;   
          72 }
          73
          74 .keyboard div[name="key"]:hover{
          75     background: Gray;
          76 }
          77
          78 .keyboard div[name="key"]
          79 {
          80     cursor:pointer;
          81 }

           

          posted @ 2012-07-06 15:38 chen11-1 閱讀(2526) | 評論 (1)編輯 收藏

          正則表達式匯總

          "^\d+$"  //非負整數(正整數 + 0
          "^[0-9]*[1-9][0-9]*$"  //正整數
          "^((-\d+)|(0+))$"  //非正整數(負整數 + 0
          "^-[0-9]*[1-9][0-9]*$"  //負整數
          "^-?\d+$"    //整數
          "^\d+(\.\d+)?$"  //非負浮點數(正浮點數 + 0
          "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮點數
          "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮點數(負浮點數 + 0
          "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //負浮點數
          "^(-?\d+)(\.\d+)?$"  //浮點數
          "^[A-Za-z]+$"  //26個英文字母組成的字符串
          "^[A-Z]+$"  //26個英文字母的大寫組成的字符串
          "^[a-z]+$"  //26個英文字母的小寫組成的字符串
          "^[A-Za-z0-9]+$"  //由數字和26個英文字母組成的字符串
          "^\w+$"  //由數字、26個英文字母或者下劃線組成的字符串
          "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址
          "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url

          整數或者小數:^[0-9]+\.{0,1}[0-9]{0,2}$
          只能輸入數字:"^[0-9]*$"。
          只能輸入n位的數字:"^\d{n}$"。
          只能輸入至少n位的數字:"^\d{n,}$"。
          只能輸入m~n位的數字:。"^\d{m,n}$"
          只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"
          只能輸入有兩位小數的正實數:"^[0-9]+(.[0-9]{2})?$"。
          只能輸入有1~3位小數的正實數:"^[0-9]+(.[0-9]{1,3})?$"
          只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。
          只能輸入非零的負整數:"^\-[1-9][]0-9"*$。
          只能輸入長度為3的字符:"^.{3}$"。
          只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"
          只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。
          只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。
          只能輸入由數字和26個英文字母組成的字符串:"^[A-Za-z0-9]+$"。
          只能輸入由數字、26個英文字母或者下劃線組成的字符串:"^\w+$"
          驗證用戶密碼:"^[a-zA-Z]\w{5,17}$"正確格式為:以字母開頭,長度在6~18之間,tb只能包含字符、數字和下劃線。
          驗證是否含有^%&'',;=?$\"等字符:"[^%&'',;=?$\x22]+"。
          只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"
          驗證Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
          驗證InternetURL"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
          驗證電話號碼:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正確格式為:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX""XXX-XXXXXXXX"、"XXXXXXX""XXXXXXXX"
          驗證身份證號(15位或18位數字):"^\d{15}|\d{18}$"。
          驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式為:"01""09""1""12"。
          驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式為;"01""09""1""31"。整數或者小數:^[0-9]+\.{0,1}[0-9]{0,2}$
          只能輸入數字:"^[0-9]*$"。
          只能輸入n位的數字:"^\d{n}$"。
          只能輸入至少n位的數字:"^\d{n,}$"
          只能輸入m~n位的數字:。"^\d{m,n}$"
          只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"
          只能輸入有兩位小數的正實數:"^[0-9]+(.[0-9]{2})?$"
          只能輸入有1~3位小數的正實數:"^[0-9]+(.[0-9]{1,3})?$"。
          只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。
          只能輸入非零的負整數:"^\-[1-9][]0-9"*$
          只能輸入長度為3的字符:"^.{3}$"
          只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"
          只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。
          只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。
          只能輸入由數字和26個英文字母組成的字符串:"^[A-Za-z0-9]+$"
          只能輸入由數字、26個英文字母或者下劃線組成的字符串:"^\w+$"。
          驗證用戶密碼:"^[a-zA-Z]\w{5,17}$"正確格式為:以字母開頭,長度在6~18之間,只能包含字符、數字和下劃線。
          驗證是否含有^%&'',;=?$\"等字符:"[^%&'',;=?$\x22]+"。
          只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"
          驗證Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
          驗證InternetURL"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
          驗證電話號碼:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正確格式為:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX""XXXXXXXX"
          驗證身份證號(15位或18位數字):"^\d{15}|\d{18}$"。
          驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式為:"01""09""1""12"。
          驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式為;"01""09""1""31"。

          posted @ 2012-07-05 13:26 chen11-1 閱讀(1101) | 評論 (1)編輯 收藏

          如何使自己的程序只運行一次

          我介紹兩個主流的方法。

          方法一:使用Mutex來進行

          1. 首先要添加如下的namespace:

          using System.Threading;


          2. 修改系統Main函數,大致如下:

          bool bCreatedNew;

          //Create a new mutex using specific mutex name
          Mutex m =new Mutex( false, "myUniqueName", out bCreatedNew );
          if( bCreatedNew )
          Application.Run(new yourFormName());

          如上面編碼就可以了,要注意的一點是,在給Mutex起名字的時候,不要太簡單,以tb防止和其他程序的Mutex重復,從而達不到所預想的效果。


          方法二:使用Process來進行

          1. 首先要添加如下的namespace:

          using System.Diagnostics;
          using System.Reflection;

          2. 添加如下函數:

          public static Process RunningInstance()
          {
          Process current = Process.GetCurrentProcess();
          Process[] processes = Process.GetProcessesByName(current.ProcessName);

          //Loop through the running processes in with the same name
          foreach (Process process in processes)
          {
          //Ignore the current process
          if (process.Id != current.Id)
          {
          //Make sure that the process is running from the exe file.
          if (Assembly.GetExecutingAssembly().Location.Replace("/", "http://") == current.MainModule.FileName)
          {
          //Return the other process instance.
          return process;
          }
          }
          }

          //No other instance was found, return null.
          return null;
          }

          3. 修改系統Main函數,大致如下:

          if( RunningInstance() == null )
          Application.Run(new yourFormName());

          如上面編碼就可以了,要注意的一點是,在判斷進程模塊文件名是否相等這部分的代碼,是可選的。如果當前的程序在文件系統中只存在一個的話,以上的方法是可以的;否則不要刪除這部分的代碼。


          對比兩種方法,就效率和簡便性來說,前一種方法是最好的,也是我比較喜歡的;后一種方法,速度比較慢,其次通過ProcessName去系統中查尋,有可能查出來的Process并不是我想要得,雖說在后面加了文件目錄判斷,但是其含有潛在的問題(前面已經說出來)。不過,第一種方法也有缺陷,就是擴展性操作不方便,例如:讓程序只運行一次,如果程序已經運行,把它彈出并顯示到最前面。對于此,后一種方法就很有優勢了。

           

          posted @ 2012-07-05 13:25 chen11-1 閱讀(772) | 評論 (0)編輯 收藏

          JAVA獲取CLASSPATH路徑

          ClassLoader 提供了兩個方法用于從裝載的類路徑中取得資源:

                  public URL  getResource (String name); 
                  public InputStream  getResourceAsStream (String name); 

                 這里name是資源的類路徑,它是相對與“/”根路徑下的位置。getResource得到的是一個URL對象來定位資源,而getResourceAsStream取得該資源輸入流的引用保證程序可以從正確的位置抽取數據。
                 但是真正使用的不是ClassLoader的這兩個方法,而是Class的 getResource和getResourceAsStream方法,因為Class對象可以從你的類得到(如YourClass.class或 YourClass.getClass()),而ClassLoader則需要再調用一次YourClass.getClassLoader()方法,不過根據JDK文檔的說法,Class對象的這兩個方法其實是“委托”(delegate)給裝載它的ClassLoader來做的,所以只需要使用 Class對象的這兩個方法就可以了。

                 因此,直接調用  this.getClass().getResourceAsStream(String name) ;獲取流,靜態化方法中則使用ClassLoader.getSystbemResourceAsStream (String name) ; 。

                下面是一些得到classpath和當前類的絕對路徑的一些方法。你可能需要使用其中的一些方法來得到你需要的資源的絕對路徑。

          1.this.getClass().getResource("")
          得到的是當前類class文件的URI目錄。不包括自己!
          如:file:/D:/workspace/jbpmtest3/bin/com/test/

          2.this.getClass().getResource("/")
          得到的是當前的classpath的絕對URI路徑
          如:file:/D:/workspace/jbpmtest3/bin/

          3.this.getClass() .getClassLoader().getResource("")
          得到的也是當前ClassPath的絕對URI路徑
          如:file:/D:/workspace/jbpmtest3/bin/

          4.ClassLoader.getSystemResource("")
          得到的也是當前ClassPath的絕對URI路徑 。
          如:file:/D:/workspace/jbpmtest3/bin/

          5.Thread.currentThread().getContextClassLoader ().getResource("")
          得到的也是當前ClassPath的絕對URI路徑
          如:file:/D:/workspace/jbpmtest3/bin/

          6.ServletActionContext.getServletContext().getRealPath(“/”)
          Web應用程序 中,得到Web應用程序的根目錄的絕對路徑。這樣,我們只需要提供相對于Web應用程序根目錄的路徑,就可以構建出定位資源的絕對路徑。
          如:file:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/WebProject


          注意點:

          1.盡量不要使用相對于System.getProperty("user.dir")當前用戶目錄的相對路徑。這是一顆定時炸 彈,隨時可能要你的命。

          2.盡量使用URI形式的絕對路徑資源。它可以很容易的轉變為URI,URL,File對象。

          3.盡量使用相對classpath的相對路徑。不要使用絕對路徑。使用上面ClassLoaderUtil類的public static URL getExtendResource(String relativePath)方法已經能夠使用相對于classpath的相對路徑定位所有位置的資源。

          4.絕對不要使用硬編碼的絕對路徑。因為,我們完全可以使用ClassLoader類的getResource("")方法得到當前classpath的絕對路徑。如果你一定要指定一個絕對路徑,那么使用配置文件,也比硬編碼要好得多!

          獲得CLASSPATH之外路徑的方法:
          URL base = this.getClass().getResource(""); //先獲得本類的所在位置,如/home/popeye/testjava/build/classes/net/ 
                String path = new File(base.getFile(), "……/……/……/"+name).getCanonicalPath(); //就可以得到/home/popeye/testjava/name

          另外,如果從ANT啟動程序,this.getClass().getResource("")取出來的比較怪,直接用JAVA命令行調試就可成功。

          posted @ 2012-07-04 13:17 chen11-1 閱讀(1180) | 評論 (0)編輯 收藏

          通過 JavaScript 獲取頁面上的鼠標位置

          用 JS 計算鼠標在頁面上的位置并非難事, 只要把握好各瀏覽器的區別就可以輕易算出鼠標位置. (這是 DEMO)

          視窗 (瀏覽器可視窗口) 就像是頁面上的掩板開了一個洞. 滾動條可以改變頁面和視窗之間的偏移量, 從而可以通過視窗看到頁面的各個位置.
          鼠標在頁面上的位置 = 頁面和視窗之間的偏移量 + 鼠標在視窗中的位置

          圖中的 cursorX 和 cursorY 分別是鼠標在視窗中的橫向和縱向位置, scrollY 是tb頁面和視窗之間的縱向距離. 當然, 當視窗寬度小于頁面寬度的時候, 還會存在 scrollX. 那么鼠標在頁面上的位置就是: (scrollX+cursorX, scrollY+cursorY)

          IE 以外的瀏覽器 (本人測試過 Firefox 3.6, Opera 10.10, Chrome 4.1 和 Safari 4.0.4) 均可以通過 pageXOffset 和 pageYOffset 來獲取頁面和視窗間的橫縱距離. 但 IE (本人測試過 IE6, IE7, IE8) 只能通過滾動位移來獲取頁面和視窗間的距離, 并存在一到兩個像素的偏離.

          以下是獲取鼠標在頁面上位置的代碼實現. (這是 DEMO)

          /**
           * 獲取鼠標在頁面上的位置
           * @param ev		觸發的事件
           * @return			x:鼠標在頁面上的橫向位置, y:鼠標在頁面上的縱向位置
           */
          function getMousePoint(ev) {
          	// 定義鼠標在視窗中的位置
          	var point = {
          		x:0,
          		y:0
          	};
           
          	// 如果瀏覽器支持 pageYOffset, 通過 pageXOffset 和 pageYOffset 獲取頁面和視窗之間的距離
          	if(typeof window.pageYOffset != 'undefined') {
          		point.x = window.pageXOffset;
          		point.y = window.pageYOffset;
          	}
          	// 如果瀏覽器支持 compatMode, 并且指定了 DOCTYPE, 通過 documentElement 獲取滾動距離作為頁面和視窗間的距離
          	// IE 中, 當頁面指定 DOCTYPE, compatMode 的值是 CSS1Compat, 否則 compatMode 的值是 BackCompat
          	else if(typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') {
          		point.x = document.documentElement.scrollLeft;
          		point.y = document.documentElement.scrollTop;
          	}
          	// 如果瀏覽器支持 document.body, 可以通過 document.body 來獲取滾動高度
          	else if(typeof document.body != 'undefined') {
          		point.x = document.body.scrollLeft;
          		point.y = document.body.scrollTop;
          	}
           
          	// 加上鼠標在視窗中的位置
          	point.x += ev.clientX;
          	point.y += ev.clientY;
           
          	// 返回鼠標在視窗中的位置
          	return point;
          }

          記得以前我寫過一個減速滾動置頂的 JavaScript 方法, 也是通過計算視窗和頁面高度來實現的, 其計算方法與本文的方法不同小異, 也可以搬過來用.

          這幾個月來, 專注前端項目的開發, 也算小有收獲, 最近我會將一些積累作成文章分享于眾. 以此作為鋪墊, 由淺入深, 希望可以帶出一些有用的內容.

          posted @ 2012-07-04 13:15 chen11-1 閱讀(183) | 評論 (0)編輯 收藏

          JS的event對象使用總結

          Event屬性和方法:

          1. type:事件的類型,如onlick中的click;

          2. srcElement/target:事件源,就是發生事件的元素;

          3. button:聲明被按下的鼠標鍵,整數,1代表左鍵,2代表右鍵,4代表中鍵,如果按下多個鍵,酒把這些值加起來,所以3就代表左右鍵同時按下;(firefox中 0代表左鍵,1代表中間鍵,2代表右鍵)

          4. clientX/clientY:事件發生的時候,鼠標相對于瀏覽器窗口可視文檔區域的左上角的位置;(在DOM標準中,這兩個屬性值都不考慮文檔的滾動情況,也就是說,無論文檔滾動到哪里,只要事件發生在窗口左上角,clientX和clientY都是 0,所以在IE中,要想得到事件發生的坐標相對于文檔開頭的位置,要加上
          document.body.scrollLeft和 documentb.body.scrollTop)

          5. offsetX,offsetY/layerX,layerY:事件發生的時候,鼠標相對于源元素左上角的位置;

          6. x,y/pageX,pageY:檢索相對于父要素鼠標水平坐標的整數;

          7. altKey,ctrlKey,shiftKey等:返回一個布爾值;

          8. keyCode:返回keydown何keyup事件發生的時候按鍵的代碼,以及keypress 事件的Unicode字符;(firefox2不支持 event.keycode,可以用 event.which替代 )

          9. fromElement,toElement:前者是指代mouseover事件中鼠標移動過的文檔元素,后者指代mouseout事件中鼠標移動到的文檔元素;

          10. cancelBubble:一個布爾屬性,把它設置為true的時候,將停止事件進一步起泡到包容層次的元素;(e.cancelBubble = true; 相當于 e.stopPropagation();)

          11. returnValue:一個布爾屬性,設置為false的時候可以組織瀏覽器執行默認的事件動作;(e.returnValue = false; 相當于 e.preventDefault();)

          12. attachEvent(),detachEvent()/addEventListener(),removeEventListener:為制定DOM對象事件類型注冊多個事件處理函數的方法,它們有兩個參數,第一個是事件類型,第二個是事件處理函數。在
          attachEvent()事件執行的時候,tbhis關鍵字指向的是window對象,而不是發生事件的那個元素;

          13. screenX、screenY:鼠標指針相對于顯示器左上角的位置,如果你想打開新的窗口,這兩個屬性很重要;


          一些說明:

          1.  event代表事件的狀態,例如觸發event對象的元素、鼠標的位置及狀態、按下的鍵等等;

          2.  event對象只在事件發生的過程中才有效。
          firefox里的event跟IE里的不同,IE里的是全局變量,隨時可用;firefox里的要用參數引導才能用,是運行時的臨時變量。
          在IE/Opera中是window.event,在Firefox中是event;而事件的對象,在IE中是window.event.srcElement,在Firefox中是event.target,Opera中兩者都可用。

          3.  下面兩句效果相同
          var evt = (evt) ? evt : ((window.event) ? window.event : null);
          var evt = evt || window.event; // firefox下window.event為null, IE下event為null

          4.  IE中事件的起泡
          IE中事件可以沿著包容層次一點點起泡到上層,也就是說,下層的DOM節點定義的事件處理函數,到了上層的節點如果還有和下層相同事件類型的事件處理函數,那么上層的事件處理函數也會執行。例如, div 標簽包含了 a ,如果這兩個標簽都有onclick事件的處理函數,那么執行的情況就是先執行標簽 a 的onclick事件處理函數,再執行 div 的事件處理函數。如果希望的事件處理函數執行完畢之后,不希望執行上層的 div 的onclick的事件處理函數了,那么就把cancelBubble設置為true即可。

          posted @ 2012-07-04 13:14 chen11-1 閱讀(894) | 評論 (0)編輯 收藏

          僅列出標題
          共20頁: First 上一頁 12 13 14 15 16 17 18 19 20 下一頁 
          主站蜘蛛池模板: 通州市| 上虞市| 屏南县| 怀集县| 沈阳市| 宁德市| 宾阳县| 康马县| 湾仔区| 邯郸市| 抚顺县| 吉林市| 怀宁县| 乌拉特前旗| 常德市| 永胜县| 璧山县| 保康县| 义马市| 资中县| 蚌埠市| 德令哈市| 林周县| 柳江县| 年辖:市辖区| 巧家县| 金寨县| 都江堰市| 郸城县| 阜阳市| 舟曲县| 来安县| 西安市| 邯郸县| 赣州市| 吉首市| 务川| 社会| 静海县| 镇赉县| 五大连池市|