前言

我们在项目开发过程中,经常会遇到页面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. kubernetes系列(十三) - 存储之Volume

    1. Volume简介 1.1 k8s的volume和docker的volume区别 1.2 kubernetes支持的volume类型 2. 重点的volume类型 2.1 emptyDir 2.1 ...

  2. day06 可变不可变类型

    1.可变不可变类型 可变类型 定义:值改变,id不变,改的是原值 不可变类型 定义:值改变,id也变了,证明是产生了新的值没有改变原值 验证 x = 10 print(id(x)) x = 11 pr ...

  3. day22 作业

    1 统计文件夹大小 def get_filesize(file_path): count = 0 res=None files_sum = os.listdir(file_path) for file ...

  4. 简单讲解一下http2的多路复用

    在 HTTP/1 中,每次请求都会建立一次HTTP连接,也就是我们常说的3次握手4次挥手,这个过程在一次请求过程中占用了相当长的时间,即使开启了 Keep-Alive ,解决了多次连接的问题,但是依然 ...

  5. JVM 专题七:运行时数据区(二)程序计数器

    1.程序计数器 1. 什么是PC寄存器(程序计数器)? JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现 ...

  6. redis(十八):Redis 配置

    #redis.conf# Redis configuration file example.# ./redis-server /path/to/redis.conf ################# ...

  7. P2070 刷墙 (洛谷)

    题目描述 Farmer John已经设计了一种方法来装饰谷仓旁边的长栅栏(把栅栏认为是一根一维的线).他把一只画刷绑在他最喜爱的奶牛Bessie身上,之后就去喝一杯冰水,而Bessie隔着栅栏来回走, ...

  8. /dev/mapper/VolGroup00-LogVol00 满了,根目录存储垃圾文件导致磁盘满了

    登录系统,df -H 发现磁盘存储快满了 解决办法 1. 使用命令查出根目录下大的垃圾文件 使用 du -sh /* | sort -nr 查看根目录下的的大文件,找的不要的 rm -rf 使用 fi ...

  9. Angular 的前世今生

    目录 序言 AngularJS 简介 Angular 2.0 的动机 现如今的 Angular Angular 的核心概念 参考 序言 Angular 一般意义上是指 Angular v2 及以上版本 ...

  10. Flutter 实现酷炫的3D效果

    老孟导读:此文讲解3个酷炫的3D动画效果. 下面是要实现的效果: Flutter 中3D效果是通过 Transform 组件实现的,没有变换效果的实现: class TransformDemo ext ...