`
53873039oycg
  • 浏览: 842020 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

jQuery结合Handlebars动态新增Tr示例

 
阅读更多

       昨天写了篇博客,有博友指出手动拼接html的写法不是很好,建议使用jsrender生成html,早上看了下jsrender,觉得和Handlebars很像,所以今天下午试着使用Handlebars生成html,不再手动拼接了

       代码如下

      

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jquery Handlebars动态新增tr</title>
<style>
* {
	margin: 0px;
	padding: 0px;
	margin: 0 auto;
	font-size: 15px;
}

#infoDiv {
	margin-top: 10px;
	width: 900px;
	border-top: 1px solid #79B2F1;
	border-bottom: none;
}

#infoDiv table {
	margin-top: 10px;
}

#infoDiv table td {
	padding: 4px 6px;
	text-align: left;
}

#submitDiv{
    width: 100px;
}
#submitDiv span {
	color: #fff;
	background: #89D900;
	height: 25px;
	width: 100px;
	display: block;
	line-height: 25px;
	font-weight: bold;
	text-align: center;
	margin: 0 auto;
}

#submitDiv a {
	text-decoration: none;
}

#disDiv {
	margin-top: 10px;
	width: 900px;
}

#disDiv table {
	margin-top: 10px;
	border-collapse: collapse;
	margin-bottom: 10px;
}

#disDiv table thead {
	height: 30px;
	line-height: 30px;
	background: #F4F4F4;
}
#infoDetail td {
	text-align: center;
	padding: 4px 6px;
	border-bottom: 1px solid #e6e6e6;
}

#infoDetail td a {
	text-decoration: none;
}

.fixWidth {
	width: 110px;
}

#resultDiv {
	margin-top: 10px;
	width: 900px;
	border: 1px solid #E6E6E6;
	padding: 10px;
	display: none;
}
</style>
<script type="text/javascript" src="../../js/jquery-2.1.0.js"></script>
<script type="text/javascript" src="../../js/wdatepicker/WdatePicker.js"></script>
<script type="text/javascript" src="../../js/handlebars-v1.3.0.js"></script>
<script id="tr-template" type="text/x-handlebars-template">
     {{#ifEqual varNum 1}}
       <tr>
	       <td><a href="javascript:;" onclick="delRow(this,1)">删除</a></td>
	       <td><select onchange="onSelectChange(this);" class="fixWidth"><option value="">所有</option>
			   <option value="1">北京</option>
			   <option value="2">天津</option>
			   <option value="3">河北</option></select></td>
	       <td><select class="fixWidth"><option value="">所有</option></select></td>
	       <td><input type="text"></td>
	       <td><input type="text"></td>
	       <td><input type="text"></td>
       </tr>
   {{else}}
      <tr>
	     <td style="vertical-align: middle" rowspan="{{varNum}}"><a href="javascript:;" onclick="delRow(this,{{varNum}})">删除</a></td>
	     <td style="vertical-align: middle" rowspan="{{varNum}}"><select onchange="onSelectChange(this);" class="fixWidth"><option value="">所有</option>
	     		<option value="1">北京</option>
	     		<option value="2">天津</option>
	     		<option value="3">河北</option></select></td>
	     <td style="vertical-align: middle" rowspan="{{varNum}}"><select class="fixWidth"><option value="">所有</option></select></td>
	     <td><input type="text"></td>
	     <td><input type="text"></td>
	     <td><input type="text"></td>
      </tr>
   {{/ifEqual}}
    {{addTr varNum}}
</script>
<script>
    /* 删除当前行 */
	function delRow(obj, num) {
		if (num == 1) {
			$(obj).parent().parent().remove();
		} else if (num > 1) {
			var o = $(obj).parent().parent();
			var ary = new Array();
			for (var i = 0; i < num; i++) {
				ary[i] = o;
				o = o.next("tr");
			}
			for (var i = 0; i < num; i++) {
				ary[i].remove();
			}
		}
	}
	/* select onchange事件 */
	function onSelectChange(obj) {
		var varSelect = $.trim($(obj).val());
		if (varSelect == '') {
			return false;
		}
		var subSelect = $(obj).parent().next().children("select");
		var varHtml = '';
		if (varSelect == 1) {
			varHtml += '<option value="11">北京2</option><option value="12">北京3</option><option value="13">北京4</option>';
		} else if (varSelect == 2) {
			varHtml += '<option value="21">天津2</option><option value="22">天津3</option><option value="23">天津4</option>';
		} else if (varSelect == 3) {
			varHtml += '<option value="31">河北2</option><option value="32">河北3</option><option value="33">河北4</option>';
		}
		subSelect.html(varHtml);
	}
	/* 使用handlerbar模版生成html */
	function generateHtml(varNumTmp) {
		var template = Handlebars.compile($("#tr-template")
				.html());
		var varObj={varNum:""+varNumTmp+""};
		$("#infoDetail").append(template(varObj));
	}
	$(function() {
		var varDate = new Date();
		var varYear = varDate.getFullYear();
		var varMon = varDate.getMonth() + 1;
		var varDay = varDate.getDate();
		if (varMon < 10) {
			varMon = "0" + varMon;
		}
		$('#v_doneDate').val(varYear + "-" + varMon + "-" + varDay);
		/* 按钮提交事件 */
		$('#submitForm').on('click', function() {
			$('#resultDiv').css("display", "none");
			var varNumTmp = $.trim($('#v_num').val());
			varNum = parseInt(varNumTmp);
			if (isNaN(varNum) || varNum < 1) {
				return false;
			}
			generateHtml(varNum);
		});
		$("#v_num").focus(function() {
			$('#resultDiv').html('');
			var varNum = $(this).val();
			if (varNum == this.defaultValue) {
				$(this).val("");
			}
		})
		/* 失去焦点 */
		$("#v_num").blur(function() {
			$('#resultDiv').html('');
			var varNum = $(this).val();
			if (varNum == "") {
				$(this).val(this.defaultValue);
			} else {
				varNum = parseInt(varNum);
				if (isNaN(varNum) || varNum < 1) {
					return false;
				}
				generateHtml(varNum);
			}
		})
		$('#submitBtn').on(
				'click',
				function() {
					var varInfo = "[{'v_id':'" + $.trim($("#v_id").val())
							+ "','v_cname':'" + $.trim($("#v_cname").val())
							+ "','v_pname':'" + $.trim($("#v_pname").val())
							+ "','v_startDate':'"
							+ $.trim($("#v_startDate").val())
							+ "','v_doneDate':'"
							+ $.trim($("#v_doneDate").val()) + "'}],";
					varInfo += "[";
					var infoDtl = $("#infoDetail");
					var trAll = infoDtl.children("tr");
					var trLen = trAll.length;
					var varRegion = '';
					var varCountry = '';
					var varSaleName = '';
					var varPrice = '';
					var varSalePrice = '';
					for (var i = 0; i < trLen; i++) {
						var tdAll = $(trAll[i]).children("td");
						var tdLen = tdAll.length;
						if (tdLen > 3) {
							varRegion = $.trim($(tdAll[1]).children("select")
									.val());
							varCountry = $.trim($(tdAll[2]).children("select")
									.val());
							varSaleName = $.trim($(tdAll[3]).children("input")
									.val());
							varPrice = $.trim($(tdAll[4]).children("input")
									.val());
							varSalePrice = $.trim($(tdAll[5]).children("input")
									.val());
						} else if (tdLen > 0 && tdLen <= 3) {
							varSaleName = $.trim($(tdAll[0]).children("input")
									.val());
							varPrice = $.trim($(tdAll[1]).children("input")
									.val());
							varSalePrice = $.trim($(tdAll[2]).children("input")
									.val());
						}
						varInfo += "{'varRegion':'" + varRegion
								+ "','varCountry':'" + varCountry
								+ "','varSaleName':'" + varSaleName
								+ "','varPrice':'" + varPrice
								+ "','varSalePrice':'" + varSalePrice + "'},";
					}
					varInfo = varInfo.substring(0, varInfo.length - 1);
					varInfo += "]";
					$('#resultDiv').css("display", "block");
					$('#resultDiv').html(varInfo);
				});
		Handlebars.registerHelper('ifEqual', function(v1, v2, options) {
			  if(v1 === v2) {
			    return options.fn(this);
			  }
			  return options.inverse(this);
		 });
		Handlebars.registerHelper('addTr', function(var1, fn) {
			 var result = '';
			 var len=parseInt(var1);
			 for(var i=1;i<len;i++) {
				 result+='<tr><td><input type="text"></td><td><input type="text"></td><td><input type="text"></td></tr>';
			 }
			  return new Handlebars.SafeString(result);;
			});
	});
</script>
</head>
<body>
	<form id="contentForm" method="post" action="">
		<div id="infoDiv">
			<table border="0" width="100%" cellpadding="0" cellspacing="1">
				<tr>
					<td><label for="v_id">流水编号:</label></td>
					<td><input id="v_id" name="v_id" type="text" maxlength="50"></td>
					<td><label for="v_cname">单位名称:</label></td>
					<td><input id="v_cname" name="v_cname" type="text"
						maxlength="50"></td>
					<td><label for="v_pname">用户姓名:</label></td>
					<td><input id="v_pname" name="v_pname" type="text"
						maxlength="50"></td>
				</tr>
				<tr>
					<td><label for="v_num">明细数量:</label></td>
					<td><input id="v_num" name="v_num" type="text" value="请输入正整数"></td>
					<td><label for="v_startDate">生效时间:</label></td>
					<td><input id="v_startDate" name="v_startDate" type="text"
						class="Wdate"
						onfocus="WdatePicker({minDate:'%y-%M-%d',maxDate:'#F{\'2099-12-31\'}'})"></td>
					<td><label for="v_doneDate">制作日期:</label></td>
					<td><input id="v_doneDate" name="v_doneDate" type="text"
						class="Wdate"
						onfocus="WdatePicker({minDate:'%y-%M-%d',maxDate:'#F{\'2099-12-31\'}'})"></td>
				</tr>
				<tr>
					<td colspan="4"></td>
					<td><div id="submitDiv">
							<a id="submitForm" href="javascript:void(0);"> <span>新增明细列</span></a>
						</div></td>
				</tr>
			</table>
		</div>
		<div id="disDiv">
			<table border="0" width="100%" cellpadding="0" cellspacing="1">
					<colgroup>
						<col width="10%">
						<col width="20%">
						<col width="20%">
						<col width="20%">
						<col width="15%">
						<col width="15%">
					</colgroup>
				<thead>
					<tr>
						<th>操作</th>
						<th>地市</th>
						<th>县市</th>
						<th>营销名称</th>
						<th>原价</th>
						<th>优惠价</th>
					</tr>
				</thead>
				<tbody id="infoDetail"></tbody>
			</table>
		</div>
		<div id="submitDiv">
			<a id="submitBtn" href="javascript:void(0);"> <span>提交</span></a>
		</div>
	</form>
	<div id="resultDiv"></div>
</body>
</html>

    结果如下:

   

      在明细数量输入1,结果为:

     

     输入2,结果为:

    

       说明:

       Handlebars如果使用{{#if num==1}}这种写法,会报错.

      

Uncaught Error: Parse error on line 2:
     {{#if varNum ==1}}       <tr>	  
-------------------^
Expecting 'STRING', 'INTEGER', 'BOOLEAN', 'OPEN_SEXPR', 'ID', 'DATA', got 'EQUALS' 

     解决方法:自定义Equal方法,参考http://stackoverflow.com/questions/8853396/logical-operator-in-a-handlebars-js-if-conditional

    扩展的方法如果返回值想保持原值,请使用 return new Handlebars.SafeString(result);

  

     针对博友说的给tr指定id,使用id删除更好,本人暂时没有完成,主要是如果明细列大于1,在模版里面判断有些麻烦

 

      感谢提出意见的各位博友,谢谢

      本文系原创,转载请注明出处,谢谢

      全文完

      

  

  • 大小: 27.5 KB
  • 大小: 33.8 KB
  • 大小: 41 KB
0
0
分享到:
评论

相关推荐

    jquery动态列表的新增、编辑、删除

    本文将深入探讨如何使用jQuery实现动态列表的新增、编辑和删除功能,这些是网页应用中常见的交互元素。 一、动态列表的基础 动态列表通常是一个可交互的HTML元素集合,如`&lt;ul&gt;`或`&lt;table&gt;`,它们可以实时更新以...

    Javascript模版引擎Handlebars.js源文件与示例

    Handlebars.js是一款强大的...在实际开发中,Handlebars.js常用于构建复杂的前端应用,尤其是那些需要动态渲染大量数据的场景。通过熟练掌握Handlebars.js,Web开发者可以更加高效地构建响应式的、数据驱动的用户界面。

    asp.net处理不规则表格 结合jquery处理不规则表格

    在jQuery中,可以使用`$('table').append('&lt;tr&gt;新内容&lt;/td&gt;&lt;/tr&gt;')`来动态添加行,通过改变`&lt;tr&gt;`和`&lt;td&gt;`的数量来应对不规则表格的列变化。 6. **事件处理**: jQuery的事件监听器,如`click()`, `change()`, `...

    jquery-handlebars-partial-fetcher:加载外部车把HTML模板

    这个简单的代码示例使用jQuery Ajax和Handlebars JS以及一种方便且易于遵循的自定义提取方法,该方法将将外部html文件中的html内容加载到主html文件中所需的目标元素中。 利用Handlebars JS,您可以选择传递数据以...

    handlebars入门教程

    "Handlebars 入门教程" Handlebars 是一个流行的模板引擎,用于将数据渲染到 HTML 模板中。它提供了一个简单易用的语法,允许...Handlebars 提供了一个 jQuery 插件,以便将 Handlebars 集成到 jQuery 中。这个插

    Java模板引擎Handlebars.java.zip

    Handlebars.java 是一个不包含逻辑的,语义的 Java 模板引擎。 Maven:    &lt;groupId&gt;com.github.jknack&lt;/groupId&gt;  &lt;artifactId&gt;handlebars  ${handlebars-version}   示例代码: Handlebars handlebars = ...

    前端开源库-handlebars-delimiters

    Handlebars 是一个流行的轻量级模板引擎,常用于前端开发,尤其在构建动态用户界面时。它提供了一种声明式的方式来将数据绑定到HTML模板,使得开发者可以专注于描述视图应该显示什么,而不是如何显示。`handlebars-...

    Laravel开发-handlebars-l4

    从压缩包文件名`handlebars-l4-master`来看,这可能是一个包含示例代码或扩展包的仓库,用于展示如何在Laravel 4中使用Handlebars。它可能包括了配置文件、示例模板、测试案例等资源,帮助开发者了解并实践...

    handlebars官方例子及源代码

    Handlebars是一种轻量级的模板引擎,主要用于JavaScript应用,它允许开发者通过声明式的语法来创建动态HTML。在本文中,我们将深入探讨Handlebars的核心概念、语法特性以及如何使用官方提供的例子和源代码来提升开发...

    前端项目-handlebars.js.zip

    【标题】:“前端项目-handlebars.js.zip”是一个与前端开发相关的压缩包,主要包含的是Handlebars.js库的源...在实际工作中,结合其他前端技术和工具,如jQuery、Webpack或Gulp等,可以构建出高效、灵活的前端应用。

    handlebars-tr:用于翻译字符串的把手助手

    #handlebars-tr 一个简单的助手来翻译车把中的字符串。 ##用法 var Handlebars = require('handlebars'); //var handlebarsTr = require('handlebars-tr')(Handlebars, '__language', '***'); var handlebarsTr...

    gulp-handlebars-precompile-task:预编译 Handlebars 模板的 Gulp 示例

    吞咽把手预编译任务跑步: npm install gulp -g - 全局安装 Gulp。 npm install - npm install其他依赖项。 gulp - 运行gulp任务。信息gulpfile.js规定文件的读取位置和保存位置。 根据您自己的需要更新它。...

    前端开源库-yeoman-handlebars-engine

    【前端开源库-yeoman-handlebars-engine】是一个用于前端开发的开源工具,它结合了Yeoman生成器和Handlebars模板引擎。Yeoman是构建现代Web应用程序的自动化工具,它可以帮助开发者快速搭建项目结构,自动执行常见...

    Handlebars-v3.0.0.js

    Jquery插件,第一步当然要引用Jquery啦,然后引用Handlebars.js即可,仅仅需要这两个js文件。 1 &lt;script type="text/javascript" src="script/jquery.js"&gt; 2 &lt;script type="text/javascript" src="script/...

    前端开源库-handlebars-helper-repeat

    Handlebars 是一个流行...总的来说,handlebars-helper-repeat是一个实用的前端工具,它可以方便地在Handlebars模板中实现内容的重复渲染,提高开发效率,特别是在处理静态内容或者需要动态创建相同结构元素的场景下。

    前端开源库-promised-handlebars

    通过返回 Promise,promised-handlebars 允许我们在模板中处理复杂的异步逻辑,比如从服务器动态获取数据、执行异步计算等。这种方式使得前端模板渲染更加灵活,能够更好地适应现代 Web 应用的需求。 使用 promised...

    jquery漂亮的UI

    "jQuery漂亮的UI"是一个关于利用jQuery创建美观用户界面的主题,结合描述中的"弹出窗口进行增删改查 DATATABLE数据绑定",我们可以深入探讨几个关键知识点。 首先,jQuery UI是jQuery的一个扩展,它提供了丰富的可...

    jquery 进行动态购物车显示, 登录页,详情页,模拟天猫首页

    6. **模板引擎**:虽然不是jQuery自带的功能,但可以结合jQuery使用如Handlebars或Mustache这样的模板引擎,将动态数据结构转化为HTML,使代码更清晰,更易于维护。 7. **响应式设计**:考虑到不同设备的屏幕尺寸,...

    js模版引擎handlebars.js实用教程demo

    通过学习和实践Handlebars.js,你可以更好地理解和构建数据驱动的动态页面,提高开发效率,并确保代码的清晰和可维护性。在这个示例教程中,你将有机会亲自动手操作,进一步掌握Handlebars的基本用法和高级特性。

    jquery模版

    总之,jQuery模板是Web前端开发中快速构建动态界面的一个工具,尤其适用于基于jQuery的项目。然而,随着前端框架的崛起,如React、Vue和Angular,它们内置的模板机制和组件化思想在复杂应用中更具优势。因此,理解并...

Global site tag (gtag.js) - Google Analytics