jQuery plugin - Signature Pad
一、甚麼是Sigunature Pad?
Signature Pad是 jQuery 的 plugin。使用 HTML5 的 canvas 元件建立簽名板時,利用此插件,可使簽名板開發更簡便迅速,不再被line to、move to、stroke之類繁雜指令,搞到頭暈眼花。在行動平台上的表現,效果亦相當順暢良好。
感謝 Thomas J Bradley 的無私奉獻,相當難能可貴的是這位作者,還將此元件的 optios、API methods 一一詳列說明於網站上,不似一般開源專案如衛生紙般薄薄的說明。
有興趣可以到這個網址下載,並看看說明。
http://thomasjbradley.ca/lab/signature-pad/
二、使用方法
主要有3個檔案須加入網頁中。
jquery.signaturepad.js
json2.min.js
flashcanvas.js
另外也可套用作者設計好的樣式。
jquery.signaturepad.css
(基本樣板)
把這段加入 html。
<form method="post" action="" class="sigPad"> <div class="sigPad signed"> <div class="sigWrapper"> <canvas class="pad" width="600" height="300"></canvas> </div> </div> </form>
以下加入 javascript。
$("document").ready(function(){
api = $(".sigPad").signaturePad({drawOnly:true, lineWidth:0});
});
ASUS Fonepad ME371MG
Signature Pad 也可以透過給予座標數字,重繪顯示於畫面中。
例如:
$("document").ready(function(){
var sigAry = [{"lx":112,"ly":28,"mx":112,"my":27},
{"lx":112,"ly":27,"mx":112,"my":28},
{"lx":116,"ly":27,"mx":112,"my":27},
{"lx":119,"ly":28,"mx":116,"my":27},
{"lx":122,"ly":28,"mx":119,"my":28},
{"lx":131,"ly":32,"mx":122,"my":28},
{"lx":154,"ly":47,"mx":131,"my":32},
{"lx":165,"ly":57,"mx":154,"my":47},
{"lx":167,"ly":58,"mx":165,"my":57},
{"lx":181,"ly":70,"mx":167,"my":58},
{"lx":197,"ly":85,"mx":181,"my":70},
{"lx":206,"ly":93,"mx":197,"my":85},
{"lx":209,"ly":95,"mx":206,"my":93},
{"lx":211,"ly":97,"mx":209,"my":95},
{"lx":217,"ly":100,"mx":211,"my":97},
{"lx":218,"ly":102,"mx":217,"my":100}]
api = $(".sigPad").signaturePad({drawOnly:true, lineWidth:0}).regenerate(sigAry);
});
便可以產生如下線條了。
如果要獲取路徑座標資訊,可以透過 getSigunatureString() 方法取得。
例如:
我們在網頁上放置一個按鈕觸發獲取事件,及一個 ID 為 message 的 <div> 元素,用來顯示獲取的座標字串。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="format-detection" content="telephone=no" />
<!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 -->
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
<meta name="msapplication-tap-highlight" content="no" />
<script type="text/javascript" src="cordova.js"></script>
<link rel="stylesheet" href="css/jquery.mobile-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.structure-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.theme-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.inline-svg-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.inline-png-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.icons-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.external-png-1.4.2.css">
<link rel="stylesheet" href="css/jquery.signaturepad.css">
<link rel="stylesheet" type="text/css" href="css/index.css" />
<script type="text/javascript" src="js/jquery-2.1.0.js"></script>
<script type="text/javascript" src="js/jquery.mobile-1.4.2.js"></script>
<script src="js/jquery.signaturepad.js"></script>
<script src="js/json2.min.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<title>Touch Paint v1</title>
</head>
<body>
<div data-role="page" id="page_main" style="margin-top: 20px">
<div data-role="header">
<h1>Touch Paint</h1>
</div>
<div data-role="content">
<div id="btn_group">
<a href="#" data-role="button" data-inline="true" onclick="showSig()">Show Signature</a>
</div>
<div>
<form method="post" action="" class="sigPad">
<div class="sigPad signed">
<div class="sigWrapper">
<canvas class="pad" width="600" height="300"></canvas>
</div>
</div>
</form>
</div>
</div>
<div id="message"></div>
</div>
</body>
</html>
在 javascript 加上 showSig() 自訂函式。
var api = null;
$("document").ready(function(){
api = $(".sigPad").signaturePad({drawOnly:true, lineWidth:0});
});
/*=======================================================================*/
function showSig(){
var posAry = api.getSignatureString();
$("#message").append("<p>"+posAry+"</p>");
}
畫完之後,按下按鈕顯示經過路徑資訊,以JSON格式字串呈現。
那如果要輸出以供傳送到伺服器上或其他頁面使用呢? Sigunature Pad 提供兩種輸出方法。
一種就是前面提的 getSigunatureString() 輸出 JSON 格式字串保存。
另一 getSigunatureImage() 產生 base64 編碼的 png。
我們在網頁上另外放置一個按鈕觸發 getSigunatureImage() 方法。同時加入 <img /> 元素,讓編碼字串塞到 src 屬性值內,就可以完整呈現 PNG 圖片。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="format-detection" content="telephone=no" />
<!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 -->
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
<meta name="msapplication-tap-highlight" content="no" />
<script type="text/javascript" src="cordova.js"></script>
<link rel="stylesheet" href="css/jquery.mobile-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.structure-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.theme-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.inline-svg-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.inline-png-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.icons-1.4.2.css">
<link rel="stylesheet" href="css/jquery.mobile.external-png-1.4.2.css">
<link rel="stylesheet" href="css/jquery.signaturepad.css">
<link rel="stylesheet" type="text/css" href="css/index.css" />
<script type="text/javascript" src="js/jquery-2.1.0.js"></script>
<script type="text/javascript" src="js/jquery.mobile-1.4.2.js"></script>
<script src="js/jquery.signaturepad.js"></script>
<script src="js/json2.min.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<title>Touch Paint v1</title>
</head>
<body>
<div data-role="page" id="page_main" style="margin-top: 20px">
<div data-role="header">
<h1>Touch Paint</h1>
</div>
<div data-role="content">
<div id="btn_group">
<a href="#" data-role="button" data-inline="true" onclick="showSig()">Show Signature</a>
<a href="#" data-role="button" data-inline="true" onclick="sig2Img()">Signature to Image</a>
</div>
<div>
<form method="post" action="" class="sigPad">
<div class="sigPad signed">
<div class="sigWrapper">
<canvas class="pad" width="600" height="300"></canvas>
</div>
</div>
</form>
</div>
</div>
<div>
<img id="redraw" src="" />
</div>
<div id="message"></div>
</div>
</body>
</html>
在 javascript 加上 sig2Img()。
var api = null;
$("document").ready(function(){
api = $(".sigPad").signaturePad({drawOnly:true, lineWidth:0});
});
/*=======================================================================*/
function showSig(){
var posAry = api.getSignatureString();
$("#message").append("<p>"+posAry+"</p>");
}
function sig2Img(){
var img = api.getSignatureImage();
$("#message").append("<p>"+img+"</p>");
$("#redraw").attr("src",img);
}
測試。
開發者可以 JSON格式或 base64 code 傳入後台儲存。
至於伺服端如何將 JSON 轉換成 image,作者也針對不同伺服器端語言,提供解決類別庫,C#也有。
如果要改變 pad 的大小,直接在 <canvas /> 裡設定 width、height屬性即可。
如果有使用作者預設的CSS,可以直接修改。
<canvas /> 屬性設定值要略小於 預設 CSS 裡的設定。
三、options
可以用來改變 Signature Pad 的一些預設選項包含外觀。例如背景、顏色大小、筆觸大小顏色、onDraw call back function等等...
每一組 option 都是成對的 key/value JSON 格式。
所有可設定的 option ,在作者網站上都有羅列說明。
http://thomasjbradley.ca/lab/signature-pad/#options-ref
四、API
作者也提供幾個實作方法,供輸出入值,或簡單作業。
http://thomasjbradley.ca/lab/signature-pad/#api-ref
常用如下
regenerate:透過輸入座標繪出線條。
clearCanvas:清除繪布。
getSignature:取得路徑資訊,傳回 JSON 格式的陣列物件。
getSignatureString:取得路徑資訊,傳回 JSON 格式的字串。
getSignatureImage:路徑轉為PNG,傳回以 base64 編碼 PNG 的字串。
五、附上三種不同平台表現擷圖。
iPad2-iOS7
ASUS Fonepad ME371MG-Android4.1
桌機-Chrome