关于模板引擎handlebars.js基本用法

说明:模板引擎主要针对于渲染DOM,取代了字符串拼接,用下面的代码亲测handlebars模板引擎比字符串拼接渲染DOM慢了20ms,

这里配置一个在线DEMO,简单说明下handlebars.js的基本用法,需要根据获取的数据去渲染,就会用到循环、判断

1、each,循环、可以嵌套

2、if,判断、可以嵌套

3、hepler,对于复杂的逻辑判断没法起作用,自己注册一个helper参与判断

handlebars.js官网

在线DEMO移动端

详细可以看上面DEMO里的main.js

/*
* @Author: wangjianfei
* @Date:   2017-05-16 16:10:25
* @Last Modified by:   wangjianfei
* @Last Modified time: 2017-05-16 18:57:02
*/
'use strict';
// AJAX
var xhrRequest=new XMLHttpRequest();
xhrRequest.open('GET','http://wjf444128852.github.io/json-datas/degula.json');
xhrRequest.onload=function(){
if(xhrRequest.status>=200&&xhrRequest.status<400){
var data=JSON.parse(xhrRequest.responseText);
// 1 定义用户列表
var users=data.data.users;
// 1.1 重新排列数据
        sortData(users);
// 2 判断是否正在直播
var isLiving=data.data.my;
// console.log(data);
}else{
console.log('The server returned an error.');
}
}
xhrRequest.onerror=function(){
console.log('error!');
}
xhrRequest.send();
// 1 把人員按照積分从高到底排列
function sortData(lists){
for(var n=1;n<lists.length;n  ){
for(var k=0;k<lists.length-1;k  ){
var max=lists[k].score;
var nextCount=lists[k 1].score;
if(nextCount>max){
var preData=lists[k];
lists[k]=lists[k 1];
lists[k 1]=preData;
}
}
}
// 创建DOM,渲染data
    createHTML(lists);
}
//1.3.01 注册一个Handlebars Helper:addOne,用来将索引 1,因为默认是从0开始的
Handlebars.registerHelper("addOne",function(index,options){
return parseInt(index) 1;
});
// 1.3.06 注册helper:compare,用来比较判断不同的显示内容
Handlebars.registerHelper("compare",function(temp,options){
if(temp==1){
//满足条件执行
return '<i class="promotion"></i>';
}else if(temp==0){
//不满足执行{{else}}部分
return '<i class="nothing"></i>';
}else if(temp==-1){
return '<i class="out"></i>';
}
});
// 1.3 创建DOM函数
function createHTML(userData){
console.log(userData);
var usersList=[
'{{#each this}}',
'<li>',
// 01 名词
'<b>',
// 使用注册的Helper
'{{addOne @index}}',
'.</b>',
// 02 头像
'<div class="main-img" data-direction={{stream_direction}} data-livekey={{live_key}} data-liveurl={{live_url}} data-nickname={{nickname}} data-pfid={{pfid}} data-liveid={{live_id}}>',
'<img src="{{headimg}}" alt="" />',
// 根据live_id是否正在直播
'{{#if live_id}}',
'<span></span>',
'{{/if}}',
'</div>',
// 03 用户名字
'<span>',
'{{nickname}}',
'</span>',
// 04 用户积分
'<b class="score">',
'{{score}}',
'</b>',
// 05 用户票数
'<b class="ticket">',
'{{count}}',
'</b>',
// 06 是否晋级、淘汰、败部
// 注册
'{{#compare promotion}}',
'{{/compare}}',
'</li>',
'{{/each}}'
].join('');
var usersHtml=Handlebars.compile(usersList)(userData);
var containerBox=document.getElementById('users-one');
// 追加到DOM树上
containerBox.innerHTML=usersHtml;
// 
    addEvent();
}
//2 addEvent 绑定事件
function addEvent(){
// var allUsers=document.getElementsByClassName('main-img');
var allUsers=getDom('.main-img');
// console.log(allUsers);
for(var i=0,leng=allUsers.length;i<leng;i  ){
var lists=allUsers[i];
lists.addEventListener("click",function(e){
event.preventDefault();
event.stopPropagation();
// 
var pfid=this.getAttribute("data-pfid");
var nickname=this.getAttribute('data-nickname');
var liveid=this.getAttribute('data-liveid');
var liveurl=this.getAttribute('data-liveurl');
var livekey=this.getAttribute('data-livekey');
var direction=this.getAttribute('data-direction');
// console.log(liveid);
// handlebars.js 默认把值为null去除了,即把为null的替换为:'',所以此时不能用!=null判断了
// if(liveid!=null){
if(liveid){
// 进入直播间
// h5toRoom(pfid,nickname,liveid,liveurl,livekey,direction);
alert("进入直播间");
// 如果没在直播,进入个人主页    
}else{
// h5toHomepage(pfid,nickname);
alert("进入个人主页");
}
// console.log(this);
        });
}
}
//3 getDom 获取DOM
function getDom(selector){
return document.querySelectorAll(selector);
}

 转载请注明出处(谢谢)

 


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

create react app创建的项目运行test的时候不能解析webpack的alisa配置的问题

使用babel插件npm install babel-plugin-module-resolver&#xff0c;并在.babelrc文件中加入如下&#xff1a; {"plugins": [["module-resolver",{"alias": {"": "./src"}}]] }详情查看babel-plugin-module-resolver插件文…

使用Spring Security的多租户应用程序的无状态会话

从前&#xff0c; 我发表了一篇文章&#xff0c;解释了构建无状态会话的原理 。 巧合的是&#xff0c;我们再次针对多租户应用程序执行同一任务。 这次&#xff0c;我们将解决方案集成到Spring Security框架中&#xff0c;而不是自己构建身份验证机制。 本文将解释我们的方法和…

C# 退出提示 事件提示两次问题

private void frmCtiState_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason CloseReason.ApplicationExitCall) return; DialogResult result MessageBox.Show("是否退出系统?", "消息", MessageBoxB…

What?一个 Dubbo 服务启动要两个小时!

前言 前几天在测试环境碰到一个非常奇怪的与 dubbo 相关的问题&#xff0c;事后我在网上搜索了一圈并没有发现类似的帖子或文章&#xff0c;于是便有了这篇。 希望对还未碰到或正在碰到的朋友有所帮助。 现象 现象是这样的&#xff0c;有一天测试在测试环境重新部署一个 dubbo …

React hook 中的数据获取

相关说明&#xff1a; 对于hook相关词不翻译&#xff0c;感觉翻译后怪怪的。 effect hook 效果钩子&#xff0c;用于执行一些副作用例如获取数据 。 state hook 状态钩子。 使用----------- 和 ----------- 标出代码需要关注的地方。 渣翻译如下&#xff1a; 在这个指南中…

嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务

最近&#xff0c;我遇到了一个非常有趣的问题&#xff0c;我认为这只花了我几分钟就解决了&#xff1a;在Windows Server 2003中使用Spring Security &#xff08;当前稳定版本3.2.5 &#xff09;保护Apache CXF &#xff08;当前版本3.0.1 &#xff09;/ JAX-RS REST服务。在嵌…

我所知道的前端组件化与模块化

序言&#xff1a;组件化&#xff1f;模块化&#xff1f;这都是什么鬼&#xff1f;这是最初看到这2个新名词的反应。随着时间的推移&#xff0c;似乎、可能、大概明白了一点&#xff0c;于是想说说自己的理解(仅仅是自己的理解) 一、组件化 忘记什么时候看到这个词的了&#x…

关于通过反汇编查看dll的方法【转】(

关于通过反汇编查看dll的方法【转】( http://blog.sina.com.cn/s/blog_51a3c0380100f9md.html 今天想看一个dll的内容&#xff0c;苦于没有相关工具&#xff0c;从csdn上找到有这么段文字&#xff0c;收益匪浅啊&#xff0c;收藏&#xff01; 可以通过反汇编来知道接口函数的参…

openocd安装与调试

环境&#xff1a; 硬件&#xff1a;PC机<------>ARM仿真器v8.00<------>已下载好bit流的Xinlinx SoC开发板&#xff08;其上有arm cortex-a9核&#xff09; 软件&#xff1a;Redhat Linux6&#xff08;或虚拟机&#xff09; openocd 使用openocd下载程序&#xff…

在React中获取数据

React初学者经常从不需要获取数据的应用开始。他们经常面临一个计数器&#xff0c;任务列表获取井字棋游戏应用。这是很好的&#xff0c;因为在开始学习React的时候&#xff0c;数据获取在你的应用中添加了另一层复杂度。 然而&#xff0c;有些时候你想要从自己的或者第三方AP…

使用Project Lombok减少Java应用程序中的样板代码

对Java编程语言最常提出的批评之一是它需要大量的样板代码 。 对于简单的类尤其如此&#xff0c;该类只需要存储一些值就可以。 您需要这些值的getter和setter&#xff0c;也许您还需要一个构造函数&#xff0c;覆盖equals&#xff08;&#xff09;和 hashcode&#xff08;&am…

DOM之城市二级联动

1、HTML内容 <select id"province"><option>请选择</option><option>山东省</option><option>吉林省</option><option>上海市</option></select><select id"city"><option>请选择…

跳转指令-JMP

page 60,132TITLE A0405Jump(EXE) JMP跳转指令.MODEL SMALL.STACK 64.DATAORG 100H ;规定程序的起始地址A10MAIN PROC NEARMOV AX,00MOV BX,00MOV CX,1A20: ADD AX,01ADD BX,AXSHL CX,1 ;左移一位JMP A20 ;跳转到A20A10MAIN endp jmp格式 [label:] jmp short/near/far/address…

java输出毫秒时间

SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");// 输出字符串System.out.println(df.format(new Date()));转载于:https://www.cnblogs.com/longchang/p/11139947.html

Three.js制作360度全景图

这是个基于three.js的插件&#xff0c;预览地址&#xff1a;戳这里 使用方法&#xff1a; 1、这个插件的用法很简单&#xff0c;引入如下2个js <script src"js/three.min.js"></script><script src"js/photo-sphere-viewer.min.js">&l…

C++资源库不完全版本

http://www.360doc.com/content/10/0414/20/59141_23072568.shtml boost graph...转载于:https://www.cnblogs.com/seon/archive/2011/08/08/2131246.html

babel6和babel7中关于polyfill和preset-env和babel-plugin-transform-runtime等总结

记录自己零散的收获&#xff0c;随笔。 一些基础 babel的作用是转换JS新的特性代码为大部分浏览器能运行的代码。 babel转码又分为两部分&#xff0c;一个是语法转换&#xff0c;一个是API转换。 对于API的转换又分为两部分&#xff0c;一个是全局API例如Promise&#xff0c…

十六、CI框架之数据库操作get用法

一、使用数据库的Get方法读取内容&#xff0c;如下代码&#xff1a; 二、数据库如下&#xff1a; 二、效果如下&#xff1a; 转载于:https://www.cnblogs.com/tianpan2019/p/11141809.html

使用Spring Boot和Spring MVC自定义HttpMessageConverters

为Spring Boot应用程序或直接的Spring MVC应用程序公开基于REST的终结点很简单&#xff0c;以下是一个控制器&#xff0c;该终结点公开了一个终结点&#xff0c;用于基于其发布的内容创建实体&#xff1a; RestController RequestMapping("/rest/hotels") public cl…

JS如何禁止别人查看网站源码

四种查看路径&#xff1a; 查看效果&#xff1a;猛戳 1、直接按F12 2、Ctrl Shift I查看 3、鼠标点击右键查看 4、Ctrl uview-source: url 把以上三种状态都屏蔽掉就可以了&#xff0c;document有onkeydown(键盘按键事件)&#xff0c;该事件里面找到对应的keycode并处理就…