顯示具有 jquery 標籤的文章。 顯示所有文章
顯示具有 jquery 標籤的文章。 顯示所有文章

2015年7月27日 星期一

[JS] jQuery 顯示 badge

badge 就是一個小圈圈裡有數字,找到一個有趣的 sample code, 可以下一個 class 就套出 badge, 缺點就是需要調一下別人的 css 把 沒有在用 style 先拿掉。

套出來的畫面:

使用方法:
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Badges on Buttons</h2>
  <button type="button" class="btn btn-primary">Primary <span class="badge">7</span></button>
  <button type="button" class="btn btn-success">Success <span class="badge">3</span></button>    
  <button type="button" class="btn btn-danger">Danger <span class="badge">5</span></button>        
</div>

</body>
</html>



example 2:
<!DOCTYPE html>
<html>

<head>
    <link data-require="bootstrap@*" data-semver="3.3.1" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" />
    <script data-require="jquery@*" data-semver="2.1.3" src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
</head>

<body>
    <button class="btn btn-sm btn-default like-btn active" type="button" id="10">
        <span class="glyphicon glyphicon-thumbs-up"></span>
        <span class="text">Liked</span>
        <span class="badge like-badge">1</span>
    </button>
    <script>
        $(document).on("click", ".like-btn", function(e) {
            e.preventDefault();

            var $label = $(this).find('.text'),
                $badge = $(this).find('.badge'),
                count = Number($badge.text()),
                active = $(this).hasClass('active');

            $label.text(active ? 'Like' : 'Liked');
            $badge.text(active ? count - 1 : count + 1);
            $(this).toggleClass('active');
        });
    </script>
</body>
</html>


資料來源:
http://www.w3schools.com/bootstrap/bootstrap_badges_labels.asp


2014年10月3日 星期五

[JS] Sweet Alert

我覺得每個網站都應該用這一個SweetAlert套件來做, 最好再改一下 UI sytle, 配合該網站的  style, 雖然已經有很多 jQuery 做出類似的功能, 看了一下SweetAlert用法和安裝方法, 真是簡單到爆, SweetAlert 和預設醜死的javascript alert的視窗相比,SweetAlert 在 UI 上顯示出來就漂亮許多,在功能面還加強了許多功能.

官方網站: http://tristanedwards.me/sweetalert
github: https://github.com/t4t5/sweetalert




2014年7月18日 星期五

[JS] html select 下拉框 顯示固定寬度

預設的 select box 的寬度會依照 option 裡的值(value) 長短而自動 resize 寬度, 在很多 select box 的畫面裡會不太好太, 解法有2:

  • 1. css (建議), min-width & max-width 屬性.
  • 2. javascript.

解法1:

Example

Set the minimum width of a paragraph:
p{
min-width:1000px;
}

Browser Support: ALL Browser


The min-width property is supported in all major browsers.
Note: IE6 and earlier versions do not support the min-width property.

html code:
<select name="Select1" style="min-width:100px; max-width:120px;">

執行畫面 (screent shot):


解法2: javascritp

執行畫面:


javascript source code:
==============
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
function FixWidth(selectObj)
{
    var newSelectObj = document.createElement("select");
    newSelectObj = selectObj.cloneNode(true);
    newSelectObj.selectedIndex = selectObj.selectedIndex;
    newSelectObj.onmouseover = null;
    var e = selectObj;
    var absTop = e.offsetTop;
    var absLeft = e.offsetLeft;
    while(e = e.offsetParent)
    {
        absTop += e.offsetTop;
        absLeft += e.offsetLeft;
    }
    with (newSelectObj.style)
    {
        position = "absolute";
        top = absTop + "px";
        left = absLeft + "px";
        width = "auto";
    }
    var rollback = function(){ RollbackWidth(selectObj, newSelectObj); };
    if(window.addEventListener)
    {
        newSelectObj.addEventListener("blur", rollback, false);
        newSelectObj.addEventListener("change", rollback, false);
    }
    else
    {
        newSelectObj.attachEvent("onblur", rollback);
        newSelectObj.attachEvent("onchange", rollback);
    }
    selectObj.style.visibility = "hidden";
    document.body.appendChild(newSelectObj);
    newSelectObj.focus();
}
function RollbackWidth(selectObj, newSelectObj)
{
    selectObj.selectedIndex = newSelectObj.selectedIndex;
    selectObj.style.visibility = "visible";
    document.body.removeChild(newSelectObj);
}
</script>
</head>
<body>
<form method="post">
    <div style="width:100px; height:100px; margin:100px; padding:10px; background:gray;">
        <select name="Select1" style="width:80px;" onmouseover="FixWidth(this)">
            <option id="A" title="this is A">AAAAAAAAAAAAAAA</option>
            <option id="B" title="this is B">BBBBBBBBBBBBBBB</option>
            <option id="C" title="this is C">CCCCCCCCCCCCCCC</option>
        </select>
    </div>
</form>
</body>
</html>

2012年9月6日 星期四

jquery-ui-multiselect-widget 遇到資料量大於 2000筆的 option

jquery-ui-multiselect-widget 遇到資料量大於 2000筆的 option會有效能上的問題, 舊電腦可能需要到4分鐘, 才能產生出畫面, 相關討論如下:
https://github.com/ehynds/jquery-ui-multiselect-widget/issues/157

Hello, I experienced performance problems when more than 2000 options. To took an average of four minutes to assemble the combo (bad machines), not to mention when you click on or search.


我還在研究看看, 怎麼解決這個問題.

2012年9月5日 星期三

jQuery widget 外部存取 widget 內部的屬性或 method

最近使用 jQuery ui.multiselect 的 widget 實作了一個畫面:

現在 user 想知道, 有幾個 item 被選取, 要在 widget 外部存取 widget 內部的屬性或 method, 可以這樣子做:
var widget = $(".multiselect").data("multiselect");
alert(widget.count);

這樣子就拿到 widget object 裡自行定義的屬性 count 裡的值.




資料來源:
Accesing widget instance from outside widget
http://stackoverflow.com/questions/8506621/accesing-widget-instance-from-outside-widget


jQuery UI Multiselect
http://www.quasipartikel.at/multiselect/


特別感謝:


 *  Michael Aufreiter (quasipartikel.at)
 *  Yanick Rochon (yanick.rochon[at]gmail[dot]com)


心得:
這真的是一個 "超神奇" 的 jQuery Widget, 真是令人嘆為觀止.

查出來的資料, 透過 jQuery 反白關鍵字

某一個專案, 提供了 "查詢" 功能, 允許使用者輸入某些關鍵字, 並希望查出來的資料, 遇到 user 輸入的關鍵字時, 要反白(或高亮, hightlight) 顯示.

這有2個做法.
1. Server Side 解決: web server 丟出來的資料就反白好.
2. Client Side 解決: 透過 javascript 或 jQuery 解決.

這次要分享怎麼透過 client side 解決.

step1: include jQuery
step2: 隨便給要 highlight 的 block 一個 classname
step3: 呼叫下面的 javascript, 把 block 裡的 keyword highlight.
step4: 報告完畢.


範例 jQuery 如下:
<script language='javascript'>
var keyword;
keyword = '123';
$('.Title').html(function() {
    return $(this).html().replace(keyword,"<font color=\"red\">"+keyword+"</font>");
});
$('.tel').html(function() {
    return $(this).html().replace(keyword,"<font color=\"red\">"+keyword+"</font>");
});
$('.address').html(function() {
    return $(this).html().replace(keyword,"<font color=\"red\">"+keyword+"</font>");
});

</script>
說明:
1. 把所有 class='Title' 的 block 裡出來 '123' 都變成 紅色字體.
2. 把所有 class='tel' 的 block 裡出來 '123' 都變成 紅色字體.
3. 把所有 class='address' 的 block 裡出來 '123' 都變成 紅色字體.


2012年8月17日 星期五

Javascript sort select options 的方法

比較快又簡單的方式是透過 jQuery, 這幾行就搞定:

var my_options = $("#my_select option");

my_options.sort(function(a,b) {
    if (a.text > b.text) return 1;
    else if (a.text < b.text) return -1;
    else return 0
})

$("#my_select").empty().append( my_options );


也可以透過簡單的 Javascript 例如:


function sortSelect(selElem) {
        var tmpAry = new Array();
        for (var i=0;i<selElem.options.length;i++) {
            tmpAry[i] = new Array();
            tmpAry[i][0] = selElem.options[i].text;
            tmpAry[i][1] = selElem.options[i].value;
        }
        tmpAry.sort();
        while (selElem.options.length > 0) {
            selElem.options[0] = null;
        }
        for (var i=0;i<tmpAry.length;i++) {
            var op = new Option(tmpAry[i][0], tmpAry[i][1]);
            selElem.options[i] = op;
        }
        return;
    }

附註: 這個 script 沒有考慮到已經 selected 的項目的問題.


function sortSelect(selectToSort) {
    var arrOptions = [];

    for (var i = 0; i < selectToSort.options.length; i++)  {
        arrOptions[i] = [];
        arrOptions[i][0] = selectToSort.options[i].value;
        arrOptions[i][1] = selectToSort.options[i].text;
        arrOptions[i][2] = selectToSort.options[i].selected;
    }

    arrOptions.sort();

    for (var i = 0; i < selectToSort.options.length; i++)  {
        selectToSort.options[i].value = arrOptions[i][0];
        selectToSort.options[i].text = arrOptions[i][1];
        selectToSort.options[i].selected = arrOptions[i][2];
    }
}


資料來源:
What is the most efficient way to sort an Html Select's Options by value, while preserving the currently selected item?
http://stackoverflow.com/questions/45888/what-is-the-most-efficient-way-to-sort-an-html-selects-options-by-value-while

Javascript to sort contents of select element
http://stackoverflow.com/questions/278089/javascript-to-sort-contents-of-select-element

2012年7月24日 星期二

anita 提供的 jQuery 版的廣告輪播加強版 (v1.1)

上次Anita 提供的輪播 jQuery, 其實有2個小地方不太美觀, 這次找到時間就把他改掉, 雖然沒有寫的很完美, 但加減可以用, 致少有改善...

1. 調整圖片輪播的方式, 當輪到最後一張時, 不是切到第1張, 而是從右向左輪播.
2. 調整圖片與圖片間的間距, 如下圖所示, 原本會多空500 px的空白.


修改後的 javascript 如下: 

$(function(){
 slider.init();
});
var slider={
 num:-1,
 cur:0,
 cr:[],
 al:null,
 at:3*1000,
 ar:true,
 imagesize:520,
 direction:1,
 init:function(){
    if(!slider.data || !slider.data.length)
        return false;
    var d=slider.data;
    slider.num=d.length;
    var pos=Math.floor(Math.random()*1);  //slider.num);
    for(var i=0;i<slider.num;i++){
        $('#'+d[i].id).css({left:((i-pos)*slider.imagesize)});
        $('#slide-nav').append('<a id="slide-link-'+i+'" href="#" onclick="slider.slide('+i+');return false;" onfocus="this.blur();">'+(i+1)+'</a>');
    }

    $('img,div#slide-controls',$('div#slide-holder')).fadeIn();
    slider.text(d[pos]);
    slider.on(pos);
    slider.cur=pos;
    window.setTimeout('slider.auto();',slider.at);
 },
 auto:function(){
    if(!slider.ar)
        return false;
    var next=slider.cur+slider.direction;
    if(next>=slider.num){
        slider.direction*=-1;
        next=slider.num-2;
    }
    if(next<=0){
        slider.direction*=-1;
        next=0;
    }
    slider.slide(next);
 },
 slide:function(pos){
    if(pos<0 || pos>=slider.num || pos==slider.cur)
        return;
    window.clearTimeout(slider.al);
    slider.al=window.setTimeout('slider.auto();',slider.at);
    var d=slider.data;
    for(var i=0;i<slider.num;i++)
        $('#'+d[i].id).stop().animate({left:((i-pos)*slider.imagesize)},1000,'swing');
    slider.on(pos);
    slider.text(d[pos]);
    slider.cur=pos;
 },
 on:function(pos){
    $('#slide-nav a').removeClass('on');
    $('#slide-nav a#slide-link-'+pos).addClass('on');
 },
 text:function(di){
    slider.cr['a']=di.client;
    slider.cr['b']=di.desc;
    slider.ticker('#slide-client span',di.client,0,'a');
    slider.ticker('#slide-desc',di.desc,0,'b');
 },
 ticker:function(el,text,pos,unique){
    if(slider.cr[unique]!=text)
        return false;
    ctext=text.substring(0,pos)+(pos%2?'-':'_');
    $(el).html(ctext);
    if(pos==text.length)
        $(el).html(text);
    else
        window.setTimeout('slider.ticker("'+el+'","'+text+'",'+(pos+1)+',"'+unique+'");',30);
 }
};


相關文章:
anita 提供的 jQuery 版的廣告輪播
http://maxtellyou.blogspot.tw/2012/06/anita-jquery.html

2012年1月4日 星期三

jQuery blockUI 的 bindEvents 造成的事件被吃掉的問題

資料來源:
------------------
http://eragonj.hax4.in/blog/javascript-solve-conflicts-when-using-jquery-blockui-and-datepicker.html


發生的情況:
------------------
同時用 blockUI 及 datepicker,會發生在你使用 modal dialog ,而該 dialog 內還包含一個 datepicker 的元素,這樣就會造成那個 datepicker 在選取年、月的下拉式選單(dropdown)時無法觸發。



結論:
------------------
blockUI 運行的過程中,有這麼一段程式碼會綁定 mousedown / mouseup / keydown / keypress 的事件,這樣就會使得 datepicker 的點擊行為無法發生,這就是為什麼會有這個 bug 的出現。

所以目前比較好的做法,一個是設定 showOverlay : false (這會拿掉漸層背景,不過這通常都不會是我們想要的解法),另一個就是設定 bindEvents : false (讓 blockUI 不要 suppress 我們的點擊 event ),這樣就可以解決這個問題了。

修改 jQuery BlockUI 在 IE6 的情況下彈出視窗的位置.

1. 修改前, 彈出的視窗偏低.
----------------------


而且, 不論怎麼卷動 scroll bar, 都只能看到上半部的 form.




2.修改後, 設定在 IE6 + showOverlay 的情況下, 不自動調整 Y軸(上下坐標), 即可解決.
----------------------




修改方式, 修改檔案 jquery.blockUI.js , 增加程式碼:
// add by max for IE6.
if(ie6 && opts.showOverlay){
opts.centerY=false;
}

2012年1月3日 星期二

居然可以遇到 jQuery bugs - event.layerX and event.layerY are broken



Error Message:
event.layerX and event.layerY are broken and deprecated in WebKit. They will be removed from the engine in the near future.

發生的原因, 是 jQuery 使用了 1.6.2 版, 升級上去使用 1.7.1 版就不會有錯誤訊息.


發生的情況, 是在我的某一段文字, 下了 label for='id' 但, checkbox 並不會因為 label 被 click 而自動勾選, 更新了 1.7.1 是不會產生 Error(應該是 Warnings), 可是 label for 一樣不會 Work, XD

這個畫面, 可能太複雜, 用了很多的 jQuery 元件, 像是 blockUI 和 tiny_mce, 到底是那裡衝到? 只有影響到 label for , 似乎不會被發現, 以後有空再來 trace(debug).


相關Link:
--------------------------
jQuery:
http://jquery.com/

2011年12月29日 星期四

jQuery 與 XPath 的比較

資料來源:
http://www.ibm.com/developerworks/xml/library/x-xpathjquery/index.html?ca=drs-
or
http://www.smartwei.com/xpath-vs-jquery.html
(是同一篇)


大致上, 就是只能在 jQuery 裡用到很簡單的 xPath, 太複雜的 xpath 語法就沒辦法,
簡單來說, 就是把 xpath 的 / 換成 空格, 就可以在 jQuery 裡執行,
遇到要選擇第幾個 element 時, 就用 : 或用 contains()
參考看看:
http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp

jQuery 的 [] 中括號, 好像只能用來處理屬性的樣子.

jQuery 教程 + jQuery 参考手册

jQuery 教程 + jQuery 参考手册
URL: http://www.w3school.com.cn/jquery/index.asp

自從我看了這個站, 對 jQuery 更加的了解到, 要怎麼去使用,
像是

$('#test').val('2')
這行的功能, 是把 id='test' 的 value 設成 '2'

$('#test').val()
這行的功能, 是取得 id='test' 的 value.


.html() 用用法同 .val()

2011年12月28日 星期三

jQuery 教學 - 基礎篇

資料來源:
----------------------------------------------
http://jsgears.com/thread-63-1-1.html



簡介:
----------------------------------------------
jQuery 是一套 JavaScript 的 Library,因此,你必須稍具 JavaScript 的基礎,jQuery 主要是用在 DOM 文件的操作,包含「快速選取元素(Element)」並且「做一些事情」,快速選取元素可以讓你一次選取單一或多個的元素,然後你可以將這些被選取的元素做一些改變,例如隱藏、顯示等等。此外 jQuery 的核心程式還加強了非同步傳輸(AJAX)以及事件(Event)的功能。



快速選取元素:
----------------------------------------------
jQuery 怎麼用來「快速選取元素」並且「做一些事情」呢?請看看程式碼:
$("div").addClass("special");

錢記號 $ 是 jQuery 的物件,使用 $("div") 就是用 jQuery 來選取元素,這個範例可以選取文件內所有的 <div> 元素。後面接著的 .addClass("special") 就是用來做一些事情,這個範例是將先前所選取到的所有元素都加上一個名為 "special" 的 class。也就是透過 $("div").addClass("special") 的語法,可以讓你一次幫文件上有的 <div> 元素都加入 special 的 class。



做一些事情:
----------------------------------------------
使用 jQuery 來選取元素之後,接下來當然就是要來對這些選取到的元素做些改變囉。透過 jQuery 內建的函數,你可以:

1.對 DOM 進行操作,例如對文件節點的新增或修改
2.添加事件處理
3.做一些基本的視覺效果,例如隱藏、顯示、下拉顯示、淡出淡入等等
4.使用 AJAX 傳送表單內容或取得遠端文件



[範例] 選取所有有 target 屬性的 <a>,並且在其節點下加入一段文字。
$("a[target]").append(" (Opens in New Window)");
這是一段原始的 HTML :
<a href="http://jsgears.com">jsGears</a>
<a href="http://google.com" target="_blank">Google</a>
<a href="http://amazon.com" target="_blank">Amazon</a>
選取有 target 屬性並加入文字後的結果:
<a href="http://jsgears.com">jsGears</a>
<a href="http://google.com" target="_blank">Google (Opens in New Window)</a>
<a href="http://amazon.com" target="_blank">Amazon (Opens in New Window)</a>



連續地使用函數(Chaining):
----------------------------------------------
jQuery 很重要的一個特性是可以連續地使用函數(Chaining),當你選取了一個或一組的元素後,可以連續對這些元素進行多個處理。以下範例會將所有的 <div> 隱藏,修改文字顏色為藍色,再將 <div> 以下拉布幕的效果顯示出來:
$("div").hide();
$("div").css("color", "blue");
$("div").slideDown();
這樣的三行程式碼可以用以下一行的程式碼取代,結果會是完全相同的:
$("div").hide().css("color", "blue").slideDown();




相關的教學文章:
----------------------------------------------
jQuery 學習筆記
網址:http://blog.ericsk.org/archives/tag/jquery-tut
作者:ericsk
部落格:國二學生認真打雜

自製 jQuery Plugin
網址:http://www.jaceju.net/blog/?p=336 (Part 1)
http://www.jaceju.net/blog/?p=337 (Part 2)
作者:jace ju
部落格:網站製作學習誌

jQuery 手冊- 選擇器(Selectors 1.2)
網址:http://jquery.shian.tw/selectors.php
作者:遨遊飛翔
部落格:遨遊飛翔

邊做邊學 jQuery 系列 (有圖有文有影片、適合 ASP.NET 的開發者)
網址:http://msdn.microsoft.com/zh-tw/asp.net/dd446623.aspx
作者:Jeffrey
部落格:黑暗執行緒



相關的範例下載:
----------------------------------------------
http://jsgears.com/tag.php?name=jQuery


官方網站:
----------------------------------------------
http://jquery.com/

2011年11月29日 星期二

[HTML].flash 上傳元件的限制

前言:
最近在開發一個 HTML 上傳檔案的 form, 類似 gmail 的界面, 可以在同一個畫面裡, 透過 flash 上傳多筆的附件檔案.

這次的遇到的問題是, 我在畫面中使用了2個 swfupload 物件, 一個要上傳附件, 一個要上傳多媒體檔案, 上傳多媒體檔案時, 無法讓檔案上傳, 可是上傳附件的部份都ok.


* 附註:上傳多媒體檔案的方式是透過 jQuery 的 blockUI plugin 彈出一個 dialog:

說明: 這個彈出的方式, 比較特別, 是先選取檔案, 等使用者按下 "上傳"按鈕, 才開始上傳資料.


debug swfupload 的 message 如下:




假設, 是因為放了2個 swfupload object 造成的沖衝. 我的除錯流程如下:
挑戰解法 1, 增加一個新的區塊, 把這種"確定後才開始上傳" 的範例用的程式都放到新的區塊. 測試結果, 是ok的. 測試的範例, 可以2段式的, 按下確定後, 才開始上傳.

挑戰解法 2. 移掉 附件在用的 swfupload object, 讓畫面只剩下 上傳多媒體用的 swfupload object, 結果,還是不能 work.

所以, 這一個假設, 應該不成立, 於是比較看看目前的顯示方式, 與"確定後才開始上傳" 的範例的差異, 假設要存取 user client 端的資料時, swfupload 必需是 visible(也許看的到), 結果可行, 似乎是安全性造成的.

結果: flash 上傳元件的限制, 就是 user 要開始上傳 client 端資料時的一瞬間, swfupload object 需要要顯示在畫面裡可能被看的見的區塊裡, 用 "一瞬間" 的意思指, 原本隱藏的區塊, 在 "選取" 檔案時, 和 "開始上傳時" 這2個時間點, 都顯示在畫面上, 是可以上傳成功的.


* 附註: 當 user 選好 client 端的檔案後, "可能" 不能對這一個 flash object 做搬移區塊的動作. 搬了的話會造成 flash UI 的重新整理, 也會造成無法上傳檔案. 會用 "可能", 是指我的手法可能太遜, 搬失敗, 可能有其他的方法, 可以正常地去搬移 flash object 的位置, 而且還可以正常的上傳, 這個部份先跳過...



相關文章:
swfupload Document:
http://demo.swfupload.org/Documentation/#startUpload

swfupload project:
http://code.google.com/p/swfupload/

後記: 原來是 blockUI 裡的 bindEvents, 把事件吃掉..., 我最後的解法是 bindEvents: false, 然後再把 flash 放在一個奇怪的 position:absolute;z-index:9999; left:-100px; top:-50px; 的 layer 裡, 應該可以有更好的解法 XD

2011年11月24日 星期四

JQuery 背景變暗dialog example

新版本的 jQuery 有提供 .dialog(),參考看看.
http://jqueryui.com/demos/dialog/
or
http://docs.jquery.com/UI/API/1.7.2/Dialog
or
http://hi.baidu.com/li_mingzhu/blog/item/1279308d319a0ea60e2444fd.html

另一個不錯的解決方案是使用 blockUI:
http://www.malsup.com/jquery/block/
or
http://jsgears.com/thread-72-1-2.html

blockUI 用起來真的很方便,參數:
showOverlay: false , 就是指,modalless, 背景不會被 lock 住.
showOverlay: true , 就是指,modal, 背景會 lock 住.


google keyword: jquery blockUI, 這個似乎比較好用.

Facebook 留言板