輕量表格庫(kù)。

創(chuàng)新互聯(lián)主要從事網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)涵江,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
1.wFormswForms是開源和不顯眼的庫(kù),它簡(jiǎn)化了最常見的JavaScript形式的功能。它提供了現(xiàn)成的表單驗(yàn)證功能,可以通過(guò)向表單對(duì)象添加類信息來(lái)應(yīng)用這些功能。除此之外,wForms具有強(qiáng)大的表單同步(如“Check”/“Uncheckall”)和條件表單功能(例如,如果選中x,則顯示y)。
2.ValidanguageValidanguage也是一個(gè)不顯眼的JavaScript表單驗(yàn)證框架。它有一個(gè)繼承邏輯,其設(shè)置可以按照表單或每個(gè)元素進(jìn)行全局定義。通過(guò)提供的2個(gè)API:以及集成的AJAX支持,緩存和回調(diào)函數(shù)等功能,該框架提供了強(qiáng)大的驗(yàn)證體驗(yàn)。它有一個(gè)類似HTML的API插入注釋標(biāo)記和一個(gè)基于JavaScript對(duì)象的API,用于高級(jí)配置。LiveValidationLiveValidation是一個(gè)輕量級(jí)庫(kù),為你提供一組驗(yàn)證功能。除了經(jīng)典的驗(yàn)證方法,該庫(kù)還具有強(qiáng)大的實(shí)時(shí)驗(yàn)證功能。
使用npm安裝jsdoc后,其文件目錄結(jié)構(gòu)如下:
參考: taffydb
而static文件夾放置靜態(tài)文件,它會(huì)被原封不動(dòng)地復(fù)制到生成的文件夾中,tmpl是模板文件
taffyData是包含所有doclet的taffyData,doclet是@link,@name...
比如使用了@name,就可以使用docs[0].name獲取第一個(gè)@name值
和模板相關(guān)的模塊是:
生成template的語(yǔ)句是
再看template.js導(dǎo)出類的構(gòu)造函數(shù)
layout的初始化語(yǔ)句:
所以,如果要自定義模板(假設(shè)為 selfTheme ,以下都以其為例)的配置項(xiàng),只需要使用 env.conf.templates 獲取即可。例如:
template.js導(dǎo)出類的方法如下:
因此,在 layout.tmpl 文件中,有 content 變量表示當(dāng)前頁(yè)內(nèi)容
當(dāng)然,同時(shí)具有data包含的其它屬性變量
在publish.js中,直接使用render函數(shù)的有兩處。
所以,要修改各頁(yè)面的標(biāo)題,只需要將調(diào)用這兩個(gè)函數(shù)的title函數(shù)換掉,比如:
不過(guò)重點(diǎn)還是添加模板變量和方法
添加到view中的方法/屬性:
docs是一個(gè)包含數(shù)據(jù)的Taffy對(duì)象,它的來(lái)源是:
// myClasses等就是傳入模板文件的docs變量
在模板中則用this.find({kind: 'class'})代替(view.find)
docs的元素內(nèi)容是:
特別的:
這是源于兩年前,當(dāng)我在做人生中第一個(gè)真正意義上的網(wǎng)站時(shí)遇到的一個(gè)問題
該網(wǎng)站采用前后端分離的方式,由后端的
REST
接口返回
JSON
數(shù)據(jù),再由前端渲染到頁(yè)面上。
同許多初學(xué)
Javascript
的菜鳥一樣,起初,我也是采用拼接字符串的形式,將
JSON
數(shù)據(jù)嵌入
HTML
中。開始時(shí)代碼量較少,暫時(shí)還可以接受。但當(dāng)頁(yè)面結(jié)構(gòu)復(fù)雜起來(lái)后,其弱點(diǎn)開始變得無(wú)法忍受起來(lái):
書寫不連貫。每寫一個(gè)變量就要斷一下,插入一個(gè)
+
和
"。十分容易出錯(cuò)。
無(wú)法重用。HTML
片段都是離散化的數(shù)據(jù),難以對(duì)其中重復(fù)的部分進(jìn)行提取。
無(wú)法很好地利用
template
標(biāo)簽。這是
HTML5
中新增的一個(gè)標(biāo)簽,標(biāo)準(zhǔn)極力推薦將
HTML
模板放入
template
標(biāo)簽中,使代碼更簡(jiǎn)潔。
當(dāng)時(shí)我的心情就是這樣的:
這TMD是在逗我嗎
為了解決這個(gè)問題,我暫時(shí)放下了手上的項(xiàng)目,花了半個(gè)小時(shí)實(shí)現(xiàn)一個(gè)極簡(jiǎn)易的字符串模板。
需求描述
實(shí)現(xiàn)一個(gè)
render(template,
context)
方法,將
template
中的占位符用
context
填充。要求:
不需要有控制流成分(如
循環(huán)、條件
等等),只要有變量替換功能即可
級(jí)聯(lián)的變量也可以展開
被轉(zhuǎn)義的的分隔符
{
和
}
不應(yīng)該被渲染,分隔符與變量之間允許有空白字符
例子:
render('My
name
is
{name}',
{
name:
'hsfzxjy'
});
//
My
name
is
hsfzxjy
render('I
am
in
{profile.location}',
{
name:
'hsfzxjy',
profile:
{
location:
'Guangzhou'
}
});
//
I
am
in
Guangzhou
render('{
greeting
}.
\\{
This
block
will
not
be
rendered
}',
{
greeting:
'Hi'
});
//
Hi.
{
This
block
will
not
be
rendered
}
實(shí)現(xiàn)
先寫下函數(shù)的框架:
function
render(template,
context)
{
}
顯然,要做的第一件事便是
匹配模板中的占位符。
匹配占位符
匹配的事,肯定是交給正則表達(dá)式來(lái)完成。那么,這個(gè)正則表達(dá)式應(yīng)該長(zhǎng)什么樣呢?
根據(jù)
需求
1、2
的描述,我們可以寫出:
var
reg
=
/\{([^\{\}]+)\}/g;
至于需求
3,我第一個(gè)想到的概念是
前向匹配,可惜
Javascript
并不支持,只好用一個(gè)折衷的辦法:
var
reg
=
/(\\)?\{([^\{\}\\]+)(\\)?\}/g;
//
若是第一個(gè)或第三個(gè)分組值不為空,則不渲染
現(xiàn)在,代碼應(yīng)該是這樣:
function
render(template,
context)
{
var
tokenReg
=
/(\\)?\{([^\{\}\\]+)(\\)?\}/g;
return
template.replace(tokenReg,
function
(word,
slash1,
token,
slash2)
{
if
(slash1
||
slash2)
{
//
匹配到轉(zhuǎn)義字符
return
word.replace('\\',
'');
//
如果
分隔符被轉(zhuǎn)義,則不渲染
}
//
...
})
}
占位符替換
嗯,正則表達(dá)式確定了,接下來(lái)要做的便是替換工作。
根據(jù)
需求2,模板引擎不僅要能渲染一級(jí)變量,更要渲染多級(jí)變量。這該怎么做呢?
其實(shí)很簡(jiǎn)單:將
token
按
.
分隔開,逐級(jí)查找即可:
var
variables
=
token.replace(/\s/g,
'').split('.');
//
切割
token
var
currentObject
=
context;
var
i,
length,
variable;
//
逐級(jí)查找
context
for
(i
=
0,
length
=
variables.length,
variable
=
variables[i];
i
length;
++i)
currentObject
=
currentObject[variable];
return
currentObject;
不過(guò),有可能
token
指定的變量并不存在,這時(shí)上面的代碼便會(huì)報(bào)錯(cuò)。為了更好的體驗(yàn),代碼最好有一定的容錯(cuò)能力:
var
variables
=
token.replace(/\s/g,
'').split('.');
//
切割
token
var
currentObject
=
context;
var
i,
length,
variable;
for
(i
=
0,
length
=
variables.length,
variable
=
variables[i];
i
length;
++i)
{
currentObject
=
currentObject[variable];
if
(currentObject
===
undefined
||
currentObject
===
null)
return
'';
//
如果當(dāng)前索引的對(duì)象不存在,則直接返回空字符串。
}
return
currentObject;
把所有的代碼組合在一起,便得到了最終的版本:
function
render(template,
context)
{
var
tokenReg
=
/(\\)?\{([^\{\}\\]+)(\\)?\}/g;
return
template.replace(tokenReg,
function
(word,
slash1,
token,
slash2)
{
if
(slash1
||
slash2)
{
return
word.replace('\\',
'');
}
var
variables
=
token.replace(/\s/g,
'').split('.');
var
currentObject
=
context;
var
i,
length,
variable;
for
(i
=
0,
length
=
variables.length,
variable
=
variables[i];
i
length;
++i)
{
currentObject
=
currentObject[variable];
if
(currentObject
===
undefined
||
currentObject
===
null)
return
'';
}
return
currentObject;
})
}
除去空白行,一共
17
行。
將函數(shù)掛到
String
的原型鏈
甚至,我們可以通過(guò)修改原型鏈,實(shí)現(xiàn)一些很酷的效果:
String.prototype.render
=
function
(context)
{
return
render(this,
context);
};
之后,我們便可以這樣調(diào)用啦:
"{greeting}!
My
name
is
{
author.name
}.".render({
greeting:
"Hi",
author:
{
name:
"hsfzxjy"
}
});
//
Hi!
My
name
is
hsfzxjy.
es6中增加了模板字符串,使字符的操作更加靈活和解決復(fù)雜的問題。
語(yǔ)法:
使用反引號(hào)( ` )來(lái)包裹普通字符串。如:
在模板字符串中可以將任何有效的 JS 表達(dá)式嵌入到模板字面量中,并將其結(jié)果輸出為 字符串的一部分。如:
簡(jiǎn)單的變量替換
復(fù)雜的表達(dá)式
就是使用javascript做的一些非常漂亮的特效,比如導(dǎo)航條,一些炫酷的動(dòng)畫,這些模板的好處就是只需修改對(duì)應(yīng)的html元素的id 或者class,就可以將這些效果應(yīng)用到屬于你自己的網(wǎng)頁(yè)上。百度知道上也有很多JS特效,比如抽獎(jiǎng)和商城頁(yè)面的特效就非常炫酷。
當(dāng)前標(biāo)題:模板javascript,模板圖片
本文URL:http://chinadenli.net/article40/dsidieo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、用戶體驗(yàn)、網(wǎng)站維護(hù)、網(wǎng)站內(nèi)鏈、虛擬主機(jī)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)