聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

四月 12, 2013

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [小技巧] JavaScript Cross Browser Best Practices

ie-logo-smallie-logo-small

先前寫了一篇 modern.IE 的使用方式及介紹,今天在 Facebook 上看到 Eric Shangkuan 說已經有了中文介面,如果你的瀏覽器是中文版,應該就可以直接看到中文介面了,裡面有篇文章非常重要,寫 Web 的工程師都必須注意,那就是 Cross Browser Best Practices,這篇文章教您如何撰寫相容於舊版 IE 瀏覽器的一些小技巧,這些技巧也不只用在 IE 上,更是教您在實做 CSS,JavaScript 的注意事項。我們來看看 Javascript 的小技巧。

不要再使用 navigator.userAgent

為了知道使用者 Browser 資訊,之前有寫篇 jQuery 偵測瀏覽器版本, 作業系統(OS detection),內容使用 navigator.userAgent 來取得使用者瀏覽器及裝置資訊,開發者為了 IE 各版本的相容,所以透過此方式來知道 IE 各版本,進而在 JS 做處理,但是有時候並不是這麼準確,因為目前市面上裝置實在是太多種了,手機,平板,電視一堆等等,為了支援各種裝置,請不要再用 navigator.userAgent 來判斷了,現在取而代之的就是用 Modernizr,用來偵測您的 Browser 有無任何您所想要的功能,像是 Html5 的 Canvas,利用 Modernizr 來判斷是否支援,這時候各種裝置就不會因為 JS 沒有判斷到而產生錯誤 ,尤其是在電視介面或 Android 平板,踩到很多雷阿。詳細資訊可以參考此連結

簡單來說 Canvas 在 IE9 才有支援,所以針對 IE 部份,我們使用 navigator.userAgent 來判斷

<script type="text/javascript">
    function getInternetExplorerVersion()
    // Returns the version of Internet Explorer or a -1 for other browsers.
    {
        var rv = -1;
        if(navigator.appName == 'Microsoft Internet Explorer')
        {
            var ua = navigator.userAgent;
            varre    = newRegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
            if(re.exec(ua) != null)
            rv = parseFloat( RegExp.$1 );
        }
        return rv;
    }
    function onLoad()
    {
        var version = GetInternetExplorerVersion()
        if (version < 9 && version > -1)
        {
            // Code to run in Internet Explorer 9 or earlier.
        }
    }
</script>

但是如果遇到 Safari, Chrome, Android, IPad, IPhone 版本呢,也很好解決,就是一直些判斷式,那為什麼不換個角度去想,直接判斷有無 Cnavas 功能即可,透過 Modernizr 套件可以簡單做到。另外 jQuery 在 1.9 版也直接捨棄了 jQuery.browser API 功能,取而代之的也是推薦 Modernizr

if (Modernizr.canvas) {
  console.info('Your browser support canvas');
}

在 document ready 內不要執行大量 script

現在大部分的網站缺少不了的就是 jQuery,jQuery 提供了 $(document).ready() 在 html load 完成後可以快速執行 JavaScript,在大多的狀況下都可以正確執行的,但是如果在 $(document).ready() 寫入大量及複雜的 Script,只會讓瀏覽器呆滯而不能使用,所以盡可能減少執行的程式碼,等到使用者真正要執行功能的時候在進行呼叫即可。通常像是 tooltip 或 dialog 可以延遲等到要出現的時候在初始化即可。

簡單舉個例子,在 form 表單大家常用的 jQuery Plugin datepicker,通常初始化會透過底下方式來寫:

$(document).ready( function() {
    $("input.date").datepicker({
        minDate: moment().subtract( "months", 1 ).toDate(),
        maxDate: moment().add( "months", 1 ).toDate(),
        dateFormat: "d M, y",
        constrainInput: true,
        beforeShowDay: $.datepicker.noWeekends
    });
});

用這缺點就是當 html 完成載入後,jQuery 會開始找 input 並且符合 class 為 date 的 元件,這會 delay 使用者正常使用網頁,比較好的解決方式就是 bind 在 input 的 focus 事件上。

$(document).on( "focus", "input.date:not(.hasDatepicker)", function() {
    $(this).datepicker({
        minDate: moment().subtract( "months", 1 ).toDate(),
        maxDate: moment().add( "months", 1 ).toDate(),
        dateFormat: "d M, y",
        constrainInput: true,
        beforeShowDay: $.datepicker.noWeekends
    });
});

此寫法有另外的優點就是當如果有建立新的 input.date 元件,可以動態初始化元件。初始過的元件,我們就動態增加 hasDatepicker class 來判斷是否已經初始化。

網頁開始先優先執行 AJAX

由於執行 AJAX 需要一段時間,所以請在 html load 之前就開始執行,並不需要等到 $(document).ready() 後才執行,另外在 AJAX 完成執行後的 Complete function 加入 $(document).ready() 函式確保 html 已載入完成。

延遲載入 social button(Facebook Like, Google +1, Twitter)

現在大多網站都有一大堆分享機制(social networks),像是 Facebook Like、Twitter 等等,但是這些 JS 的載入,都大大影響到網頁的載入時間,其實最主要的解決方式就是務必思考哪些頁面才需要這些 button,能減少載入外部 JS 就是提昇網頁載入速度,在以前載入外部 JS 的作法就是底下

<script>
(function(d, s) {
  var js, fjs = d.getElementsByTagName(s)[0], load = function(url, id) {
    if (d.getElementById(id)) {return;}
    js = d.createElement(s); js.src = url; js.id = id;
    fjs.parentNode.insertBefore(js, fjs);
  };
  load('//connect.facebook.net/en_US/all.js#appId=272697932759946&xfbml=1', 'fbjssdk');
  load('http://apis.google.com/js/plusone.js', 'gplus1js');
  load('//platform.twitter.com/widgets.js', 'tweetjs');
}(document, 'script'));
</script>

現在請改寫成底下

<script>
(function(w, d, s) {
  function go(){
    var js, fjs = d.getElementsByTagName(s)[0], load = function(url, id) {
      if (d.getElementById(id)) {return;}
      js = d.createElement(s); js.src = url; js.id = id;
      fjs.parentNode.insertBefore(js, fjs);
    };
    load('//connect.facebook.net/en_US/all.js#appId=272697932759946&xfbml=1', 'fbjssdk');
    load('http://apis.google.com/js/plusone.js', 'gplus1js');
    load('//platform.twitter.com/widgets.js', 'tweetjs');
  }
  if (w.addEventListener) { w.addEventListener("load", go, false); }
  else if (w.attachEvent) { w.attachEvent("onload",go); }
}(window, document, 'script'));
</script>

由於各瀏覽器相容問題,所以判斷是否支援 addEventListener 或 attachEvent,在 onload 後才開始執行。更多詳細內容可以參考 requesting these scripts

二月 4, 2013

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 使用不同 IE 版本測試網站

ie-logo-smallie-logo-small

大家還在為了測試不同 IE 版本而安裝虛擬機器 VirtulBoxVMware 嗎?現在不必這麼麻煩了,可以到 modern.IE 直接測試 IE6/7/8/9/10 任何版本,或者是檢查網頁相容性以及 coding practices。

Scan your page

輸入網站 URL 直接開始測試,測試項目其實蠻多的,包含偵測網站使用的 Framework,像是 jQueryModernizr 版本,如果太舊,會跟您回報提示目前最新版本號碼,另外為了相容各 IE 版本,請使用 Standards Mode,也就是在 html 頁面使用 <!DOCTYPE html>,還有檢查是否使用 Responsive web design,就是偵測 media queries。其實測試結果裡面有很多相關連結,有空都可以看看,都蠻不錯的。

Virtual tool

為了測試不同 IE 版本,大家安裝了許多機器,就是要偵測相容性,現在不必這麼麻煩了,請到 BrowserStack.com 註冊新帳號,並且安裝 Firefox AddonChrome Plugin,安裝完成就可以直接選擇您要測試的 IE 版本,瀏覽器就會連上 Cloud based services 顯示各 IE 版本的結果,並且還有模擬滑鼠喔。

最後為了解決這些相容性問題,請務必調整專案的 Coding Standard,先閱讀 20 tips for building modern sites while supporting old versions of IE,按照此篇文章來開發新專案,像是使用 HTML5 Boilerplate,用 IE Compat Inspector,在 IE 瀏覽器上按 F12 debug,或使用 Firebug Lite,另外可以使用線上工具來幫助偵測網站相容性,像是 HTML validators, CSS validators, Uglify, and JSHint, or GruntJS 等。更多詳細資訊可以參考上述連結。

一月 22, 2013

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Firefox OS Developer Preview Phone 簡介

firefox-phone

上次提到今年 Firefox 將會舉辦 2013 Firefox OS App Days,這次看到 mozilla hacks 提到一篇: Announcing the Firefox OS Developer Preview Phone!,Firefox OS 是新一代的作業系統,跟 Android 或 IOS 比較不同的地方就是,你可以用 HTML5 可以做到手機的任何事情,包括讓手機振動,傳簡訊,或者是撥打電話,我想這是 iOS 或者是 Android 是無法做到的,該篇還提到 Firefox Phone 硬體規格:

CPU Qualcomm Snapdragon S1 1Ghz
UMTS 2100/1900/900 (3G HSPA)
GSM 850/900/1800/1900 (2G EDGE)
Screen 3.5″ HVGA Multitouch
3 MP Camera
4GB ROM, 512 MB RAM
MicroSD, Wifi N, Light and proxmity Sensor, G-Sensor, GPS, MicroUSB
1580 mAh battery
Over the air updates
Unlocked, add your own SIM card

如果想開始設計 App for Firefox OS 可以參考這篇,另外文章有提到如果你要試試看 Firefox OS + 自己開發的 App,可以透過底下方式:

1. 安裝 Marketplace for Android 在您的 Android 手機上。
2. 安裝瀏覽器版本 Firefox OS 模擬器
3. 安裝 Firefox OS 到各家硬體上
4. 最後一種方法:那就是買支 Firefox OS Developer Preview device

如果想更了解 Firefox OS 的話或有興趣的可以自行報名參加台北 Mozilla 1/26 場次

Related View

十二月 25, 2012

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 2013 Firefox OS App Days

firefox-phone

今天看到一則消息,就是 Firefox OS 在明年一月會舉辦全球性的 Firefox OS App Days,台灣部份也會在 2013/01/26 進行,地點也就在台灣 Mozilla 台北辦公室,這次的活動主要的目的是讓其他程式開發者可以瞭解如何開發 HTML5 apps 以及將 apps 提交到 Firefox Marketplace,並且可能會有一些機會讓開發者可以發表自行開發的 apps,另外還有一個重點就是會詳細介紹 Firefox OS 的生態消息,個人非常期待 Firefox OS 正式 Release,以及 App Marketplace 平台,是否可以跟 AppleAndroid 平起平坐,如果想多瞭解 Firefox OS 可以參考 Wiki 平台,一月的活動也算是 Hack Day,參考 FirefoxAppDays 裡面的活動介紹。

Related View

二月 2, 2012

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Web Developer Tools in FireFox 10

在美國時間 2012/01/31 FireFox 發佈 10.0 版本,大家可以參考 Release Note,其實對於網頁程式設計師最大的福音就是 Firefox 內建 Web Develop Tool,以後不必在安裝 FireBug Addon,就可以任意查詢網頁 Element 功能,大家可以參考底下 Mozilla 所製作的影片以及快速瀏覽 CSS properties

不多說了看完影片直接打開 FireFox,按下快捷鍵 Ctrl+Shift+I 就可以開始嘗試 Firfox 內建 Web Develop Tool。

Ref:

Firefox 10 tooling closes in on Firebug
Firefox Adds Powerful New Developer Tools

Related View

三月 25, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 如何使用 PPA 升級 Ubunut Firefox 瀏覽器到 4.0

FireFox_4_about

作者目前使用 Ubuntu 10.10 (maverick) 桌面環境,也是台灣 MozTW 成員之一,這次 FireFox 4.0 Release 介面有些改變,使用上來也非常順手,記憶體好像吃的比較少了?(有待商榷),現在就來升級 FireFox 吧,兩種升級方式,如果不熟悉 Command Line 就用 GUI 升級,另一種升級方式就是用 apt-get upgrade 啦。

如果用 Windows 請到這裡下載

利用 GUI 介面升級 (Install firefox 4 using GUI)

我的環境是英文,所以底下寫的是英文安裝方式: 按照底下步驟進行

Applications > Ubuntu Software Center > Edit > Software Sources

之後點選 “Other Software” 選擇左下角 “Add” 按鈕,接著把底下文字輸入

ppa:mozillateam/firefox-stable

最後到底下升級,就可以開始使用 FireFox 4 了

System > Administration > Update Manager

文字介面升級 (Install firefox 4 using terminal)

只要鍵入三行指令即可

$ sudo add-apt-repository ppa:mozillateam/firefox-stable
$ sudo apt-get update
$ sudo apt-get upgrade

沒圖沒真相啦,底下附上桌面截圖

firefox_4

Reference:
How to install firefox 4 in ubuntu using PPA
Firefox 4 正式版現已推出,帶給您更棒的網路體驗

Related View

六月 7, 2010

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [PHP] 好用 Debug PHP 工具 FirePHP for FireFox on CodeIgniter

FirePHP
之前介紹過 javascript FireFox Debug 工具 FireBug (Using firebug for firefox 除錯 javascript),今天來介紹 PHP 除錯工具 FirePHP,它可以輸出 PHP 資料到 FireBug console 介面,方便解決 PHP 相關問題,而不會去影響線上網站的畫面,安裝方式非常簡單,請先安裝 FireFox addon for FirePHP,重新啟動 FireFox 這樣就安裝成功了,接下來就是 include FirePHP Library 檔案,就可以正常使用了。另外還會介紹如何安裝到 CodeIgniter PHP Framework

Firebug: https://addons.mozilla.org/en-US/firefox/addon/1843
FirePHP: https://addons.mozilla.org/en-US/firefox/addon/6149

底下先看畫面:

$array = array("a" => "1", "b" => "2");
$firephp->info($array, "info");
$firephp->warn($array, "warn");
$firephp->error($array, "error");

FirePHP

Install FirePHP 安裝

Ref : http://www.firephp.org/HQ/Install.htm
在 Zend Framework 已經有開發完成,可以參考:FirePHP and Zend Framework 1.6
下載檔案:Download FirePHPCore library version 0.3.1

unzip FirePHP (解壓縮)

您會發現 FirePHPCore 底下有四個檔案,其中 fb.php && FirePHP.class.php 給 PHP 5 用的,另外兩個 fb.php4 && FirePHP.class.php4 則是給 PHP 4 專屬,本文只會以 PHP 5 當作範例。

include FirePHP file

新增一個 index.php 檔案,在最上面寫入:

require_once('FirePHPCore/FirePHP.class.php');

Start output buffering

假設您在 php.ini 有設定 output_buffering 為 on,就可以省略此步驟

測試完整檔案

<?
require_once('FirePHPCore/FirePHP.class.php');
ob_start();
$var = array('i'=>10, 'j'=>20);
$firephp = FirePHP::getInstance(true);
$firephp->log($var, 'WARN');
?>

FirePHP 預設是啟動的,如果您要將此關閉,可以使用底下程式碼將其關閉:

/**
   * Enable and disable logging to Firebug
   *
   * @param boolean $Enabled TRUE to enable, FALSE to disable
   * @return void
   */

$firephp->setEnabled(false);

也可以自訂選項:
maxObjectDepth 顯示 object 資料深度
maxArrayDepth 顯示 array 資料深度
useNativeJsonEncode 設定為 false 就是代表使用 FirePHPCore 內建 JSON encoder 來取代 PHP 內建 json_encode()。
includeLineNumbers 顯示檔案名稱以及行號資訊

// Defaults:
$options = array('maxObjectDepth' => 10,
                 'maxArrayDepth' => 20,
                 'useNativeJsonEncode' => true,
                 'includeLineNumbers' => true);

 

Install FirePHP on CodeIgniter

1. move fb.php and FirePHP.class.php into system/application/libraries directory.
2. rename FirePHP.class.php to Firephp.php, and fb.php to Fb.php.
3. edit Firephp.php file.

#
# Find  
#
<?php
#
# Replace
#
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

edit Fb.php file

#
# Find  
#
<?php
#
# Replace
#
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

Edit config/autoload.php file

#
# Find
#
$autoload['libraries'] = array();
#
# Replace
#
$autoload['libraries'] = array("firephp", "fb");

How to use it?

function index()
{
  $a = "test";
  $array = array("a" => "1", "b" => "2");      
  //$this->firephp->log($a, 'ERROR');
  //$this->firephp->log($a, 'ERROR');    
  $this->fb->setEnabled(true);    
  $this->fb->info($array, "info");
  $this->fb->warn($array, "warn");
  $this->fb->error($array, "error");
  $this->fb->group('Test Group');
  $this->fb->log('Hello World');
  $this->fb->groupEnd();
}

Related View

A Feedjack powered Planet
A Django site.