如何自動取得所有前端 JavaScript 錯誤以提升網站品質

我們每個案子都會用許多錯誤追蹤的機制確保網站品質,但還是不時會讓客戶發現有些功能無法操作,而這些問題大多出在 JavaScript 錯誤,由於一些老舊的瀏覽器或不同瀏覽器特性不同的關係,難免會有不小心寫錯的時候,為了能有效追蹤這些不易察覺的錯誤,我們會利用 JavaScript 追蹤 JavaScript 錯誤!

這個需求透過 jQuery 來做最方便了,透過 error(fn) 事件即可達成此一目標:

$(window).error(function(msg, url, line){
jQuery.post("/js_error_log.ashx", { msg: msg, url: url, line: line });
});

透過這個技巧即可有效獲得即時的前端資訊,看你要儲存到資料庫、EventLog、File、或郵寄出來都可以,不過唯一要小心的地方是當錯誤非常多時,這個錯誤追蹤的量可能會非常大,這時要特別注意程式的寫法,不要因為前端的錯誤槁掛了你的伺服器,而且有查到錯誤就要立即處理,降低錯誤發生的次數與提升網站品質。

相關連結

  

此文章由 will 發表於 2009/12/7 下午 12:08:01

永久連結 | 評論 (5) | 此文章的RSSRSS comment feed |

分類: Tips | JavaScript | Web

標籤: , ,

收藏:

利用 jQuery 將 DOM 元素聚焦 focus() 的六個版本

簡單的東西不簡單,將 DOM 元素聚焦是個再簡單不過的功能了,在實務上也經常用到,但是我們最近在使用 FancyBox 利用 IFRAME 載入頁面時卻怎麼樣都無法讓游標自動停在特定的文字輸入框中,除此之外,我也將我這些年累積遇到無法 focus() 的問題做了一次總整理,一共有六個版本之多。

第一種:經典版 

$('#Account').focus();

潛在的問題可以從官方提供的 Events/focus 文件看出一些端倪,但大部分的情況還是可以正常運作的,這也是讓 Web 開發人員匪夷所思的地方,就是有些地方可以用、有些地方不能用。

jQuery Events/focus: This causes all of the functions that have been bound to the focus event to be executed. Note that this does not execute the focus method of the underlying elements.

第二種:轉換成 DOM 去執行 focus() 函式

$('#Account')[0].focus();

使用 DOM 執行有很多風險,如果例外處理沒做好就很容易出現以下問題:

This webpage contains errors that might prevent it from displaying or working correctly. If you are not testing this webpage, click No.  Error: '0' is null or not an object

'0' 是 null 或不是一個物件

第三種:轉換成 DOM 去執行 focus() 函式,外加條件判斷確保執行無誤

if($('#Account').length > 0) { $('#Account')[0].focus(); }

你以為這樣就沒事了嗎?錯!因為當元素處於「隱藏」狀態時,是無法執行 DOM 物建的 focus() 函式的,硬要去執行就會出現以下錯誤:

Error: Can't move focus to the control because it is invisible, not enabled, or of type that does not accept focus

控制項不可見、為啟動或無法接受焦點,因此無法將焦點移到控制項上。

第四種:轉換成 DOM 去執行 focus() 函式,外加條件判斷確保執行無誤,以及利用 setTimeout 修正笨 IE 的詭異錯誤

if ($('#Account').length > 0) { setTimeout(function() { $('#Account')[0].focus(); }, 0); }

這問題會出現在 IE8 之前的 IE 瀏覽器上,通常發生在 DOM 元素先被隱藏,然後才被顯示出來 (這是常用的 hack 技法),雖然 DOM 元素已經在畫面上看的到,但 DOM 物件狀態還沒改變,導致執行 focus() 函式發生錯誤,這時就要用以上程式來解決。

第五種:轉換成 DOM 去執行 focus() 函式,外加條件判斷確保執行無誤,以及利用 setTimeout 修正笨 IE 的詭異錯誤,以及利用 try/catch 將最後可能潛在出現的問題給過濾掉。

if($('#Account').length>0){setTimeout(function(){try{$('#Account')[0].focus();}catch(e){}},0);}

以上應該算是我的終極解決版了,但不完美,所以我設計了第六個版本。

第六種:最終完美版

$('#Account').setfocus();

最後我將這些經驗濃縮成一個 jQuery 外掛 (Plugins),讓全網站有需要用到 focus() 功能的地方都可以利用 jQuery 自訂外掛函式達成目的。原始碼如下:

(function($)
{
    jQuery.fn.setfocus = function()
    {
        return this.each(function()
        {
            var dom = this;
            setTimeout(function()
            {
                try { dom.focus(); } catch (e) { } 
            }, 0);
        });
    };
})(jQuery);

 

對於剛從事 Web 甚或從事 Web 開發一段時間的人來說,真的很難想像能遭遇到多少大大小小、龜龜毛毛的的問題,但我卻還是不時會聽到有人說:「做網站很簡單阿,隨便一個大學生都可以做了」這樣的話,每次都是冷靜的想一想後決定:算了,這真的不是三言兩語講的清楚的,就讓誤解繼續下去吧~~

 

相關連結

  

此文章由 will 發表於 2009/10/29 下午 09:56:43

永久連結 | 評論 (5) | 此文章的RSSRSS comment feed |

分類: Web | Tips | JavaScript

標籤: , , ,

收藏:

介紹好網站:The Ultimate jQuery List

像我們幾乎每天都要與 jQuery 為伍,到處搜尋 jQuery Plugins 是難免的,有時後還花不少時間試用過才會決定用在專案裡,我之前介紹過MiniAjax.com 網站就包括許多 jQuery 外掛,不過今天介紹的網站就真的全部都跟 jQuery 有關的外掛套件:The Ultimate jQuery List

jQuery Ajax tutorials, jQuery UI examples and more! - The Ultimate jQuery List  - The Ultimate Categories

The Ultimate jQuery List 網站只有一頁,而且很長的一頁,且每個項目都有一張圖示讓你快速瞭解該 Plugin 的用途,下載時間是蠻長的,如果要看到所有 Plugin 要花些時間等待。

網頁最上方有個類別瀏覽,可以快速點選到各分類的 jQuery 項目清單:

jQuery Ajax tutorials, jQuery UI examples and more! - The Ultimate jQuery List

等瀏覽到自己有興趣的項目後,點選圖片就可以進入該 Plugin 網頁,每個 Plugin 網頁通常都有 test page 或 Demo 等頁面讓你快速瀏覽實際執行的效果。

我個人的習慣還是訂閱這裡的 RSS,讓我可以隨時收到最近新增的 jQuery 項目:

http://feeds2.feedburner.com/TheUltimatejQueryList

相關連結

  

此文章由 will 發表於 2009/7/13 上午 11:12:57

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: JavaScript | Web

標籤: ,

收藏:

介紹 jQuery Tools 與 jQuery UI 這兩套好用的 jQuery 套件

我想家喻戶曉的 jQuery UI 套件應該不用特別介紹了,但我最近又看到一套不錯的 jQuery Tools 套件,相較於知名且多功能的 jQuery UI 套件,jQuery Tools 提供一種額外的選擇,他只提供幾種網站上最常用的功能,包括 Tabs、Tooltips、Expose、Overlay、Scrollable、Flashembed 等,其中的 Flashembed 就可以取代我們之前常用的 swfobject 套件,他還支援 SIFR 功能喔。光聽我說還不夠,最好立即看看線上展示,你就知道有哪些酷炫實用的效果了。

jQuery TOOLS - The missing UI library for the Web

整個套件在透過 gzip 壓縮過僅 5.8KB 除了下載快,JavaScript 的執行速度也號稱相當快,而且還提供 CDN (Content Delivery Network) 下載連結如下:

<script src="http://cdn.jquerytools.org/1.0.2/jquery.tools.min.js"></script>

當然在載入 jQuery Tools 還是必須先載入 jQuery 的,目前的 1.0.2 版相容於 jQuery 1.3.2 版。若要透過 Google 的 CDN 網路下載 jQuery 可以參考我這篇文章的說明,或直接用以下語法載入 jQuery:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

即便 jQuery Tools 也是另一個佛心級的開放原始碼產品(免費),但有趣的是我還看到網路上有人直接拿 jQuery Tools vs jQuery UI 做評比,而且還引發不小的爭論,連 jQuery Tools 的作者也參與討論,也連帶的促進 jQuery Tools 的進步,讓 jQuery Tools 與 jQuery Plugins 架構的相容性更高,相信日後會有越來越好用的新功能出現,值得關注。

相關連結

  

此文章由 will 發表於 2009/6/21 上午 12:41:13

永久連結 | 評論 (1) | 此文章的RSSRSS comment feed |

分類: JavaScript | Web

標籤: , ,

收藏:

使用 jQuery Media Plugin 實做影片播放前預覽圖片功能

我們最近有個需求需要在首頁播放 wmv 影片,但為了不驚擾使用者,所以預設是不自動播放的,但是在頁面中宣告載入影片的地方卻會黑黑的一片 (如下圖示),因此客戶就要求說要先顯示一張圖片,然後點擊圖片後再播放影片。雖然不是個很難的功能,但我找到了個 jQuery Media Plugin 可以很方便的幫我處理這個需求。

當載入 Media Player ActiveX 時若預設不自動播放影片會顯示黑壓壓的一片 

jQuery Media Plugin 不止可以播放 wmv 影片,還支援多種影片格式,其中包括:

  • Quicktime
    • aif, aiff, aac, au, bmp, gsm, mov, mid, midi, mpg, mpeg, mp4, m4a, psd, qt, qtif, qif, qti, snd, tif, tiff, wav, 3g2, 3pg
  • Flash
    • flv, mp3, swf
  • Windows Media Player
    • asx, asf, avi, wma, wmv
  • Real Player
    • ra, ram, rm, rpm, rv, smi, smil
  • Silverlight
    • xaml
  • iframe
    • html, pdf

如此多的影片、動畫格式之外,還支援 sIFR ( Scalable Inman Flash Replacement ),甚至於其他文件格式(pdf, html),都可以透過這套 jQuery Media Plugin 進行動態載入的工作,如果副檔名是尚未定義的,你還可以自行定義播放器與副檔名的對應,可說是非常的實用。

jQuery Media Plugin 的運作原理也很簡單,先宣告一個 <a> 標籤,套上 class="media" 類別樣式,然後執行此 Plugin: $('a.media').media();

要實做影片播放前預覽圖片的功能就變的十分容易,如下 HTML 應該很容易理解:

<a class="media {width:260, height:195, autoplay:1}" href="video1.wmv" 
   onclick="$(this).media();return false;">
    <img src="/images/video1_image.jpg" width="260" height="195" />
</a>

主要需注意的地方只有幾點:

  1. 設定一個圖片用來做影片預覽或進行播放影片用的示意圖,高度寬度需先指定。
  2. 在套用一個 A 標籤 (超連結),並套上 class 屬性,並明確指定播放時影片的高度(height)、寬度(width)、與是否自動播放(autoplay)。
  3. 然後在 A 標籤再多加上一個 onclick 事件,用以啟用 jQuery Media Plugin,並記得加上 return false; 避免直接下載 video1.wmv 影片。

不過目前的最新版 ( v0.90 ) 有些問題,無法正確解析設定在 <a> 標籤 class 屬性中的選項值(Options),我有對 jquery.media.js 做出一些錯誤修正,需要的人可以到以下網址下載:

jquery.media.js (15.40 kb)

相關連結

  

此文章由 will 發表於 2009/5/28 下午 04:58:00

永久連結 | 評論 (10) | 此文章的RSSRSS comment feed |

分類: JavaScript

標籤: ,

收藏: