需求:
在做‘景点+门票’这种类型的业务的时候,景点和门票是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页)中,我填写了...
11.1.6 在下一个空单元格中输入一个值 11.1.7 暂停宏的运行以便获得用户选中的单元格区域 11.1.8 计算选中的单元格的数目 11.1.9 确定选中的单元格区域的类型 11.1.10 有效地遍历选中的单元格区域 11.1....
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 接受数量可变实参的...
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的开发难度而...