相信大家對於 facebook hashtag 都已經很熟悉了, 只要鍵入 # 開頭的符號, 就可以輕輕鬆鬆幫自己的 post 上 tag, 透過 hashtag 的導入, 可以迅速的將自己的 post 做一個 grouping, 讓對該主題有興趣的朋友可以一覽下了這個 tag 的 post 有哪些
由於這是個有趣的 feature, 所以我們家 PM 也希望可以把這功能納入自家服務當中, 於是筆者便著手 survey 一下相關的實作, 筆者發現像這種特殊用途的 input 類型 tag 其實非常適合使用 web components 來做封裝, 類似 inpyt[type=date] 一樣, 只要設定特定的 HTML tag 便能馬上具備特定的功能, 於是乎 <hash-tag> 這個標籤便因應此需求而誕生 歡迎點擊下方連結進行觀看 : hashtag: http://mei.homin.com.tw/hashtagProt…
由於架構在 Web Components 上, 所以「hashtag」俱備了可攜、易用的特性, 搭配客製化 tag – <hash-tag> (custom element), 除了語意化結構獲得了補強, 並且發揮了 custom element 的「熱拔插」特性, 只要對 DOM 進行 element append / remove 的動作, 便可以快速對 element 進行 init / detach 的行為, 對 developer 的 effort 降到最低, 達到快速安裝使用. 最有趣的還可以直接在 element 上 bundle method, 讓 developer 可以輕輕鬆鬆便享受到 tag 所帶來的便利性, 將心力用於其他細節處理上, 讓整體體驗達到另一層次
如何套用 hashtag 到服務上
在頁面上任何想要套用 hashtag 的地方插入相對應的 html tag <hash-tag> …(git)
<hash-tag> <h3>hash-tag</h3> <input name="hashtag" value="# mei # lauMu" placeholder="Enter some hashtag here..."></hash-tag>
另外, JavaScript 也要將之 require 進來
< script async src="js/pack-hashtag.js">< /script >
由於 hashtag is designed by native JavaScript, 所以不管當前 website 是使用什麼樣的 framework, 皆可以正常運作, 不會受到任何影響
hashtag 再進行 init 的時候, 會將子元素第一個 input 的當前設定來做初始化設定
- name: input field name, 當 user 完成 keyin 的動作後, 會把有 mapping 到的 tag 以 array 的方式產出, ex: hashtag[]
- value: 設定初始話內容
- placeholder: 當 hashtag field value 為空時, 要顯示的文字
例外, 也可以透過 JSON String 的方式來帶入相關初始化的 data
{ "fieldName": "hashtag", "fieldValue": "# mei # lauMu" "placeholder": "Enter some hashtag here..."}
再將上述 data 以 JSON String 的形式帶入 data-conf 這個 attribute 即可, 如下所示
<hash-tag data-conf='JSON String'></hash-tag>
完成 init 後, 只要是內容物有符合我們所設定的 rule, 即會將相關的 tag 做一個裝飾的動作, 讓 user 可以很清楚的知道有哪些 tag 是已經 mapping 到 rule Mapping 的 rule 就跟 facebook 的設定一樣, 由 “#” 這個 sign 做起始, 然後一個 space 做結束, 由於我們 default 帶進來的值是有符合該 rule, 所以它會如同下圖所示
由於我們有設定 placeholder, 這表示說當我們內容物為空時, 它便會顯示相關的內容於元件上
接下來我們試著鍵入一些不同的組合, 來觀察一下相關的呈現
至於資料結構的呈現會是如何呢 ? 基本上 hashtag 會將整理好的資料用 array 的方式做呈現, 不過由於 form action 無法將 shadowDOM 裡面的 input 刮出來做資料傳遞, 因此這些資料的結構必須置放在 shadowDOM 之外, 系統會將產生一個 .vanquish 的元件來做存放, hashtag 會做 de-deplictae 的動作, 即表示如果 keyin 了重複的 hashtag, 也僅僅只會 generate 一筆資料
此外, 亦會將原始內容放置於一 textarea 中, 方便做其它處理用, 該 textarea 的命名規則為 fieldName + Src
以上, 便是 hashtag 的基本設置, 輕輕鬆鬆幾個簡單的步驟, 就可以幫頁面上 form 新增相關的元件, 另外 hash-tag 亦提供了一些 method 來方便 developer 使用
hashtag 所提供的各種 method
- set: 用來設定 hashtag 的內容, 如果需要動態調整其內容的話, 便可以透過這個 method 來做 .. .(git)
$('hash-tag').set('# mei # lauMu');
- get: 用來取得當前有 mapping 到 rule 的所有資料, 資料會以 array 的型態進行回傳, 如果帶入 ‘source’ 這個 parameter 的話, 則會回傳原始資料 … (git)
$('hash-tag').get(); // return ['# mei', '# lauMu']$('hash-tag').get('source'); // return original content
- hash-tag[data-set]: 除了以上兩種 method 之外, 其實 hashtag 亦支援透過 attribute 變化來動態更換當前內容 (browser must support web components) … (git)
$('hash-tag').setAttribute('data-set', '# mei # lauMu');
透過上面的 method 便可以方便 user 來做一些簡單的動態變化或者是資料驗證, 讓 hashtag 的支援度更趨於完整
hashtag 特點
- pure native JavaScript, 不需要憑依在任何 framework 上
- 使用容易, 透過簡單 HTML tag的設置, 便可以快速擁有其 feature
- 輸入與裝飾分層表現, 讓 user keyin 回歸到最初的感動, 不會因為多餘的 JavaScript 運算造成不舒服的操作體驗
以上, 便是 hashtag 的相關使用與分享, 有興趣的朋友們請不用客氣, 可以直接使用, 也請不吝一同討論與指教喔!
測試環境:
- OS: Windows 7
- Browser: Chrome Version 50.0.2661.75 m (64-bit) , Firefox 45.0.2, Internet Explorer Version 11.0.9600.18230