前言

我们在项目开发过程中,经常会遇到页面html元素无法提前预设,而是通过某一些条件动态生成的情况,这里我们需要考虑如下几个因素:

1.需要动态创建的元素类型,比如TextBox, Radio, CheckBox等

2.每一个元素动态命名,确保ID唯一

3.如何获取每一个元素的值

目的

1.预先设定题库

2.创建试卷,并针对该试卷选择题目,题目类型包含单选题与多选题

3.在线生成电子试卷,用户在线考试

4.考试完毕后在线给出得分

代码

通过一个ajax请求,根据考试试卷的名称加载该试卷下所有的试题:

     public void GetItems()
{
var sqldb = SqlHelper.createdb("mts");
string strSql = "usp_get_items";
var dt = sqldb.GetDataTable(strSql);
var json = Library.JsonLib.DataTableToJson(dt);
Response.Write(json);
Response.End()
}
      function gen_paper(paper_name) {

            var strhtml_single = "";    //题目类型-单选题
var strhtml_double = ""; //题目类型-多选题
var sub_single = ""; //单选题下面的题目
var sub_double = ""; //多选题下面的题目
var main_title = ""; //试卷名称
var strhtml_operation = ""; //操作选项 $.ajax({
type: "post",
url: "exam.aspx?Oper=gen_paper&key=" + Math.random(),
data: { paper: encodeURIComponent(paper_name) },
dataType: "json",
success: function (data) {
if (data != null) {
strhtml_single = "<span id='span_single_01' ><div style='font-weight:bold'>一 单选题</div></span></br>";
strhtml_double = "<span id='span_double_01' ><div style='font-weight:bold'>二 多选题</div></span></br>";
main_title = "<div style='font-weight:bold;font-size:30px'align='center'>" + paper_name + "<div/>";
strhtml_operation = "<a id='btn_save' href='javascript:void(0);' class='easyui-linkbutton c6' style='padding:0 30px;text-align:center' onclick='save_result()'>提交</a>";
$(main_title).appendTo("#div_main");
$(strhtml_single).appendTo("#div_main");
$(strhtml_double).appendTo("#div_main");
$(strhtml_operation).appendTo("#div_main");
$.parser.parse("#div_main");
for (var i = 0; i < data.length; i++) {
if (data[i].TYPE_NAME == "单选题") {
single_title_id_arr.push(data[i].FID);
sub_single = "</br><span>" + (i + 1).toString() + "." + data[i].TITLE + "</span></br><span>" + seting_items(data[i].TYPE_NAME, data[i].ITEMS, "radio_" + i.toString()) + "</span></br>";
$(sub_single).appendTo("#span_single_01");
}
if (data[i].TYPE_NAME == "多选题") {
double_title_id_arr.push(data[i].FID);
sub_double = "</br><span>" + (i + 1).toString() + "." + data[i].TITLE + "</span></br><span>" + seting_items(data[i].TYPE_NAME, data[i].ITEMS, "ckb_" + i.toString()) + "</span></br>";
$(sub_double).appendTo("#span_double_01");
}
}
}
}
});
}

针对单选题与多选题分开处理,在动态创建元素的时候调用这个方法:

        function seting_items(typeName, items, control_name) {
if (typeName == "单选题") {
var _single_str = "";
var _single_value_id = "";
var arr_single = items.split("@");
for (var i = 0; i < arr_single.length; i++) { if (i == 0) {
_single_value_id = "A";
}
if (i == 1) {
_single_value_id = "B";
}
if (i == 2) {
_single_value_id = "C";
}
if (i == 3) {
_single_value_id = "D";
}
_single_str += "<input name='" + control_name + "' type='radio' value='" + _single_value_id + "' />" + arr_single[i] + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; }
return _single_str;
} if (typeName == "多选题") {
var _double_str = "";
var _double_value_id = "";
var arr_double = items.split("@");
for (var i = 0; i < arr_double.length; i++) { if (i == 0) {
_double_value_id = "A";
}
if (i == 1) {
_double_value_id = "B";
}
if (i == 2) {
_double_value_id = "C";
}
if (i == 3) {
_double_value_id = "D";
}
_double_str += "<input name='" + control_name + "' type='checkbox' value='" + _double_value_id + "' />" + arr_double[i] + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
} return _double_str;
}
}

取值

元素动态创建完成之后,我们需要取值,方法如下:

        function getRadioBoxValue(radioName) { 

            for (i = 0; i < obj.length; i++) {

                if (obj[i].checked) {
return obj[i].value;
}
}
return "undefined";
} function getCheckBoxValue(checkBoxName) {
var obj = document.getElementsByName(checkBoxName);
var _select_list = "";
for (k in obj) {
if (obj[k].checked) {
_select_list += obj[k].value + ",";
}
}
_select_list = _select_list.substring(0, _select_list.length - 1);
return _select_list; }

取到用户选择的项目,我们就可以用来做进一步处理了,比如根据这个值判断用户是否考试合格等等!

动态生成HTML元素-模拟在线考试功能的更多相关文章

  1. 2)JS动态生成HTML元素的爬取

    2)JS动态生成HTML元素的爬取 import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.W ...

  2. append动态生成的元素,无法触发事件的原因及解决方案

    今天笔者在实现一个简单的动态生成元素功能的时候,发现了一个问题: 使用append动态生成的元素事件绑定失效了. 查阅资料后发现: click(fn)当选中的选择器被点击时触发回调函数fn.只针对与页 ...

  3. jquery动态生成的元素添加事件的方法

    动态生成的元素如果要添加事件,要写成 $(document).on("click", "#txtName", function() { alert(this.v ...

  4. JS动态生成的元素,其对应的方法不响应(比如单击事件,鼠标移动事件等)

    主要原因:在页面给元素注册点击事件的时候[ $(function () {  XXX }); ],JS动态生成的元素还尚未生成,所以click事件就没有生效 解决方法: 方案一:js动态生成元素后再给 ...

  5. jquery无法为动态生成的元素添加点击事件的解决方法

    遇到 jquery无法为动态生成的元素添加点击事件,谷歌一下,整理一下解决方法如下: (<li>中间的元素是动态生成的), 现在想为<i>添加点击事件, 例子如下: <d ...

  6. jQuery对于动态生成的元素绑定无效的问题~~

    问题:很多时候发现,对动态生成的元素绑定click事件是无效的- 原因:直接绑定到动态生成的元素是无效的,是因为Jquery扫描文档找出所有的$(‘’)元素,并把函数绑定到每个元素的click事件上, ...

  7. Angularjs给动态生成的元素绑定事件

    //获取动态生成的元素 getJqforAnguar:function(jqid){ angular.element(document).injector().invoke(function($com ...

  8. 动态生成html元素并为元素追加属性

    动态生成HTML元素的方法有三种: 第一种:document.createElement()创建元素,再用appendChild( )方法将元素添加到指定节点 <!DOCTYPE html> ...

  9. Jquery中动态生成的元素没有点击事件或者只有一次点击事件

    今天用jq做动态生成的元素的click事件时,click只执行了一次,当然有些朋友可能根本没执行, 执行了一次的原因是因为可能有函数加载了一遍,一次都没执行的可能是没绑定对象或者jq版本问题, 动态生 ...

随机推荐

  1. 关于Pop!_OS 19.04有线网络始终正在连接

    一开始使用Pop!_OS时就遇到这个问题,开机进入系统后明明网络没问题,WiFi正常可用, 但是插入网线后有线网络始终显示正在连接,然后可能过一会儿还会弹出来网络激活失败. 但是有可能在使用很久之后再 ...

  2. 解决Chrome插件安装时程序包无效:"CRX_HEADER_INVALID"

    打开chorme的扩展程序(设置——>更多工具——>扩展程序)chrome://extensions 选择开发者模式 拖拽.crx至Chrome的扩展程序列表 安装失败 报错为:程序包无效 ...

  3. 03 Vue实例成员

    Vue实例 1.el:实例 new Vue({ el: '#app' }) // 实例与页面挂载点一一对应 // 一个页面中可以出现多个实例对应多个挂载点 // 实例只操作挂载点内部内容 2.data ...

  4. MCU 51-1概述

    Microcontroller Unit 单片机:将微处理器CPU.存储器(RAM.ROM) .基本输入/输出(I/O) 接口电路和总线接口等组装在一块主机板(即微机主板). 微型计算机:将微处理器C ...

  5. python 面向对象专题(一):面向对象初识、面向对象结构、类、self、实例化对象

    https://www.cnblogs.com/liubing8/p/11301344.html 目录 Python面向对象01 /面向对象初识.面向对象结构.类.self.实例化对象 1. 面向对象 ...

  6. 带Boolean类型的参数的接口用postman测试时传参问题

    带Boolean类型的参数的接口用postman测试时传参问题 @Data public class ATest { private Boolean isCommit; } postman 测试时传参 ...

  7. Python Ethical Hacking - MAC Address & How to Change(1)

    MAC ADDRESS Media Access Control Permanent Physical Unique Assigned by manufacturer WHY CHANGE THE M ...

  8. Java继承多态

    一. 父类引用指向子类对象父类名(接口名) 对象名=new 子类(接口)名称() 二. 父子继承关系中,成员变量重名1.直接通过子类对象访问成员变量 =左边是谁,就优先用谁2.间接通过成员方法访问成员 ...

  9. socket链接

    服务端: package com.batch.service.impl; import java.io.BufferedReader; import java.io.BufferedWriter; i ...

  10. CODING DevOps + Nginx-ingress 实现自动化灰度发布

    作者:王炜,CODING DevOps 后端开发工程师,拥有多年研发经验,云原生.DevOps.Kubernetes 资深爱好者,Servicemesher 服务网格中文社区成员.获得 Kuberne ...