`
f002489
  • 浏览: 271948 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

仿服务器端脚本方式的JS模板实现方法

阅读更多

http://bbs.51js.com/thread-65160-1-1.html 

 

 

 

<html xmlns="http://www.w3.org/1999/xht... 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<title>jssp演示</title> 
<script language="javascript"> 
/** 
* @description: 
* 使用javascript模仿JSP的页面解析和运行,运行于客户端 
* 允许应用人员象开发JSP页面一样使用<%..%> 
* 允许页面动态包括子页面(同步读取页面) 

**/ 

//@--------------------------------------------------------------------- JSSP声明 
var jssp=function(){}; 

/** 
* 页面缓存管理实例对象 
*/ 
jssp.cacheInstance=null; 
/** 
* 页面加载实例对象 
*/ 
jssp.pageLoaderInstance=null; 

/** 
* 在指定dom插入pagePath的执行后的页面内容 
*/ 
jssp.render=function(pagePath,dom){ 
if(typeof dom=="string") dom=document.getElementById(dom); 
var content=jssp.Core.run(pagePath); 
dom.innerHTML=content; 


//@------------------------------------------------------------------------ JSSP运行配置 
/** 
* 引擎运行全局配置 
*/ 
jssp.Config={}; 
/** 
* 如果在客户端运行,是否缓存解析的页面 
*/ 
jssp.Config.cachable=true; 
/** 
* 当jssp.Config.cacheable为true且在 
*/ 
jssp.Config.cacheClass="jssp.Cache.DefaultCache"; 
/** 
* 页面内容读取器 
*/ 
jssp.Config.pageLoaderClass="jssp.Core.PageLoader.Ajax"; 

//@------------------------------------------------------------------------ JSSP页面缓存类 
/** 
* 页面缓存类 
*/ 
jssp.Cache=function(){} 
/** 
* 设置缓存 
*/ 
jssp.Cache.prototype.set=function(key,cache){} 
/** 
* 得到缓存 
*/ 
jssp.Cache.prototype.get=function(key){} 
/** 
* 默认的缓存实现类 
*/ 
jssp.Cache.DefaultCache=function(){ 
this.caches={}; 

jssp.Cache.DefaultCache.prototype.set=function(key,cache){ 
this.caches[key]=cache; 

jssp.Cache.DefaultCache.prototype.get=function(key){ 
return this.caches[key]; 


//@----------------------------------------------------------------------- JSSP运行上下文类 
/** 
* jssp页面的执行上下文对象 
* @member params 请求参数数组 
* @member cookies 操作cookies对象 jssp.Cookies 
* @member out 页面流输出对象 jssp.Out 
* @method setAttribute 设置上下文参数 
* @method getAttribute 得到上下文参数 
* @method removeAttribute 删除上下文参数 
* @method include 动态包含子页面 
* @method getCookies,getParameter,getParameters,getOut 
* @param pageUrl 运行的上下文参数 
* @param context 父页面的上下文对象 
*/ 
jssp.Context=function(pageUrl,context){ 
this.params=this._resolveParam(pageUrl); 
if(!context){ 
this.cookies=jssp.Cookies; 
this.out=new jssp.Out(); 
this.attributes=[]; 
}else{ 
this.context=context; 
this.isIncluded=true; 



/** 
* 解析页面后缀参数 
*/ 
jssp.Context.prototype._resolveParam=function(pageUrl){ 
var i1=pageUrl.indexOf("?"); 
if(i1<=0) return []; 
pageUrl=pageUrl.substring(i1+1); 
var s1=pageUrl.split("&"); 
var params=[]; 
for(var i=0;i<s1.length;i++){ 
var s2=s1[i].split("="); 
var key=s2[0];var value=s2[1]; 
var ps=params[key]; 
if(!ps) ps=[]; 
ps[ps.length]=value; 
params[key]=ps; 

return params; 

/** 
* 设置参数值 
*/ 
jssp.Context.prototype.setAttribute=function(key,value){ 
if(!this.context) 
this.attributes[key]=value; 
else 
this.context.setAttribute(key,value); 

/** 
* 得到参数值 
*/ 
jssp.Context.prototype.getAttribute=function(key){ 
if(!this.context) 
return this.attributes[key]; 
else 
return this.context.getAttribute(key); 

/** 
* 删除指定键的参数值 
*/ 
jssp.Context.prototype.removeAttribute=function(key){ 
if(!this.context) 
this.attributes[key]=undefined; 
else 
this.context.removeAttribute(key); 

/** 
* 得到请求参数值 
*/ 
jssp.Context.prototype.getParameter=function(key){ 
var ps=this.params[key]; 
if(!ps) return this.context?this.context.getParameter(key):undefined; 
return ps.join(","); 

/** 
* 得到有重复参数的值 
*/ 
jssp.Context.prototype.getParameters=function(key){ 
var pss=this.params[key]; 
if(!pss) pss=this.context?this.context.getParameters(key):undefined; 
return pss; 

/** 
* 得到cookies对象 
*/ 
jssp.Context.prototype.getCookies=function(){ 
if(!this.context) 
return this.cookies; 
else 
return this.context.getCookies(); 

/** 
* 得到输出流OUT对象 
*/ 
jssp.Context.prototype.getOut=function(){ 
if(!this.context) 
return this.out; 
else 
return this.context.getOut(); 

/** 
* 动态包含子页面 
*/ 
jssp.Context.prototype.include=function(childPageUrl){ 
this.getOut().print(jssp.Core.run(childPageUrl,this)); 


jssp.Context.prototype.isIncluded=false;//判断当前页面是否被包含的 

//@-----------------------------------------------------------------------JSSP运行cookies操作类 
/** 
* 简单操纵cookies方法 
*/ 
jssp.Cookies=function(){} 
/** 
* 设置cookie项 
*/ 
jssp.Cookies.set=function(key,value){ 
document.cookie=key+"="+escape(value)+";"; 

/** 
* 得到cookie项 
*/ 
jssp.Cookies.get=function(key){ 
var aCookie=document.cookie.split("; "); 
for(var i=0;i<aCookie.length;i++){ 
var aCrumb=aCookie[i].split("="); 
if(key==aCrumb[0]) 
return unescape(aCrumb[1]); 


/** 
* 删除cookies项 
*/ 
jssp.Cookies.remove=function(key){ 
document.cookie=key+"=null; expires=Fri, 31 Dec 1999 23:59:59 GMT;"; 

//@------------------------------------------------------------------------ JSSP页面运行输出流类 
/** 
* 页面流输出对象 
*/ 
jssp.Out=function(){ 
this.datas=[];//数据流片断 
this._index=0; 

/** 
* 把页面流片断放入缓冲区 
*/ 
jssp.Out.prototype.print=function(s){ 
this.datas[this._index++]=s; 

/** 
* 输出缓冲区里的数据 
*/ 
jssp.Out.prototype.flush=function(){ 
var data=this.datas.join(""); 
this.datas=[];this._index=0; 
return data; 

//@--------------------------------------------------------------------------JSSP页面核心类声明 
jssp.Core=function(){} 
//@--------------------------------------------------------------------------JSSP页面解析实现类 
/** 
* 页面解析 
* @param pageContent JSSP页面内容 
*/ 
jssp.Core.parse=function(pageContent){ 

var strBuffer=[];//解析后文本存放的缓冲区 
var point=0;//缓冲区指针 
var lineNumber=1;//解析的当前行 

try{ 
var betweenPerc=false; 
var isPrint=false; 
strBuffer[point++]="function($context){\n"; 
strBuffer[point++]="var $out=$context.getOut();\n"; 
strBuffer[point++]="var $cookies=$context.getCookies();\n"; 
strBuffer[point++]="try{\n"; 
strBuffer[point++]="$out.print(unescape('"; 
var line=""; 
var value=pageContent; 
var len=value.length; 
for(var i=0;i<len;i++){ 
var nextTwo=""; 
if(i<=len-2) nextTwo=value.charAt(i)+value.charAt(i+1); 
var nextThree=""; 
if(i<=len-3) nextThree=nextTwo+value.charAt(i+2); 
if(nextTwo=="<%"&&nextThree!="<%="&&nextThree!="<%@"){ 
strBuffer[point++]="'));\n"; 
betweenPerc=true; 
i+=1; 
}else if(nextTwo=="<%"&&nextThree=="<%="&&nextThree!="<%@"){ 
strBuffer[point++]=escape(line)+"'));\n"; 
line=""; 
strBuffer[point++]=" $out.print( "; 
betweenPerc=true; 
isPrint=true; 
i+=2; 
}else if(nextTwo=="<%"&&nextThree!="<%="&&nextThree=="<%@"){ 
i+=3; 
var directive=""; 
while(nextTwo!="%>"){ 
directive+=value.charAt(i); 
i++; 
if(i<=value.length-2){ 
nextTwo=value.charAt(i)+value.charAt(i+1); 


strBuffer[point++]=escape(line)+"'));\n"; 
line=""; 
strBuffer[point++]=jssp.Core.parse._handleDirective(directive); 
strBuffer[point++]=" $out.print(unescape('"; 
i++; 
}else if(nextTwo=="%>"){ 
strBuffer[point++]=(isPrint?");":"")+"\n $out.print(unescape('"; 
if(!betweenPerc) throw new jssp.Core.parse.ParseException("解析错误","必须用'%>'作为结束标签"); 
betweenPerc=false; 
isPrint=false; 
i+=1; 
}else if(value.charAt(i)==String.fromCharCode(10)){ 
if(!betweenPerc){ 
strBuffer[point++]=escape(line)+"\\n'));\n"+" $out.print(unescape('"; 
line=""; 
lineNumber++; 

}else if(value.charAt(i)==String.fromCharCode(13)){ 
if(betweenPerc) strBuffer[point++]="\n"; 
}else{ 
if(betweenPerc) 
strBuffer[point++]=value.charAt(i); 
else 
line+=value.charAt(i); 


strBuffer[point++]=escape(line)+"'));\n"; 
strBuffer[point++]="}catch(e){\n"; 
strBuffer[point++]="return '"+"执行页面发生异常.异常类型:'+e.name+'. 错误消息: '+e.message;\n"; 
strBuffer[point++]="}\n"; 
strBuffer[point++]="if(!$context.isIncluded) return $out.flush();\n"; 
strBuffer[point++]="}\n"; 
}catch(e){ 
point=0; 
strBuffer=[]; 
strBuffer[point++]="function($context){\n"; 
strBuffer[point++]="return \""+"An exception occurred while parsing on line "+lineNumber+". Error type: "+e.name+". Error message: "+e.message+"\";"; 
strBuffer[point++]="}"; 

var out=strBuffer.join(""); 
return out; 

/** 
* 解析指示头 
*/ 
jssp.Core.parse._handleDirective=function(directive){ 

var i = 0; 

var tolkenIndex = 0; 
var tolken = new Array(); 

//Skip first spaces; 
while ( directive.charAt(i) == ' ' ) { 
i++; 


tolken[tolkenIndex] = ""; 
while ( directive.charAt(i) != ' ' && i <= directive.length ) { 
tolken[tolkenIndex] += directive.charAt(i); 
i++; 


tolkenIndex++; 

//Skip first spaces; 
while ( directive.charAt(i) == ' ' ) { 
i++; 


tolken[tolkenIndex] = ""; 
while ( directive.charAt(i) != ' ' && directive.charAt(i) != '=' && i <= directive.length ) { 
tolken[tolkenIndex] += directive.charAt(i); 
i++; 


tolkenIndex++; 

//Skip first spaces; 
while ( directive.charAt(i) == ' ' ) { 
i++; 


if( directive.charAt(i) != '=' ) 
throw new jssp.Core.parse.ParseException("Sintax error", "Tolken = expected attribute"); 
i++ 

//Skip first spaces; 
while ( directive.charAt(i) == ' ' ) { 
i++; 


tolken[tolkenIndex] = ""; 
while ( directive.charAt(i) != ' ' && i <= directive.length ) { 
tolken[tolkenIndex] += directive.charAt(i); 
i++; 

tolkenIndex++; 

//Skip first spaces; 
while ( directive.charAt(i) == ' ' && i <= directive.length ) { 
i++; 


tolken[tolkenIndex] = ""; 
while ( directive.charAt(i) != ' ' && directive.charAt(i) != '=' && i <= directive.length && i <= directive.length ) { 
tolken[tolkenIndex] += directive.charAt(i); 
i++; 


tolkenIndex++; 

if( directive.charAt(i) != '=' && i <= directive.length ) 
throw new jssp.Core.parse.ParseException("Sintax error", "Tolken = expected after attribute" ); 
i++ 

tolken[tolkenIndex] = ""; 
while ( directive.charAt(i) != ' ' && i <= directive.length && i <= directive.length ) { 
tolken[tolkenIndex] += directive.charAt(i); 
i++; 


var file = ""; 
var context = ""; 

if ( tolken[0] != "include" ) 
throw new jssp.Core.parse.ParseException("Sintax error","Directive " + tolken[0] + " unknown.") ; 

if ( tolken[1] != "file" ) 
throw new jssp.Core.parse.ParseException("Sintax error", "Attribute file expected after include." ); 
else file = tolken[2]; 

if ( tolken[3] != "context" && tolken[3] != "" ) 
throw new jssp.Core.parse.ParseException( "Sintax error", "Attribute context expected after file."); 
else if ( tolken[3] == "context" ) 
context = tolken[4] 
else 
context = "$context"; 

var out = "$context.include(" + file + ");\n"; 

return out; 


/** 
* 解析异常 
*/ 
jssp.Core.parse.ParseException=function(name,message) { 
this.name=name; 
this.message=message; 

//@--------------------------------------------------------------------------------页面内容加载接口定义 
/** 
* 页面内容加载类接口定义 
*/ 
jssp.Core.PageLoader=function(){} 
/** 
* 读取页面文本 
*/ 
jssp.Core.PageLoader.prototype.loadPage=function(pagePath){throw "不能直接调用接口或您还未实现此方法!";} 
//@--------------------------------------------------------------------------------页面运行实现方法 
/** 
* @param pagePath 加载页面 
* @parma context 上下文对象 
*/ 
jssp.Core.run=function(pagePath,context){ 

if(!jssp.pageLoaderInstance){ 
//jssp引擎初始化 
if(jssp.Config.cachable) jssp.cacheInstance=eval("new "+jssp.Config.cacheClass+"();"); 
jssp.pageLoaderInstance=eval("new "+jssp.Config.pageLoaderClass+"();"); 


var key=pagePath;if(key.indexOf("?")>0) key=key.substring(0,key.indexOf("?")); 

var processer=jssp.Config.cachable?jssp.cacheInstance.get(key):null; 
if(!processer){ 
eval("processer="+jssp.Core.parse(jssp.pageLoaderInstance.loadPage(pagePath))); 
if(jssp.Config.cachable) jssp.cacheInstance.set(key,processer); 
}else{ 
//alert("cache") 


if(!context) 
context=new jssp.Context(pagePath); 
else 
context=new jssp.Context(pagePath,context); 
return processer(context); 

//@-----------------------------------------------------------------------------------AJAX加载页面实现 
jssp.Core.PageLoader.Ajax=function(){} 

jssp.Core.PageLoader.Ajax.prototype.loadPage=function(pagePath){ 
var content=jssp.Ajax.send(pagePath,"GET",false); 
if(!content) { 
alert("请求页面:"+pagePath+" 返回为null!");return null; 

return content; 

//@-----------------------------------------------------------------------------------AJAX操作实现 
jssp.Ajax=function(){} 
/** 
* 建立HTTP连接 
*/ 
jssp.Ajax.createHttpRequest=function(){ 
if(window.XMLHttpRequest) 
return new XMLHttpRequest(); 
var request=null; 
try{ 
request=new ActiveXObject("Msxml2.XMLHTTP.4.0"); 
}catch(e){ 
try{ 
request=new ActiveXObject("Msxml2.XMLHTTP"); 
}catch(e){ 
try{ 
request=new ActiveXObject("microsoft.XMLHTTP"); 
}catch(e){ 
throw "XMLHTTPRequest组件客户端不支持!"; 



return request; 


/** 
* 发送AJAX请求 
* @param url 请求页面 
* @param method 请求方法 get or post 
* @param async 是否为异步调用 
* @param callback 回调函数 
* @param preHook 调用前执行函数 
* @param postHook 调用后请求返回执行函数 
*/ 
jssp.Ajax.send=function(url,method,async,callback,preHook,postHook){ 
method=method.toUpperCase(); 

if(typeof preHook=="function") preHook(); 

var request=jssp.Ajax.createHttpRequest(); 
request.open(method,url,async); 
if(async){ 
if(typeof callback!="function") throw "必须要设置回调函数"; 
request.onreadystatechange=function(){ 
jssp.Ajax.callback(request,callback,postHook); 
}; 

request.send(null); 
if(!async) { 
if(request.status==200||request.status==304) 
return jssp.Ajax._chartset(request); 
else 
return null; 


/** 
* 接受响应,调用自定义回调函数 
*/ 
jssp.Ajax.callback=function(response,callback,postHook){ 
if(response.readyState!=4) return; 
var text; 
if(response.status==200||response.status==304){ 
text=jssp.Ajax._chartset(response); 

callback(text); 
if(typeof postHook=="function") postHook(); 

/** 
* 中文乱码处理 
*/ 
jssp.Ajax._chartset=function(r){ 
var t=bytes2BSTR(r.responseBody); 
return t; 


</script> 

<script language="javascript"> 
jssp.Config.pageLoaderClass="jssp.Core.PageLoader.CustomerInput";//设置页面读取接口 
jssp.Config.cachable=false; 
jssp.Core.PageLoader.CustomerInput=function(){} 
jssp.Core.PageLoader.CustomerInput.prototype.loadPage=function(pagePath){ 
if(pagePath.substring(0,10)!="hello.jssp") return "测试包含子页面,路径:"+pagePath; 
return document.getElementById("pageContent").value; 

function showPage(){ 
jssp.render("hello.jssp?name="+Math.random(),"pageArea"); 

</script> 
<style type="text/css"> 
<!-- 
.STYLE1 {color: #FFFFFF} 
--> 
</style> 
</head> 

<body> 
输入JSSP脚本内容: 
<textarea id="pageContent" style="width:100%;" rows="15"> 
<table width="100%" border="0" align="center" cellpadding="4" cellspacing="2"> 
<tr> 
<td align="center" valign="middle" bgcolor="#666699"><span class="STYLE1">order</span></td> 
<td align="center" valign="middle" bgcolor="#666699"><span class="STYLE1">number1</span></td> 
<td align="center" valign="middle" bgcolor="#666699"><span class="STYLE1">number2</span></td> 
<td align="center" valign="middle" bgcolor="#666699"><span class="STYLE1">number3</span></td> 
</tr> 
<% 
var beginTime=new Date(); 
for(var i=0;i<100;i++){ 
var color=i%2?"#eeeeee":"#aaaaaa"; 
%> 
<tr bgcolor="<%=color%>"> 
<td align="center" valign="middle" ><%=i%></td> 
<td align="center" valign="middle" ><%=Math.random()%></td> 
<td align="center" valign="middle" ><%=Math.random()%></td> 
<td align="center" valign="middle" ><%=Math.random()%></td> 
</tr> 
<%}%> 
</table> 
<% 
window.alert("耗时:"+(new Date()-beginTime)+"ms"); 
%> 
</textarea> 
<button onClick="showPage()">显示内容</button> 
<hr> 
<div id="pageArea"></div> 
</hr> 

</body> 
</html>

分享到:
评论
1 楼 renjie120 2011-01-17  
没有使用的例子么?这样不容易看出来有什么实际的用途.

相关推荐

    nodejs 服务器端的JavaScript脚本(node.js).zip

    这个"nodejs 服务器端的JavaScript脚本(node.js)"压缩包可能包含了一系列的示例代码、教程或者项目,旨在帮助用户理解如何在服务器端运用JavaScript。 在Node.js中,JavaScript不再局限于浏览器环境,而是可以用来...

    1KB 轻量级、快速且强大的 JavaScript 模板引擎,无任何依赖关系 兼容 node.js 等服务器端环境、RequireJS 等模块加载器以及所有 Web 浏览器 .zip

    JavaScript 模板内容演示描述用法客户端服务器端要求APItmpl() 函数模板缓存输出编码本地辅助变量模板函数参数模板解析模板语法插值评估编译模板测试执照描述1KB 轻量级、快速且强大的 JavaScript 模板引擎,无任何...

    仿起点模板仿起点最新模板仿起点最新模板

    【标题】"仿起点模板仿起点最新模板仿起点最新模板" 暗示这是一个与网站模板设计相关的项目,特别是模仿“起点”网站的最新样式。起点是中国知名的网络文学平台,其网站界面通常具有一定的特色和用户友好的设计元素...

    15JavaScript服务器端应用-ASP共17页.pdf.zip

    ASP,全称为Active Server Pages,是微软推出的一种服务器端脚本环境,用于生成动态网页。在ASP中,开发者可以使用VBScript或JScript编写代码,与服务器上的数据库或其他资源交互,生成HTML响应发送回客户端。ASP的...

    CELL服务器端应用

    这个过程涉及的技术包括XML数据交换、XMLHTTP请求、服务器端脚本(如ASP.NET)、以及客户端的JavaScript和VBScript交互。理解和掌握这些知识点对于开发基于CELL插件的Web应用至关重要,因为它确保了客户端和服务器...

    PC端电脑端商城模板前端静态页面商城模板

    4. **PHP**:服务器端脚本语言,处理HTTP请求,与数据库通信,生成动态网页内容。 5. **Python**:通用编程语言,可能用于数据处理、后台脚本或API接口的开发。 6. **Java**:后端开发语言,可以用于构建强大的...

    JS脚本集合 大全 JS脚本集合 大全

    10. Node.js:JavaScript的服务器端环境,使用相同的JS语法开发后端服务,实现全栈开发。 这个JS脚本集合大全很可能涵盖了以上以及更多JavaScript的实用技术和最佳实践,对于学习和提升JavaScript编程能力非常有...

    3.0方维购物分享系统,仿蘑菇街源码,仿美丽说模板,仿蘑菇街模板整站

    1. **技术架构**:系统可能采用了哪种服务器端语言(如PHP、Java或.NET)开发,前端可能使用了哪些技术(如HTML5、CSS3、JavaScript、Vue.js或React.js)。 2. **数据库设计**:如何存储商品信息、用户数据、订单...

    ASP源码—艺帆仿百度云手机官方网站模板.zip

    ASP(Active Server Pages)是微软开发的一种服务器端脚本环境,用于生成动态网页。这个模板允许用户创建一个与百度云手机官网风格相似的网站,可能包括了首页、产品展示、服务介绍、帮助中心等板块。 在ASP源码中...

    很好改的后台模板 无js文件

    当然,没有JavaScript并不意味着模板缺乏交互性,开发者可以通过服务器端脚本来实现类似的功能。 在文件名称列表中,“超市管理系统后台模板”表明这个模板是为超市管理系统设计的。这意味着它可能包含了一些预设的...

    js 脚本程序大全 js 脚本程序大全

    5. **Web应用**:结合服务器端技术如Node.js,构建全栈式Web应用程序。 JavaScript的关键概念和技术: 1. **变量与常量**:var、let和const关键字用于声明变量和常量。 2. **数据类型**:包括基本类型(字符串、...

    PHPCOM仿WINDOWS系统之家网站模板

    ASP是一种微软开发的服务器端脚本语言,常用于动态网页的制作。在这个模板中,可能有部分页面或功能使用了ASP技术来实现,例如用户登录、评论、搜索等功能。需要注意的是,由于PHPCom是基于PHP开发的,因此这里的...

    JavaScript脚本程序设计

    8. **Node.js后端开发**:JavaScript也能用于服务器端开发,Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript编写服务器端代码,实现全栈开发。 9. **Web APIs**:JavaScript可以...

    Node.js-通过NodeJS运行服务器端JavaScript文件像通过Apache运行PHP一样方便

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它让开发者能够在服务器端使用JavaScript编写代码,从而打破了JavaScript只能在浏览器中执行的传统。标题提到“通过Node.js运行服务器端JavaScript文件像通过...

    js脚本js脚本

    10. Node.js:JavaScript也可用于服务器端开发,Node.js是一个基于Chrome V8引擎的JS运行环境,提供了一个非阻塞I/O模型,适合开发高性能的网络应用。 11. 浏览器兼容性:不同浏览器对JS的支持程度不同,开发者需要...

    IDC服务器销售行业模板是一款适合虚拟主机公司网站。_html网站模板_网页源码移动端前端_H5模板_自适应响应式源码.rar

    JavaScript是一种客户端脚本语言,用于实现网页的动态效果和交互性,如表单验证、动画效果等,增强了用户与网站的互动性。CSS则负责页面的布局和样式设计,使得网页在不同设备上显示时保持一致的视觉效果,确保了跨...

    最土模板 仿第五季节团购模板支持最新1816

    【标题】"最土模板 仿第...模板包含了必要的静态资源和服务器端脚本,可直接应用于网站,提供了一种快速定制网站外观和功能的方式。同时,通过演示地址,用户可以直观地了解模板的使用效果,确保其满足他们的业务需求。

    电脑服务器模板下载

    这些模板包含了HTML、CSS、JavaScript等前端技术,有时还会包含PHP、Python、Node.js等后端语言的部分代码,以便快速搭建功能齐全的服务器端网页。 在描述中提到的"服务器模板"、"电脑模板"和"html模板",它们之间...

Global site tag (gtag.js) - Google Analytics