顯示具有 網頁設計 標籤的文章。 顯示所有文章
顯示具有 網頁設計 標籤的文章。 顯示所有文章

2010年4月14日

如何在下載動作中正確顯示中文檔名?

總而言之,除了為人垢病的 CSS 問題外,各家瀏覽器在下載中文檔名時也有各自的脾氣...

以下是 JAVA 程式碼範例,大致上就分成兩派:支援 RFC-2231 的 Firefox/Opera 系和不支援的 IE /Webkit 系兩種,在 Test Cases for HTTP Content-Disposition header and RFC 2231/2047 Encoding 網站中有對各家瀏覽器是否支援 RFC-2231 規範的測試記錄,就結果來看除了純 ASCII 編碼的檔名頗受大家都支援外 (?),其他混雜有各地語言的檔案名稱就得依瀏覽器的派別個別處理了。

if ( StringUtils.contains( userAgent, "MSIE" ) || StringUtils.containsIgnoreCase( userAgent, "AppleWebKit" ) ) {
    res.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode( fileName, "UTF-8" ) + "\"");
} else {
    res.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + URLEncoder.encode( fileName, "UTF-8" ) );
}

就目前測試結果得知:

  1. IE 6:可以正確彈出下載視窗,但存檔時的不一定能顯示正確的中文檔名
  2. IE 7/8:可以正確彈出下載視窗及中文檔名
  3. Chromium 5.0.360.5 / Chrome 5.0.375.3 dev:可以正確彈出下載視窗及中文檔名,其 AppleWebKit 核心版本分別為 533.3 及 533.4
  4. Safari 4.0.5:在 AppleWebKit/531.22.7 時兩種方式都不行,但因 Chrome 的經驗猜測更新 AppleWebKit 到 5.33 以後版本即可正確顯示中文檔名
  5. Firefox 3.x:可以正確彈出下載視窗及中文檔名
  6. Opera 10.51:可以正確彈出下載視窗及中文檔名

2009年11月16日

ExtJS 筆記 - EXTJS 的事件處理函式

jQuery 不同,ExtJS 的事件處理函式略顯複雜了些!原因在於 jQuery 的事件綁定機制永遠只作用於 jQuery 物件,但 ExtJS 的事件綁定機制卻必須先確定事件綁定對象的種類。

在 ExtJS 中有兩種類型的 Ext 物件可以進行事件綁定,一種是 Ext.Component,另一種是 Ext.Element。雖然它們都會對應到頁面上的 HTML Element ,但實際上來看 Ext.Component 算是以 Ext.Element 為基礎進行擴充的衍生物件,常因為特別需要而自行提供許多自定的事件,例如 Ext.form.Checkbox 這個 Ext.Component 物件會額外提供 check 事件,當然你可以把這個 check 事件當成原本 click 事件的再包裝。

所以說只要弄清楚事件綁定的對象後也就能夠確定所使用的事件處理函式的參數型態,對 Ext.Element 而言它的事件處理函式參數格式為:
/* 此的處 element 是一個 HTML Element ,也就是原本的 HTML DOM 物件 */
function eventHandler( event, element, object ) { }
但若是 Ext.Component 的話它的事件處理函式則為:
function eventHandler( component [, value/state ] ) { }
其實寫 ExtJS 應用系統很容易遇到事件處理函式未能如預期反應的情況,這是因為搞錯了事件作用的對象以及事件處理函式的參數匹配不正確所導致,要不是因為此次的系統開發時用到了 Ext.form.Checkbox 這個元素,也許格揆我還沒發現原來 ExtJS 的事件模型有分成兩種情形,而大致搜尋了一下也沒有啥文章特別提到這個明明就在 API 文件中,但工程師顯然不會特別注意到的情形。

但我們該怎麼取得 Ext.ComponentExt.Element 物件呢?只要記住除了 Ext.getCmp() 外,其他的 DomQuery 函式都只會傳回 Ext.ElementExt.CompositeElement(可把它當成多個 Ext.Element 物件的集合) 物件。

以下的範例可看出 Ext.ComponentExt.Element/Ext.CompositeElement 在注冊事件處理函式時的差異:
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="http://www.extjs.com/deploy/dev/resources/css/ext-all.css" />
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript" src="http://www.extjs.com/deploy/dev/adapter/jquery/ext-jquery-adapter.js"></script>
        <script type="text/javascript" src="http://www.extjs.com/deploy/dev/ext-all.js"></script>
        <script text="text/javascript">
            function init() {
                var viewport = new Ext.Viewport({
                    layout: 'form'
                    ,defaults: {
                        xtype: 'checkbox'
                        ,labelWidth: 70
                        ,labelAlign: 'right'
                    }
                    ,items: [
                        {
                            fieldLabel: '選項一'
                            ,id: 'chbox1'
                        }
                        ,{
                            fieldLabel: '選項二'
                            ,id: 'chbox2'
                        }
                        ,{
                            fieldLabel: '按鈕一'
                            ,id: 'btn1'
                            ,xtype: 'button'
                            ,text: '按鈕一'
                        }
                    ]
                });
  
                // 對 Ext.Component:chbox1 物件注冊 check 事件處理函式
                Ext.getCmp( 'chbox1' ).on( 'check', function ( chbox, checked ) {
                    alert( chbox.getId() + ' is ' + checked );
                });
  
                // 對所有的 Ext.CompositeElement:Checkbox 物件注冊 click 事件處理函式
                // 實際上有兩個物件被注冊了事件處理函式
                // 如果想在 Ext.Element 物件上綁定 check 事件的話,它是不會生效也不會有錯誤的喔!
                Ext.select( 'input[type=checkbox]' ).on( 'click', function( evt, el ) {
                    Ext.Msg.alert( 'Event Tester', el.id + ' is ' + el.checked );
                });

                // 對 Ext.Component:btn1 物件注冊 click 事件處理函式  
                Ext.getCmp( 'btn1' ).on( 'click', function( button ) {
                    alert( button.getId() + ' clicked' );
                });
  
                // 對所有的 Ext.CompositeElement:button 物件注冊 click 事件處理函式
                // 實際上有一個物件被注冊了事件處理函式
                Ext.select( 'button' ).on( 'click', function( evt, el ) {
                    Ext.Msg.alert( 'Event Tester', el.id );
                });
 
                return viewport;
            }
     
            $( document ).ready( init );
        </script>
    </head>
    <body>
    
    </body>
</html>

參考資訊:

2009年5月20日

某網站設計人員的建議

不知道該說啥比較好,為什麼台灣的網頁設計公司總喜歡限制網頁訪客的解析度呢?

話說,我為什麼要犧牲 DELL 2405 的最佳解析度不用去配合一個可有可無網站的需求呢?(搖晃~~)

2009年4月8日

2009年1月14日

網頁系統開發人員的夢魘 - IE CSS 表現

搞 CSS 的人員都知道相對於 Firefox 等非微軟系的瀏覽器而言,微軟的 Internet Explorer 真是一群非常不合群的特異分子。

有多特異呢?特異到它們自己都努力長的和別人不一樣!

不信?請看各瀏覽器在瀏覽 朱學恆的阿宅萬事通事務所 時的表現情形:

  1. IE 6:消失的搜尋欄位
  2. IE 7:似乎表現最正常
  3. IE 8 beta (Windows 7 Beta 1):網站抬頭的背景色縮成小小一塊

2008年4月9日

插花參加本年度 CSS Naked Day

這不是因為有名大站出狀況把本格給脫衣服了(再說本格也不是掛在有名大站下),只是單純的拔除 CSS 設定後的真實樣式。

小隔間裡的人生(又叫蔡依林 Blog) 得知本日為 CSS Naked Day,今年是第三屆,如果明天有記得的話就會改回來原始樣式!

※對了,Naked Day 要翻成什麼比較好呢?我覺得翻成 "天體節" 或 "裸奔節" 都不錯!

2004年12月8日

在 HTML 中嵌入媒體檔的正確做法

以下是從Mozilla@Taiwan討論區中查到如何在 HTML 中嵌入多媒體檔案的作法,雖然目前傾向改用 Flash 製作前端界面,不過還是要快點記下來...

<object data="test.wmv" type="video/x-ms-wmv" style="width: 320px; height: 240px;">
   <param name="src" value="test.wmv" valuetype="ref" />
   <param name="autoStart" value="1" valuetype="data" />
   <param name="DisplaySize" value="0" valuetype="data" />
   <param name="Volume" value="100" valuetype="data" />
   <div>Fallback content</div>
</object>
  1. 聽說除了 wma 可以這樣玩之外,其他都會失效… :(
  2. MSDN中有關於IE版 Object 物件的設定說明
  3. 這裡有比較完整的介紹。