介紹
之前由於專案需求有開發過一款簡單的聊天專案,不過功能及UI比較簡單,最近又重新在原先的基礎上進行了一次大的重構,開發了這款仿微信介面聊天IM系統——趣聊weChatIM。
技術點
運用h5+css3+jQuery+swiper+wcPop+flexable等技術混合開發,實現了傳送訊息、表情(動圖),圖片、視訊預覽,新增好友/群聊,右鍵長按選單。另外新增了語音模組、地圖定位模組。整體功能介面效果比較接近微信聊天。
專案中使用的彈窗wcPop.js,是自己開發的移動端彈窗元件,相容所有移動裝置(親測),多種api呼叫方式及動畫效果;
emmmm,看到這裡是不是覺得還不錯,功能效果起碼比較統一;
使用shake.js實現搖一搖效果
$("#J__popScreen_shake").on("click", function () {
var shakePopIdx = wcPop({
id: 'wcim_shake_fullscreen',
skin: 'fullscreen',
title: '搖一搖',
content: $("#J__popupTmpl-shakeFriends").html(),
position: 'right',
xclose: true,
style: 'background: #303030;',
show: function(){
// 搖一搖功能
var _shake = new Shake({threshold: 15});
_shake.start();
window.addEventListener("shake", function(){
window.navigator.vibrate && navigator.vibrate(500);
// console.log("觸發搖一搖!");
//...邏輯程式碼
setTimeout(function(){
$(".J__shakeLoading").fadeOut(300);
$(".J__shakeInfoBox").html(shakeTpl);
}, 1500);
}, false);
}
});
});
處理聊天模組js片段
// ...處理編輯器資訊
var $editor = $(".J__wdtEditor"), _editor = $editor[0];
function surrounds() {
setTimeout(function () { //chrome
var sel = window.getSelection();
var anchorNode = sel.anchorNode;
if (!anchorNode) return;
if (sel.anchorNode === _editor ||
(sel.anchorNode.nodeType === 3 && sel.anchorNode.parentNode === _editor)) {
var range = sel.getRangeAt(0);
var p = document.createElement("p");
range.surroundContents(p);
range.selectNodeContents(p);
range.insertNode(document.createElement("br")); //chrome
sel.collapse(p, 0);
(function clearBr() {
var elems = [].slice.call(_editor.children);
for (var i = 0, len = elems.length; i < len; i++) {
var el = elems[i];
if (el.tagName.toLowerCase() == "br") {
_editor.removeChild(el);
}
}
elems.length = 0;
})();
}
}, 10);
}
if (that.hasClass("face")) { //小表情
var img = that[0].cloneNode(true);
if (!_editor.childNodes.length) {
_editor.focus();
}
_editor.blur(); //輸入表情時禁止輸入法
setTimeout(function () {
if (document.selection && document.selection.createRange) {
document.selection.createRange().pasteHTML(img);
} else if (window.getSelection && window.getSelection().getRangeAt) {
range = _rng.getRange();
range.insertNode(img);
range.collapse(false);
_lastRange = range; //記錄當前游標位置 (否則游標會跑到表情前面)
_rng.addRange();
}
}, 10);
}
function isEmpty() {
var html = $editor.html();
html = html.replace(/<br[\s\/]{0,2}>/ig, "\r\n");
html = html.replace(/<[^img].*?>/ig, "");
html = html.replace(/ /ig, "");
return html.replace(/\r\n|\n|\r/, "").replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, "") == "";
}