需求:
在做‘景点+门票’这种类型的业务的时候,景点和门票是1-N的关系,一般可以先插入一条景点信息,再在这条今天信息的基础上加入多个门票信息,但是产品人员设计的文档中是要求‘景点+门票’一起插入,如下图所示。好吧既然你们的文档都通过了经理审核,那咱们就只有照做了。
思路:
其实用JavaScript可以很容易做到动态的效果,步骤如下:
- DOM中开始时候没有任何门票类型,只有一个‘添加门票类型’的按钮,并且给这个按钮一个唯一的id标识(当然可以选择其他的方式,但是这个应该是代码最少的)。
- 单击该按钮的时候触发添加一组输入框(每组输入框由一个包围标签包含,并且需要包含删除按钮),所以这里为这个按钮的onclick事件编写一个函数。
- 函数中一次:a.编写这组信息输入框的代码 b.找到添加按钮 c.将这组输入框插入到这个按钮的前面。
- 点击删除按钮,触发删除函数(需要将这组输入框的包围标签的唯一的id标识传给删除函数)
- 编写删除函数:a.根据id找dom元素 b.删除该元素和下面所有内容。
效果如下图所示(尤其注意这里还有个删除按钮)
代码:
局部HTML如下
<!-- 添加的代码 -->
<tr id="addMark"><th></th><td><input type="button" onclick='addTicketType();' value="增加门票类型" title="增加门票类型" /> </td></tr>
<!-- 删除的代码 -->
<input type="button" onclick="delTicketType(${id},1);" title="删除该门票类型" />
这里用jQuery开发包,可以极大的缩短代码
//用于唯一标识新增的输入框的ID值的索引
var newTicketIndex = 0;
//添加信息输入框
function addTicketType(sceneryId) {
var index = '"newTicket' + newTicketIndex +'"';
//这里可以用DOM的方式,但是很多人还是习惯拼写HTML
var content = "<tr id='newTicket"+newTicketIndex+"'><input type='button' onclick='delTicketType("+index+");' title='删除' /></tr>"
$("#addMark").before(content);
//每次添加后的索引值加1
newTicketIndex = newTicketIndex + 1;
}
//删除信息输入框
function delTicketType(ticketId) {
if(confirm("您确定要删除这条门票类型记录吗?删除后,无法恢复")){
$("#"+ticketId).remove();
}
}
上面演示的都是在景点添加功能时候的效果,如果是在修过的时候,门票列表本身就存在,当然添加额外的门票类型输入框组不需要大的修改,这里主要是删除的时候是不同的,需要跟后台的服务器进行交互。
局部HTML如下,${id}代表这个景点的ID
<!-- 添加的代码 -->
<tr id="addMark"><th></th><td><input type="button" onclick='addTicketType(${id});' value="增加门票类型" title="增加门票类型" /> </td></tr>
<!-- 删除的代码 -->
<input type="button" onclick="delTicketType(${id},1);" title="删除该门票类型" />
这里用jQuery开发包,可以极大的缩短代码,使用ajax进行后台交互来删除已经存在于数据库中的‘老的‘门票类型
//用于唯一标识新增的输入框的ID值的索引
var newTicketIndex = 0;
//添加信息输入框
function addTicketType(sceneryId) {
var index = '"newTicket' + newTicketIndex +'"';
//这里需要将景点ID写入到这组HTML代码中,因为在服务端的批量更新插入中需要用到
var content = "<tr id='newTicket"+newTicketIndex+"'><input type='button' onclick='delTicketType("+index+");' title='删除' /></tr>"
$("#addMark").before(content);
//每次添加后的索引值加1
newTicketIndex = newTicketIndex + 1;
}
//删除信息输入框,type用来标记是存在的
function delTicketType(ticketId,type) {
if(confirm("您确定要删除这条门票类型记录吗?删除后,无法恢复")){
$("#"+ticketId).remove();
} else if(type == 1) {
$.ajax({
url:'delTicket.action',
type:'post',
data:'type=ch&ids=' + ticketId,
dataType:'json',
success: function(msg) {
if (msg.error) {
alert("删除失败");
} else {
alert("操作成功");
var domId = "#oldTicket" + ticketId;
$(domId).remove();
}
}
});
}
}
}
附:
有的时候如果不使用jQuery,那么最为麻烦的就是需要自己手动编写一个插入在目标元素后面(本例是在前面)插入dom元素。这里是一个已经抽象过的可用代码(网络上很容易找到):
function insertAfter(newElement,targetElement) {
var parent = targetElement.parentNode;
if (parent.lastChild == targetElement) {
parent.appendChild(newElement);
} else {
parent.insertBefore(newElement,targetElement.nextSibling);
}
}
参考:
- 《JavaSriptDOM编程艺术(第二版)》
分享到:
相关推荐
在Web开发过程中,经常会遇到需要动态添加或删除输入元素的场景,尤其是在需要用户输入不定数量的数据项时。例如,用户可能需要根据自己的业务需求,输入多个折扣策略,每个策略可能包括消费金额和打折率。为了满足...
(1)添加设备:增加对应的设备控制表和系统设备表中的表项,如果需要新建对应的控制器控制表。 (2)删除设备:删除对应的设备控制表和系统设备表中的表项,如果需要删除对应的控制器控制表。 2、设备的分配和回收...
这通常需要后端服务支持批量处理,并且前端页面需要设计成能够动态添加、编辑和删除行。这可能需要用到JavaScript库如jQuery来实现交互,以及AJAX技术异步地与服务器通信,避免页面刷新。 2. 完成查(查询)和增...
15. Access数据库:Access中的货币型数据输入超出两位小数会自动四舍五入,选项C正确。 16. 打印机管理:在Windows中,可以通过“我的电脑”添加打印机,选项正确。 17. 栈的操作:栈遵循后进先出(LIFO)原则,...
大多数都使用MS Word输入,我也分别制作了一个pdf文件。 我发现这是有史以来质量管理最好的入门课程。 它在严谨和启发之间摇摆不定。 启发式方法提供了见解,但也引起了混乱。 在我的笔记(110页)中,我填写了...
5.2.7 接受数量不定的函数实参 229 5.3 从函数返回值 231 5.3.1 返回指针 231 5.3.2 返回引用 234 5.3.3 函数中的静态变量 236 5.4 递归函数调用 239 5.5 C++/CLI编程 241 5.5.1 接受数量可变实参的...
11.1.6 在下一个空单元格中输入一个值 11.1.7 暂停宏的运行以便获得用户选中的单元格区域 11.1.8 计算选中的单元格的数目 11.1.9 确定选中的单元格区域的类型 11.1.10 有效地遍历选中的单元格区域 11.1....
2. 字段默认值:在数据库中,设置字段默认值可以简化用户输入,减少工作量。默认值需与字段数据类型匹配,可以是一个确定的值,也可以是表达式。 3. 包的概念:在面向对象编程中,包是一种组织类和接口的方式,方便...
5.2.8 接受数量不定的函数实参 229 5.3 从函数返回值 231 5.3.1 返回指针 231 5.3.2 返回引用 233 5.3.3 函数中的静态变量 236 5.4 递归函数调用 238 5.5 C++/CLI编程 240 5.5.1 接受数量可变实参的函数 241...
在Python自动化测试中,Selenium是一个非常强大的工具,它允许我们模拟用户操作,例如点击、输入等,以测试Web应用程序的功能。在这个场景中,我们关注的是如何使用Selenium来操作HTML中的单选按钮(Radio Button)...
### 二、不定项选择题 #### 4. 请选择对JavaScript理解有误的: - **选项A**: `JScript是javascript的简称` - **解析**:实际上,JScript是Microsoft的JavaScript实现的名称,而不是JavaScript的简称。 - **选项...
3. **不定项选择题**: - **第1题**:多媒体技术特点包括集成性、交互性和实时性,不包括隐蔽性,选择A、C、D。 - **第2题**:文件排序可以按名称、大小、类型和日期,选择A、B、C。 - **第3题**:计算机网络共享...
12. 要添加边框,可以选择格式菜单的“单元格”命令。 13. Excel的公式都是以等号开头的。 14. 设置字符的字符样式通常在格式工具栏中操作。 15. 将光标移动到文档开始处的快捷键是Ctrl + Home。 三、不定选项题: ...
页面布局是前端开发中的基础技能之一,熟练掌握不同的布局方式有助于提高开发效率和页面质量。 - **Flex布局**:现代Web开发中最常用的布局方式之一,特别适合移动端布局。 - **兼容性**:需考虑不同浏览器对Flex...
#### 二、不定项选择题解析 **4. 请选择对 JavaScript 理解有误的:** 正确答案:ABCD - **选项分析:** - A. `JScript` 实际上是 Microsoft 对 JavaScript 的实现,而不是简写。 - B. JavaScript 并不是 Java ...
(如:在典型的SSH框架的xml配置文件中,陆陆续续的添加Action,Domain,Service) 第一种方法: 解析这个文件,定位到插入位置,插入代码.这对于有严格的文档结构,如xml,是可行的,但对于java文档这样的,解析难度就很大了,...
#### 二、不定项选择题解析 **4. 请选择对javascript理解有误的:** - **选项A**: JScript并不是javascript的简称,它是Microsoft对ECMAScript规范的一种实现。 - **选项B**: JavaScript并非简化Java的开发难度而...