關於我

我的相片
用心思考、保持熱情,把工作上的經驗作分享與紀錄。希望能夠跟大家一起不斷的成長~
顯示具有 JavaScript 標籤的文章。 顯示所有文章
顯示具有 JavaScript 標籤的文章。 顯示所有文章

JQuery Selector 使用實例分享

擷取
今天有個需求,功能如上圖,可讓User任意勾選所需項目,且後方可輸入所需數量。
額外希望可達到的功能需求如下:

  1. 項目未勾選時,後方為不可輸入狀態,且預設值為0。
  2. 項目勾選後,後方即改變狀態為可輸入,且數量預設為1。
  3. 數量欄位只可輸入數字。
  4. 如項目已被勾選,則數量不可為0。
  5. 如項目已被勾選,則需求欄位不可為空。

上方輸入表單,使用ListView實作,實際aspx頁面如下:

<table id='ItemsTable'>  
  <asp:ListView ID="ListView2" runat="server">  
    <ItemTemplate>  
      <tr>  
        <td valign="top">  
          <asp:CheckBox ID="cbitem" runat="server" Text='<%# Eval("ItemName") %>' />  
          <asp:Label ID="Label4" runat="server" Text="( 需求數量:" Visible='<%# Eval("NeedQty") %>' />  
          <asp:TextBox ID="tbQty" runat="server" Width="30px" Visible='<%# Eval("NeedQty") %>'  
            Text="0" Enabled="false" MaxLength="5" JQ="tbQty" />  
          <asp:Label ID="Label5" runat="server" Text=" )" Visible='<%# Eval("NeedQty") %>' />  
        </td>  
      </tr>  
    </ItemTemplate>  
  </asp:ListView>  
</table>

下方為Jquery實作部分,將此段Script,置於Header中即可。

<% if (false)  
    { %>  
<script src="../Script/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>  
<% } %>  
<script type="text/javascript">  
  $(document).ready(function () {  
    //CheckBox互動,以Table的ID=ItemTable,找這個Table裡的checkbox (input type=checkbox)  
    $('#ItemsTable :checkbox').change(function () {  
      //取得被點選CheckBox的ClientID.  
      var ckid = $(this).attr('id');  
      //找到被點選的CheckBox後的第一個Type=text的ClientID.  
      var tbid = $('#' + ckid + ' ~ :text').first().attr('id');  
      if ($('#' + tbid).length == 1) {  //如果有正確取到TextBox(因這個TextBox為動態顯示)  
        //取得是否被勾選  
        var cked = $(this).attr('checked');  
        if (cked) {  
          $('#' + tbid).val('1');  //被勾選,將TextBox值改為,數量1  
          $('#' + tbid).attr('disabled', ''); //設定是否可更改  
        } else {  
          $('#' + tbid).val('0');  //被取消勾選,將TextBox值改為,數量0  
          $('#' + tbid).attr('disabled', 'disabled'); //設定是否可更改  
        }  
      }  
    });
  
    //TextBox檢核互動,以Table的ID=ItemTable,找這個Table裡的textbox (input type=textbox)  
    $('#ItemsTable :text').keyup(function () {  
      //檢查是否含非數字字元  
      if (isNaN($(this).val())) {  
        alert('只可輸入數字字元!');  
        this.value = this.value.replace(/[\D]/g, '');  
      }  
      //檢查是否只輸入0  
      if ($(this).val() == '0') {  
        alert('至少要有數量1!');  
        this.value = '1';  
      }  
    }).focusout(function () {  
      //檢查是否未輸入數量  
      if ($(this).val() == '') {  
        alert('至少要有數量1!');  
        this.value = '1';  
      }  
    });  
  });    
</script>

分享給大家。

讓 FCKEditor 的 Link : MailTo 功能,改用 Big5 編碼

FCKEditor 是個很讚的線上編輯器,這模組,可讓我們直接在線上,類似使用frontpage等工具一樣的操作,去編寫一個網頁。因此也被許多論壇所採用!如果有機會,看看FCKEditor的Source,會發現它基本上是個幾乎全部使用Javascript動態產生的環境。真的是嘆為觀止!今天要介紹的是一個在這編輯器上的客製功能。

因為我們慣用語言是中文,中文在編碼上要相當注意,不然時常會發生亂碼的問題,例如FckEditor的Link模組中,可讓我們加入MailTo功能,畫面如下:
1
而編輯器最後便會幫我們在網頁上,加入一個如:mailto:電子郵件地址?subject=主題&body=內文,的連結。而問題也就發生在主題與內文的部分,FCKEditor預設會幫我們把主題與內文的部分,做Javascript的Encode,Encode過得編碼為UTF-8的格式(FCKeditor預設使用encodeURIComponent方法做Encode),但這樣的連結,就必須考慮到讀取的介面是否支援了,例如outlook是否支援。經過測試,outlook 2010 以前的版本,均只支援讀取big5的編碼格式,而outlook 2010 則只支援使用unicode編碼。因此FCKEditor編輯器產生的MailTo連結,在使用outlook 2010開啟時,十分正常,但其他之前版本的outlook則全部變成亂碼。
因此有了今天這篇文章,如何在FCKEditor自訂,讓MailTo改使用Big5編碼。時做的步驟如下:

  1. 我們要先新增兩個aspx的頁面,用於接收client的資訊,在Server端將字串用Big5編碼格式做URLEncode與URLDecode後回傳。
    新增一個頁面FCKbig5encode.aspx,用於將字串做URLEncode。
    <%@ Page Language="C#" %>
    
    <% 
        if (Request.QueryString["data"] != null)
        {
            try
            {
                string data = HttpUtility.UrlDecode(Request.QueryString["data"]);
                string big5encode = HttpUtility.UrlEncode(data, Encoding.GetEncoding("Big5"));
                Response.Write(big5encode);
            }
            catch
            {
                Response.Write(Request.QueryString["data"]);
            }
        }
        else
        {
            Response.Write(Request.QueryString["data"]);
        }           
    %>
    新增第二個頁面FCKbig5decode.aspx,用於將字串做URLDecode。
    <%@ Page Language="C#" %>
    
    <% 
        if (Request.QueryString["data"] != null)
        {
            try
            {            
                string data = Request.QueryString["data"];
                string big5encode = HttpUtility.UrlDecode(data, Encoding.GetEncoding("Big5"));
                Response.Write(big5encode);
            }
            catch
            {
                Response.Write(Request.QueryString["data"]);
            }
        }
        else
        {
            Response.Write(Request.QueryString["data"]);
        }           
    %>
    將以上兩個檔案,新增於路徑 fckeditor\editor\dialog\fck_link\ 下。
  2. 再找到 fckeditor 處理 link 相關的 js 檔,fck_link.js。(我使用的版本2.6.5,路徑於fckeditor\editor\dialog\fck_link\fck_link.js ,如與您使用的版本,或路徑不相同,再自行對應變更路徑與新增頁面。)
  3. 開啟 fck_link.js 後,插入下方兩段Javascirpt ,使用此兩段Javascript,讓Client 端 Javascript 可直接呼叫,將字串做 big5 的 URLEncode。
    第一段用來與Server端FCKbig5encode.aspx頁面互動,做字串的Encode 
    function Big5encodeURIComponent(str) {
        var xml = new ActiveXObject("MSXML2.XMLHTTP");
        var data = encodeURIComponent(str);
        xml.open("get", "fck_link/FCKbig5encode.aspx?data=" + data, false);
        xml.send();
        return xml.responseText;
    }
    第二段用來與Server端FCKbig5decode.aspx頁面互動,做字串的Decode
    function Big5decodeURIComponent(str) {
        var xml = new ActiveXObject("MSXML2.XMLHTTP");
        var data = encodeURIComponent(str);
        xml.open("get", "fck_link/FCKbig5decode.aspx?data=" + data, false);
        xml.send();
        return xml.responseText;
    }
  4. 接下來將 fck_link.js 中 MailTo 相關部分,原來使用 encodeURIComponent 方法的部分,全部替換成 big5encodeURIComponent,以此類推,也將相關的decodeURIComponent 方法的部分,全部替換成 big5decodeURIComponent。這樣就完成讓FCKEditor使用big5編碼做URLEncode囉~
不過以下幾點要特別小心注意:
  1. 因為使用的是Big5編碼格式,所以要小心一些難字會變成問號(?),例如;堃。
  2. 在要編碼的內文中,要特別注意是否有(),這兩個符號。這兩個符號在Javascript encodeURIComponent方法中,會被排除不做URLEncode,但因這裡是使用Xml.open將資訊送回Server端做處理,當送回的Querystring中有(),這兩個符號。會發生錯誤,因此要小心不可有這兩個字元。如要使用,可使用全形的括弧,即可避免這個錯誤。
  3. URL有最大長度的限制,上Google查到的資訊是最大長度限制為2083個字元,但我測試得結果是2031個字元,但要小心有些字元可能在產稱mailto的url時,會再被編碼成HtmlEncode,例如&字元,會被HtmlEncode為&amp;,所以在最後呈現在Html上的字數限制計算上,要十分注意。不然會有無法開啟mailto、或有錯誤訊息的狀況發生。
以上分享給大家~

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

[2010/07/22]最新訊息,上方有提到,outlook 2010已改 mailto 使用 utf-8 編碼格式。這是說法是錯誤的,說明如下:

正確來說,應該是在新版本的IE8中(不太確定是否是IE8、或更早版本、或其實在系統中亦可設定?!),加入了一個選項,截圖如下:

擷取

這個選項便影響整體OS中,所有由瀏覽器送出 mailto 連結給 outlook 時所使用的編碼方式!

Javascript URLEncode - escape , encodeURI , encodeURIComponent 的差異

在使用Javascript的URL encode時,常不清楚該使用哪一種方式,
今將escape、encodeURI、encodeURIComponent三種方法得差異整理如下:

參考幾篇不錯的文章:

  1. 清楚解釋各encode對中文的編碼方式:用Javascript替中文轉碼:escape, encodeURI, encodeURIComponent 的比較
  2. https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/encodeURI
  3. https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/encodeURIComponent
  4. http://blog.miniasp.com/?tag=/encodeuri
  5. http://diary.tw/march/category/Javascript

並依得到的資訊,實際測試字串"A Z a z 0 1 堃 - _ . ! ~ * ' ( ) ; , / ? : @ & = + $ #"等字元,在被不同JavaScript URLEncode方法Encode後的結果,整理如下表:

文字類型 英文 數字 中文 Unescaped characters Reserved characters Score
原始字串 A Z a z 0 1 - _ . ! ~ * ' ( ) ; , / ? : @ & = + $ #
escape後 A Z a z 0 1 %u5803 - _ . %21 %7E * %27 %28 %29 %3B %2C / %3F %3A @ %26 %3D + %24 %23
encodeURI後 A Z a z 0 1 %E5%A0%83 - _ . ! ~ * ' ( ) ; , / ? : @ & = + $ #
encodeURI
Component後
A Z a z 0 1 %E5%A0%83 - _ . ! ~ * ' ( ) %3B %2C %2F %3F %3A %40 %26 %3D %2B %24 %23

ps. 上表紅色字體表示部分,是突顯各Encode方法,不會做Encode的字元!

由上方的資訊可以整理出一些結論:

  1. 英文字數字-_.* 這些字不管是哪一種Javascript URLEncode方式,都是不會被encode的!
  2. 各Encode方法,都是Encode為Unicode,但escape是Encode為UTF-16、而encodeURI與encodeURIComponent則是UTF-8
  3. 因為 Javascript 都是 Encode 為 Unicode ,因此如有特殊用途須使用Big5編碼,需自行想辦法處理,例如 URI 中的 MailTo: 用法,outlook2010以前的版本,都只支援讀取Big5編碼! 但outlook 2010 卻又只支援讀取 Unicode @@。
  4. 符號部分,UTF-8與UTF-16的結果相同,因此上表可看到,除了被排除不Encode的字元外,使用escape與encodeURIComponent做Encode後的結果是相同的!
  5. 中文字部分,因 UTF-16 與 UTF-8 的編碼結果不同(可參考上表差異),所以如內容有中文,則必須慎選Encode的方式,不然就要有對應的處理方式!
  6. encodeURI 與 encodeURIComponent 的差異是,encodeURI 會排除對 URL 有特殊意義的字元不做編碼,因此會排除 Reserved characters 與 Score 類型的字元。
  7. encodeURI 與 encodeURIComponent 均會排除 Unescaped characters 類型的字元。

所以在使用時,我認為可由兩方面去思考,判斷應使用哪一種Encode:

  1. 您要Encode的內容,適合使用哪一種編碼方式?! UTF-8 還是 UTF-16 ?!
    (這點跟使用的環境支援哪一種Encode … 等會有相關。)
  2. 您要Encode的內容,是否包含了於 URI 有特殊意義的字元?!
大致上這三種 javascript 的 URLEncode 方式特性整理如上。 希望下次使用時,可以清楚分辨該使用哪一種囉~~~

javascript windows.location

當我們在撰寫Asp.Net時, 如果要讓程式於執行完成時,

可出現Message,最常的用法是在codebehidn寫入下方程式:

Page.ClientScript.RegisterStartupScript(this.GetType(), "Msg", "<script>alert('執行成功');</script>");

即可讓程式在Response時,寫入client的script,跳出訊息視窗.

 

但當遇到希望可以回傳成功的訊息,並跳轉導入其他頁面.

如果使用下方的寫法:

Page.ClientScript.RegisterStartupScript(this.GetType(), "Msg", "<script>alert('執行成功');</script>"); 
Page.Response.Redirect("xxx.aspx");

先註冊一段client端的Script,接著再將Response導至預期的頁面。

看似一切都沒什麼問題,但當實際執行時,便會發生訊息不見的冏境。

 

實際分析了一下,原因很簡單,因為頁面已經被導至其他頁面了.

所以被註冊在原始頁面的Script,當然不會被執行到囉!

自然而然,訊息是不會出現的.

 

可是那要怎麼辦呢?!沒有辦法可以做到這個功能嗎?!

有的,可參考下面的這行程式:

Page.ClientScript.RegisterStartupScript(this.GetType(), "Msg", "<script>alert('執行成功'); window.location = 'xxx.aspx';</script>");

發現了嗎?!我們將導至其他頁面的動作,保留到Client再由JavaScript去完成他!

這樣就可以在不影響訊息顯示的情況下,依然導入預期頁面了!

 

這就是好用的JavaScript "windows.location"!

JavaScript進階技巧

<%--進階JavaScript<1>物件方法屬性操作--%>
<script type="text/javascript">
  //委派Function?!   
  function say(msg) { alert(this.Name + ' 說:' + msg); }

  //建立物件
  var person = new Object();
  person.Name = "Sam";
  person.say = say;

  //取得屬性與呼叫方法
  alert("Name = " + person.Name);
  person.say("Hello !");

  //透過名稱字串呼叫方法與取得屬性
  alert("Name = " + person["Name"]);
  person["say"]("Hello !");
</script>

 

 

<%--進階JavaScript<2>匿名方法--%>
<script type="text/javascript">
  //建立物件
  var person = new Object();
  person.Name = "Peggy";
  //匿名方法設定方法
  person.say = function(msg) { alert(this.Name + ' 說:' + msg) };

  //取得屬性與呼叫方法
  alert("Name = " + person.Name);
  person.say("匿名方法耶 !");

  //透過名稱字串呼叫方法與取得屬性
  alert("Name = " + person["Name"]);
  person["say"]("匿名方法耶 !");
</script>

<%--進階JavaScript<3>匿名物件--%>
<script type="text/javascript">
  //建立匿名物件
  var person = {
    Name: "Peggy and Sam",
    say: function(msg) { alert(this.Name + ' 說:' + msg); }
  };

  //取得屬性與呼叫方法
  alert("Name = " + person.Name);
  person.say("匿名物件耶 !");

  //透過名稱字串呼叫方法與取得屬性
  alert("Name = " + person["Name"]);
  person["say"]("匿名物件耶 !");
</script>

onkeydown Event


於TextBox使用onkeydown事件,讓此TextBox為Readonly狀態, 因為搭配AJAX之UpdatePanel使用時,如果直接將TextBox設定為ReadOnly="true"的話. 將導致此TextBox的值不會被ViewState紀錄.導致只要一更新所輸入的值便消失! 所以應用此小技巧!

javascript get aspnet textbox value

方法如下,請參考
document.getElementById("<%= TextBoxID.ClientID %>").value

JavaScript Events

http://www.comptechdoc.org/independent/web/cgi/javamanual/javaevents.html

Javascript 事件觸發(Event Binding)的方式整理

Javascript 事件觸發(Event Binding)的方式整理

事件觸發(Event Binding)的方式 (註:紅色斜體字寫碼時自行替換) 1. Element Attributes [語法] <html> <head> <title>......</title> <script language="JavaScript"> <!-- function function-name(parameters) { ...... } // --> </script> </head> <body> <html-tag other-attributes event-handler="function-name(arguments);">......</html-tag> </body> </html> [說明] ‧利用 Element Attributes 的方式觸發定義在 <head> 區段內 <script> 標籤區塊內的 function。 ‧此種方式可藉由傳遞特殊的參數值(this 關鍵字) 給事件處理函數(event handler's function)。 [範例] <script language="JavaScript"> function convertToUpper(mytextbox) { mytextbox.value = mytextbox.value.toUpperCase(); } </script> ...... <FORM ....> <INPUT type="text" name="first_name" onChange="convertToUpper(this)"> <INPUT type="text" name="last_name" onChange="convertToUpper(this)"> ...... </FORM> 2. Object Properties [說明] ‧利用 script 程式碼將 event 與某個 element object 作連結。 ‧此種方式的 tag 屬性(attribute) 的狀態名稱(property name) 須為小寫字母,如 onmouseover(NN4 的狀態名稱可接受 interCap 方式)。 ‧當指派某個 function 參考到 event property,只須指定 function 名稱,function 名稱後不用接 () 括號和該 function 的定義。 [範例] document.forms[0].myButton.onclick = myFunc; 3. 利用 IE 的 <script for> [說明] ‧利用 tag 的 FOR 和 EVENT 屬性作事件連結(並非 W3C 制定的標準)。 ‧FOR 的屬性值設定與某 html 元件的 ID 值,然後在 EVENT 屬性值中設定所要觸發的事件名稱(onmouseover, onclick等)。 ‧此種方式的 script 程式碼並非定義在 function 內,而是定義在 <script> 標籤內。 [範例] <INPUT type="button" name="myButton" id="button1" value="Click Here"> <script for="button1" event="onclick"> ...... // script 程式碼 </script> [範例] <span id="testscript">Click me script block handler - JScript</span> <script language="JScript" for="testscript" event="onclick"> alert("script block handler - JScript"); </script> 4. 使用 IE5+ 的 attachEvent() 方式(只適用 IE5+) [語法] element-object.attachEvent("event-name", function-reference);    參數 event-name 的值為字串型態的事件名稱(event name),例如 onmousedown。    參數 function-reference 為因事件所觸發連結的 function,function 後不用接括號(),直接使用 function 名稱即可。 [說明] ‧利用 IE5+ 的 attachEvent() 方法可作事件觸發。 ‧此種方式的限制為:瀏覽器載入此 element's tag 前無法執行該 javascript 程式碼。因此此種事件觸發控制的程式碼通常寫在 html 文件的結尾處,或在 body 元件中利用 onLoad 函式指定事件觸發處理程式。 [範例] document.all.button1.attachEvent("onclick", myFunc); [範例] document.getElementById("button1").attachEvent("onclick", myFunc); 5. 指定 tag 的 id 值與事件關係(只適用 IE) [語法] function tag-id.event-name( ) { ...... }    或    function tag-id::event-name( ) { ...... } [說明] ‧IE 可直接利用設定 function 的名稱來觸發事件。 ‧function 名稱設定方式為「id名稱.事件名稱」或「id名稱 ::事件名稱」。 [範例] <span ID="sixties" >Hello World!!</span> <script> function sixties.onmousemove() { event.srcElement.style.color=Math.floor(Math.random()*16777216); } </script> [範例] <script type="text/JScript"> function window::onload(){ alert("Hello!"); } function window.onbeforeunload(){ alert("Goodbye!"); } </script> 6. W3C 制定的 DOM -- addEventListener() Method [語法] node-reference.addEventListener("event-type", listener-reference, capture-flag);    W3C DOM 制定的規格中,參數 event-type 為事件型態(前面不加"on"),例如 click、mousedown,和 keypress 等。    參數 capture-flag 為 Boolean 值(通常為false)-- 此方法稱為 event propagation。 [說明] ‧Netscape 6 採用 W3C DOM Level 2 的 event binding 機制,類似 IE5∕Windows 的 attachEvent() 函數。 ‧W3C DOM 在 DOM 的階層架構(hierarchy)下可指派每一 node 的 addEventListener()。 ‧當某個 html 標籤屬於 DOM node 型態時(包含在 element's tag 內的,如 text node),皆可做事件觸發。 [範例] 改寫 <body onload="dothis()"> 為跨 browser 寫法<script type="text/javascript"> if (window.addEventListener) { // DOM method for binding an event window.addEventListener("load", dothis, false); } else if (window.attachEvent) { // IE exclusive method for binding an event window.attachEvent("onload", dothis); } else if (document.getElementById) { // support older modern browsers window.onload=dothis; } </script>