桌面通知功能可以讓瀏覽器即便是最小化狀態也能將消息通知給用戶。這和WebIM是最爲自然的結合。不過,目前支持Desktop Notification功能的瀏覽器只有Chrome5+。html
關於通知的基礎知識能夠參考如下文檔:html5
W3C標準:http://dev.w3.org/2006/webapi/WebNotifications/publish/Notifications.htmlweb
使用教程:http://www.html5rocks.com/en/tutorials/notifications/quick/api
本文主要記錄通知功能在Web IM中實際使用時的一些經驗。瀏覽器
在實際使用的過程當中,應該儘可能減小通知功能對用戶的干擾,最大程度的減小通知功能的出現,這就須要解決如下幾個問題:異步
1. 收到多條消息時確保只出現一條通知;函數
2. 當用戶處於IM出現的頁面中時(頁面處於Focus狀態)將不出現通知;ui
3. 當用戶使用多Tab開啓多個存在IM的頁面時,只要有一個頁面處於Focus狀態將不出現通知;this
此外,還須要解決一個便利性問題spa
4. 如何讓用戶點擊通知浮動層便可定位到具體的聊天窗口
1. 只彈出一個通知窗口
這個問題比較好解決,由於通知對象擁有一個名爲"replaceId"的屬性。指定該屬性後,只要是相同replaceId的通知窗口彈出,都 會覆蓋以前彈出的窗口。在實際項目中是給全部的彈出窗口賦了一個相同的replaceId。不過須要注意的是,這種覆蓋行爲只在同域下有效。
2. 確保頁面Focus時不彈出通知窗口
這個問題主要是在於判斷瀏覽器窗口是否處於Focus狀態,目前除了監聽window的onfocus和onblur事件以外,貌似沒有更好的方式。在項目中就是經過這種方式來記錄窗口的Focus狀態,而後當消息到達時根據Focus狀態來判斷是否彈出窗口。
$(window).bind( 'blur', this.windowBlur).bind( 'focus', this.windowFocus); |
使用該方法須要注意的地方是,事件註冊的事件點應該儘量的靠前,若是註冊太晚則當用戶打開頁面後再離開就會很容易出現狀態的誤判。
3. 識別多Tab的Focus狀態
多頁面間的狀態共享能夠經過本地存儲來實現:
瀏覽器窗口Focus時修改本地存儲中指定key的值爲"focus"
瀏覽器窗口Blur時修改本地存儲中指定key的值爲"blur"
須要注意的是,Chrome下從一個Tab切換到另外一個Tab時,Blur有可能比Focus後寫入存儲中,所以修改Focus狀態時須要異步處理。
/*window on focus事件*/ //用延時是爲了解決多個Tab之間切換時,始終讓Focus覆蓋其餘Tab的Blur事件 //注: 若是在點擊Tab以前沒有Focus到document上則點擊Tab是不會觸發Focus的 setTimeout( function(){ Storage.setItem( 'kxchat_focus_win_state', 'focus' ); }, 100); /*window on blur事件*/ Storage.setItem( 'kxchat_focus_win_state', 'blur' ); |
實現以上狀態共享後,新的消息到達後,只須要查看本地存儲中’kxchat_focus_win_state’的值是否爲blur,若是爲blur才彈出窗口。
4. 通知窗口的事件響應
通知窗口支持onclick等事件響應,而響應函數中的做用範圍屬於建立該窗口的頁面。以下代碼:
var n = dn.createNotification( img, title, content ); //確保只有一個提醒 n.replaceId = this.replaceId; n.onclick = function(){ //激活彈出該通知窗口的瀏覽器窗口 window.focus(); //打開IM窗口 WM.openWinByID( data ); //關閉通知窗口 n.cancel(); }; |
在onclick的響應函數中訪問的window對象即屬於當前建立頁面,所以能夠很方便的與當前頁面進行交互。以上代碼便實現了點擊彈出窗口會跳轉到對應的瀏覽器窗口和打開IM窗口。
具體的實現能夠在Chrome中進入 http://www.kaixin001.com 體驗WebIM。