我知道這一天終將會到來,現在,它來了。
需求
開發 SharePoint 的 CSOM 應用時,經常需要在網頁上輸出一些信息。
這種需求和 alert 的彈窗、F12 的斷點查看信息的場景是不一樣的:在這種場景下,你就是端着杯咖啡靠在那里坐着,看着關於應用程序運行的信息不斷的在網頁上輸出,不用去關閉彈窗、也不用去設置斷點。
詳細的功能需求如下:
- 輸出的信息中自動包含時間
- 輸出的信息按照類型顯示不同的樣式
- 輸出的信息類型包括:普通信息、調試信息、警告、錯誤
- 可選按照時間升序輸出信息(稍作修改可以時間降序排列)
設計
原理與實現
首先,來個簡單的原理。寫一個空的 plugin:
1: $.fn.message = function () {
2: return this;
3: }
這個 plugin 的用法就是:
1: var msg = $("#divMessage").message();
這里面的關鍵就是拿到了 this 這個對象,后面的所有代碼、功能的實現都依賴於這個對象。
接下來,實現 show 函數來做測試。show 函數將接受消息內容作為參數,然后顯示出來:
1: $.fn.message = function () {
2: this.show = function (msg) {
3: this.html(msg);
4: }
5: return this;
6: }
然后,可以這樣用:
1: <div id="divMessage">Messaeg</div>
2: <script>
3: $(document).ready(function () {
4: var msg = $("#divMessage").message();
5: msg.show("hello");
6: });
7: </script>
於是,內容就出來了:
接下來,的代碼就很簡單了(jquery.message.js):
1: /* 時間格式化函數 */
2: jQuery.utility = {
3: leading:function (char, width, value) {
4: var ret = value.toString();
5: while (width > 1) {
6: if (value >= (Math.pow(10,width - 1))) {
7: break;
8: } else {
9: ret = char + ret;
10: }
11: width--;
12: }
13: return ret;
14: },
15:
16: now : function () {
17: var date = new Date();
18: var ret = {};
19: ret.hours = $.utility.leading('0', 2, date.getHours());
20: ret.minutes = $.utility.leading('0', 2, date.getMinutes());
21: ret.seconds = $.utility.leading('0', 2, date.getSeconds());
22: return ret;
23: }
24: };
25:
26: /* 消息插件函數 */
27: $.fn.message = function () {
28: this.show = function (msg) {
29: this.html(msg);
30: }
31: this.clear = function () {
32: this.html('');
33: }
34: this.append = function (tag, msg) {
35: var date = $.utility.now();
36: var tagContent = "<span class='msg-" + tag + "'>" + tag + "</span><span class='msg-datetime'>" + date.hours + ":" + date.minutes + ":" + date.seconds + "</span>";
37: this.html(this.html() + "<br/>" + tagContent + "<span class='msg-message'>" + msg + "</span>");
38: }
39: this.warning = function (msg) {
40: this.append("warning", msg);
41: }
42: this.error = function (msg) {
43: this.append("error", msg);
44: }
45: this.succeed= function (msg) {
46: this.append("succeed", msg);
47: }
48: this.debug = function (msg) {
49: this.append("debug", msg);
50: }
51: this.info = function (msg) {
52: this.append("info", msg);
53: }
54: return this;
55: }
當然,少不了 CSS 樣式(jquery.message.css):
1: .msg-message, .msg-info, .msg-warning, .msg-error, .msg-succeed, .msg-debug, .msg-datetime, .msg-view-link {
2: padding:3px;
3: -moz-border-radius:5px;
4: -webkit-border-radius:5px;
5: border-radius:5px;
6: margin-right:2px;
7: margin-left:2px;
8: line-height:2em;
9: font-family:Consolas, 'Lucida Console', 'DejaVu Sans Mono', monospace;
10: cursor:default;
11: }
12: .msg-info, .msg-warning, .msg-error, .msg-succeed, .msg-debug, .msg-datetime {
13: box-shadow:rgba(0,0,0,0.2) 1px 1px;
14: }
15: .msg-warning {
16: border:1px solid yellow;
17: }
18: .msg-error {
19: border:1px solid red;
20: }
21: .msg-succeed {
22: border:1px solid green;
23: }
24: .msg-debug {
25: border:1px solid darkgray;
26: }
27: .msg-info {
28: border:1px solid blue;
29: }
30: .msg-datetime {
31: border:1px dotted darkgray;
32: }
部署
很簡單,只需要引入 jquery-{version}.js 和 jquery.message.js (上面的 JS 代碼即是)、jquery.message.css。
1: <link rel="stylesheet" href="../Style/jquery.message.css" />
2: <script type="text/javascript" src="../Reference/jquery/jquery-1.11.1.min.js"></script>
3: <script type="text/javascript" src="../Library/jquery.message.js"></script>
P.S. 對於 jQuery 這樣有開發版和 min 版的 js 組件,可以考慮用 ScriptManager 來根據解決方案的配置動態引用對應版本。
應用
好了,下面寫幾句看看效果:
1: <link rel="stylesheet" href="../Style/jquery.message.css" />
2: <script type="text/javascript" src="../Reference/jquery/jquery-1.11.1.min.js"></script>
3: <script type="text/javascript" src="../Library/jquery.message.js"></script>
4: <div id="divMessage"></div>
5: <script>
6: $(document).ready(function () {
7: var msg = $("#divMessage").message();
8: msg.succeed("Host web context ready.");
9: msg.debug("List title is 'Data List'.");
10: msg.error("List doesn't exist.")
11: });
12: </script>

嗯,還不錯。看這些消息,你就應該知道在 SharePoint 里面怎么用了吧 :)
■