在浏览器中使用art-template模板引擎
代码演示
<div id="box"></div>
<!-- 导入template-web.js文件 -->
<script src="./template-web.js"></script>
<!-- 定义模板 -->
<script type="text/html" id="test">
<h1>{{title}}</h1>
<ol>
{{each list}}
<li>{{$value}}</li>
{{/each}}
</ol>
</script>
<!-- 使用模板引擎 -->
<script>
// 定义数据
var data = { title: ‘模板引擎的使用‘, list: [
‘先去官网下载template-web.js‘,
‘使用script标签定义模块,设置type属性为text/html,并设置id‘,
‘在script标签中使用art-template模板引擎语法‘,
‘调用template方法传入模板标识和数据,产生关联,返回关联后的结果‘,
‘将模板引擎生产后的结果写入页面中‘]
}
// 调用模板引擎方法
var str = template(‘test‘, data);
// 把结果追加到页面id为box的div中
box.innerHTML = str;
</script>
效果
后端接口程序
const express = require(‘express‘)
const path = require(‘path‘)
const app = express();
app.use(express.static(path.join(__dirname,‘/public‘)))
// 模拟验证
app.get(‘/checkemail‘, (req, res) => {
if (req.query.email == ‘admin@blog.cn‘) {
res.send(‘0‘)
} else {
res.send(‘1‘)
}
})
app.listen(80, "localhost")
前端页面程序
<input type="text" id="email">
<span id="message"></span>
<script src="./myajax.js"></script>
<script>
email.onblur = function() {
var val = this.value;
var reg = /^\w+@\w+\.\w+$/;
if(reg.test(val)) {
ajax({
url:‘http://localhost/checkemail‘,
data: {
email: val
},
success:function(data){
console.log(data)
if(data==1) {
message.style.color = ‘green‘;
message.innerText = ‘可以注册‘
}else {
message.style.color = ‘red‘;
message.innerText = ‘该账号已经存在‘
}
}
})
}else {
message.style.color = ‘red‘;
message.innerText = ‘邮箱格式不正确‘;
}
}
</script>
效果
后端接口程序
const express = require(‘express‘)
const path = require(‘path‘)
const app = express();
app.use(express.static(path.join(__dirname,‘/public‘)))
// 模拟热词接口
app.get(‘/words‘, (req, res) => {
var word = req.query.word;
var data = [‘开发网站‘, ‘生命不息‘, ‘开发周期‘, ‘狗的生命‘, ‘软件开发‘, ‘狗子‘, ‘开发程序‘, ‘狗的毛色‘, ‘狗肉‘, ‘卖狗犯法吗‘, ‘生命周期‘];
var result = data.filter(val => val.indexOf(word) != -1)
res.send(result)
})
app.listen(80, "localhost")
前端页面程序
<div class="box">
<input type="text" id="content">
<ul id="ul">
</ul>
<script src="./myajax.js"></script>
<script src="./template-web.js"></script>
<!-- 列表模板 -->
<script type="text/html" id="words">
{{each list}}
<li>{{$value}}</li>
{{/each}}
</script>
<script>
var timer = null;
content.oninput = function () {
clearTimeout(timer)
var word = this.value;
if (word.trim().length == 0) return ul.style.display = ‘none‘
timer = setTimeout(function () {
ajax({
url: ‘http://localhost/words‘,
data: { word: word },
success: function (data) {
var html = template(‘words‘, { list: JSON.parse(data) })
ul.style.display = ‘block‘
ul.innerHTML = html;
}
})
}, 800)
}
</script>
FormData对象的作用:
注意事项:
formidable
模块进行解析。服务端程序接口
const express = require(‘express‘)
var formidable = require(‘formidable‘)
const app = express();
app.use(express.static(path.join(__dirname,‘/public‘)))
app.post(‘/login‘, (req, res) => {
var form = new formidable.IncomingForm();
form.parse(req, (err, fields, files) => {
res.send(fields);
})
})
app.listen(80, "localhost")
前端页面程序
<form id="login">
<p>账号:<input type="text" name="username"></p>
<p>密码:<input type="password" name="pwd"></p>
</form>
<button id="btn">提交</button>
<script>
var form = document.querySelector(‘#login‘)
var btn = document.querySelector(‘#btn‘)
btn.onclick = function () {
var xhr = new XMLHttpRequest();
xhr.open(‘post‘, ‘http://localhost/login‘);
// 创建FormData对象,可传入表单元素对象
var formData = new FormData(login)
// 发送请求,并传入FormData对象实例
xhr.send(formData)
xhr.onload = function () {
console.log(xhr.responseText)
}
}
</script>
方法
注意:set 方法与 append 方法的区别是,在属性名已存在的情况下,set 会覆盖已有键名的值,append会保留两个值。
代码
<form id="login">
<p>账号:<input type="text" name="username"></p>
<p>密码:<input type="password" name="pwd"></p>
</form>
<button id="btn">提交</button>
<script>
var form = document.querySelector(‘#login‘)
var btn = document.querySelector(‘#btn‘)
btn.onclick = function () {
var xhr = new XMLHttpRequest();
xhr.open(‘post‘, ‘http://localhost/login‘);
// 创建FormData对象,可传入表单元素对象
var formData = new FormData(login)
// 添加其他字段
formData.set(‘age‘,‘10‘);
// 删除其他字段
formData.delete(‘pwd‘);
// 发送请求,并传入FormData对象实例
xhr.send(formData)
xhr.onload = function () {
console.log(xhr.responseText)
}
}
</script>
案例效果
后端接口程序代码
const express = require(‘express‘)
const path = require(‘path‘)
var formidable = require(‘formidable‘)
const app = express();
app.use(express.static(path.join(__dirname, ‘/public‘)))
app.post(‘/upload‘, (req, res) => {
var form = new formidable.IncomingForm();
// 设置文件上传路径
form.uploadDir = path.join(__dirname, ‘./public/uploads‘)
// 保留上传文件的后缀名
form.keepExtensions = true;
// 设置文件上传的大小限制
form.maxFileSize = 6 * 1024 * 1024 * 1024;
// 解析表单数据
form.parse(req, (err, fields, files) => {
// 文件名路径
const uploadUrl = files.fName.path.split(‘public\\‘)[1];
// 返回上传后的文件路径,实现预览
res.send(uploadUrl);
})
})
app.listen(80, "localhost")
前端页面程序
<input type="file" id="photos" >
<div style="width: 500px; display: inline-block;">
上传进度:
<div id="processDom" style="height: 5px; background: deepskyblue; width: 0%;"></div>
</div>
<strong id="processNum"></strong>
<!-- 预览图片 -->
<div id="open_photo"></div>
<script>
photos.onchange = function() {
// 创建FormData对象
var formdata = new FormData();
// 二进制文件添加到表单对象中
formdata.append(‘fName‘,this.files[0])
var xhr = new XMLHttpRequest();
xhr.open(‘post‘,‘http://localhost/upload‘)
// 监听上传进度-xhr.upload.onprogress事件
xhr.upload.onprogress = function(ev) {
// loaded已经上传的大小,total总大小
var goNum = (ev.loaded/ev.total)*100;
processDom.style.width = goNum + ‘%‘;
processNum.innerText = parseInt(goNum) + ‘%‘;
}
// 发送请求
xhr.send(formdata);
xhr.onload = function() {
console.log(xhr.responseText)
var img = document.createElement(‘img‘);
img.style.width = ‘100px‘;
img.src = xhr.responseText;
open_photo.appendChild(img);
}
}
</script>
原文:https://www.cnblogs.com/lpl666/p/12873336.html