第9章 XML存储结构以及整合ASP的应用

该博客介绍了测试页面的功能和原理。先选择题目数量,通过URL参数传递到测试页面,设置隐藏的题目总数。接着对下一题等按钮进行事件处理,测试完毕后计算隐藏字段中的总得分数。
下面是一个自编心理测试程序的例子,用XML+JAVASCRIPT实现.

心得:
1.如果要使用node.nextSibling,最好这个节点后面没有注释.
2.还是大小写问题,一定不能弄错.此例中的Element有一个我写成了ELement,花了2个小时才找到这个错误.

testfile.xml:(测试题目的XML数据文件)
None.gif<?xml version="1.0" encoding="gb2312"?>
None.gif
<!-- 测试题目qusNu属性代表题目总数 -->
None.gif
<!-- gd代表了该选项的分值 -->
None.gif
<mentality qusNu="12">
None.gif    
<question id="1">
None.gif        
<text>你喜欢哪一类的人?</text>
None.gif        
<answer1 gd="1">比自己强的;</answer1>
None.gif        
<answer2 gd="3">喜欢和尊重自己的;</answer2>
None.gif        
<answer3 gd="5">需要自己的;</answer3>
None.gif        
<answer4 gd="0">不知道;</answer4>
None.gif    
</question>
None.gif    
<question id="2">
None.gif        
<text>当你的朋友不赞成也不理解你的建议时,你会:</text>
None.gif        
<answer1 gd="1">避开这个问题;</answer1>
None.gif        
<answer2 gd="3">继续解释;</answer2>
None.gif        
<answer3 gd="5">听听他的意见;</answer3>
None.gif        
<answer4 gd="0">觉得受伤或生气,不再说话;</answer4>
None.gif    
</question>
None.gif    
<question id="3">
None.gif        
<text>和朋友聚会,当你觉得情绪低落时,你会:</text>
None.gif        
<answer1 gd="1">不掩饰情绪,但坚持到最后;</answer1>
None.gif        
<answer2 gd="3">强作欢颜,不让人注意到不快情绪;</answer2>
None.gif        
<answer3 gd="5">找借口离开;</answer3>
None.gif        
<answer4 gd="0">如实告诉朋友离开;</answer4>
None.gif    
</question>
None.gif    
<question id="4">
None.gif        
<text>工作上遇到麻烦,下班后你会:</text>
None.gif        
<answer1 gd="1">闷在心里,愤愤不已;</answer1>
None.gif        
<answer2 gd="3">找朋友倾吐不快;</answer2>
None.gif        
<answer3 gd="5">一个人出去散心,忘掉烦恼;</answer3>
None.gif        
<answer4 gd="0">希望回家从亲人处得到安慰;</answer4>
None.gif    
</question>
None.gif    
<question id="5">
None.gif        
<text>某人你刚认识的人,吃力地向教导你某件你很清楚的事,你会:</text>
None.gif        
<answer1 gd="1">不说什么,但也不听;</answer1>
None.gif        
<answer2 gd="3">等他讲完,再显示你对此道十分精通;</answer2>
None.gif        
<answer3 gd="5">很认真地听完他的讲述,并不时称赞;</answer3>
None.gif        
<answer4 gd="0">告诉他你早就知道;</answer4>
None.gif    
</question>
None.gif    
<question id="6">
None.gif        
<text>你认为自己:</text>
None.gif        
<answer1 gd="1">每遇上好机会,不然会有更好的生活;</answer1>
None.gif        
<answer2 gd="3">总是在花大量时间做着自己不想做的事;</answer2>
None.gif        
<answer3 gd="5">目前的生活与自己的付出的相符;</answer3>
None.gif        
<answer4 gd="0">说不定明天就会撞上好运;</answer4>
None.gif    
</question>
None.gif    
<question id="7">
None.gif        
<text>马上要过节了,你会:</text>
None.gif        
<answer1 gd="1">花许多时间想像要做的事;</answer1>
None.gif        
<answer2 gd="3">过节没意思;</answer2>
None.gif        
<answer3 gd="5">没什么特别的异样感觉;</answer3>
None.gif        
<answer4 gd="0">激动不已地等待盼望;</answer4>
None.gif    
</question>
None.gif    
<question id="8">
None.gif        
<text>出门前你的家人若穿着不适,你:</text>
None.gif        
<answer1 gd="1">坚持要他(她)换装;</answer1>
None.gif        
<answer2 gd="3">建议他(她)换一下装束;</answer2>
None.gif        
<answer3 gd="5">无所谓;</answer3>
None.gif        
<answer4 gd="0">除非他(她)换装,不然不会与其一同出门;</answer4>
None.gif    
</question>
None.gif    
<question id="9">
None.gif        
<text>在重要的事情即将发生时,你会:</text>
None.gif        
<answer1 gd="1">想寻求支持和鼓励;</answer1>
None.gif        
<answer2 gd="3">不愿与人谈及此事;</answer2>
None.gif        
<answer3 gd="5">轻松的与朋友谈论此事;</answer3>
None.gif        
<answer4 gd="0">干其余事时非常焦躁;</answer4>
None.gif    
</question>
None.gif    
<question id="10">
None.gif        
<text>当有人惹恼你时,你会:</text>
None.gif        
<answer1 gd="1">向其余人唠叨,抱怨;</answer1>
None.gif        
<answer2 gd="3">偶尔会唠叨几句;</answer2>
None.gif        
<answer3 gd="5">不记在心上,无所谓;</answer3>
None.gif        
<answer4 gd="0">挖苦讽刺回击他(她);</answer4>
None.gif    
</question>
None.gif    
<question id="11">
None.gif        
<text>当你的密友发脾气时,你会:</text>
None.gif        
<answer1 gd="1">焦虑,担心是不是自己的过错;</answer1>
None.gif        
<answer2 gd="3">不住地问他(她)怎么啦;</answer2>
None.gif        
<answer3 gd="5">不理睬,让密友自己恢复;</answer3>
None.gif        
<answer4 gd="0">叫他(她)停止无理取闹;</answer4>
None.gif    
</question>
None.gif    
<question id="12">
None.gif        
<text>你在与人发生争执后会:</text>
None.gif        
<answer1 gd="1">仍然坚持并想证明自己的观点;</answer1>
None.gif        
<answer2 gd="3">假装什么也没有发生;</answer2>
None.gif        
<answer3 gd="5">很快冷静下来并且道歉;</answer3>
None.gif        
<answer4 gd="0">连着几天不理他(她);</answer4>
None.gif    
</question>
None.gif
</mentality>

ex40-1.htm:(测试的设置界面,选择要测试的题目数量)
None.gif<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
None.gif
<HTML>
None.gif
<HEAD>
None.gif
<meta http-equiv="Content-Type" content="text/html;charset=gb2312"/>
None.gif
<TITLE> 测试设置界面 </TITLE>
ExpandedBlockStart.gifContractedBlock.gif
<style>dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif.title 
{dot.gif}{font:24pt 楷体_gb2312;font:bold;color:Purple;}
None.gif
</style>
None.gif
</HEAD>
None.gif
None.gif
<BODY bgcolor="#6699FF">
ExpandedBlockStart.gifContractedBlock.gif
<SCRIPT LANGUAGE="JavaScript">dot.gif
InBlock.gif
<!-- 
InBlock.gif
//单击开始测试,将题目数量的信息通过URL传递到测试页面
InBlock.gif
function startTest()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
var testData="?"+testNumber.value;
InBlock.gif    location.href
="ex40-2.htm"+testData;
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif
//-->
None.gif
</SCRIPT>
None.gif
<div align="center">新建测试</div>
None.gif
<align="center">@请设置题目数量:</p>
None.gif
<div align="center">
None.gif
<select name="testNumber">
None.gif    
<option value="5">5</option>
None.gif    
<option value="10">10</option>
None.gif    
<option value="所有">全部</option>
None.gif
</select>
None.gif
</div>
None.gif
<align="center">
None.gif
<input type="button" name="submit3" value="开始测验" onClick="startTest()"/>
None.gif
</p>
None.gif
</BODY>
None.gif
</HTML>

ex40-2.htm:(测试做题主界面)
None.gif<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
None.gif
<HTML>
None.gif
<HEAD>
None.gif
<meta http-equiv="Content-Type" content="text/html;charset=gb2312"/>
None.gif
<TITLE> 测试界面 </TITLE>
ExpandedBlockStart.gifContractedBlock.gif
<style>dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif.big 
{dot.gif}{font:bold;}
ExpandedSubBlockStart.gifContractedSubBlock.gif.showhand 
{dot.gif}{font:15pt;font:bold;cursor:hand;text-align:center;}
ExpandedSubBlockStart.gifContractedSubBlock.gif.ans 
{dot.gif}{border:outset;color:teal;}
ExpandedSubBlockStart.gifContractedSubBlock.gif.anssel 
{dot.gif}{border:outset;color:Aqua;}
ExpandedSubBlockStart.gifContractedSubBlock.gif.anst 
{dot.gif}{font:12pt;}
None.gif
</style>
None.gif
</HEAD>
None.gif
<BODY bgcolor="#6699FF" onload="getTestSet()">
None.gif
<!-- 使用HTML的隐藏表单来存储测试中的临时信息 -->
None.gif
<FORM METHOD=POST ACTION="" NAME="hiddenElements">
None.gif
<!-- 测试数量 -->
None.gif
<INPUT TYPE="hidden" NAME="testNum" VALUE="10">
None.gif
<!-- 当前测试题标号 -->
None.gif
<INPUT TYPE="hidden" NAME="nowNum" VALUE="0">
None.gif
<!-- 随机的测试题标号串 -->
None.gif
<INPUT TYPE="hidden" NAME="testNo" VALUE="0">
None.gif
<!-- 测试开始标志 -->
None.gif
<INPUT TYPE="hidden" NAME="testStart" VALUE="0">
None.gif
<!-- 测试结束标志 -->
None.gif
<INPUT TYPE="hidden" NAME="testOver" VALUE="0">
None.gif
<!-- 答案A-D -->
None.gif
<INPUT TYPE="hidden" NAME="Answer1Value" VALUE="0">
None.gif
<INPUT TYPE="hidden" NAME="Answer2Value" VALUE="0">
None.gif
<INPUT TYPE="hidden" NAME="Answer3Value" VALUE="0">
None.gif
<INPUT TYPE="hidden" NAME="Answer4Value" VALUE="0">
None.gif
<!-- 测试分数 -->
None.gif
<INPUT TYPE="hidden" NAME="AnswerQueue" VALUE="0">
None.gif
</FORM>
None.gif
<!-- 调用ex40.js中的脚本程序 -->
None.gif
<script language="javascript" src="ex40.js"></script>
None.gif
<XML id="qusXML" src="testfile.xml"></XML>
None.gif
<input type="button" value="开始" onclick="startTest()">
None.gif
<input type="button" value="下一题" onclick="nextQuestion()">
None.gif
<input type="button" value="提示" onclick="showAnswer()">
None.gif
<FORM METHOD=POST ACTION="" NAME="testArea">
None.gif
<table width="100%" border="0">
None.gif    
<tr>
None.gif    
<!-- 显示当前题目的序号 -->
None.gif        
<td width="15%" align="center"><div id="thisNum"></div></td>
None.gif        
<td><div id="totalNum" align="center"/></td>
None.gif        
<td rowspan="2" valign="top"/>
None.gif    
</tr>
None.gif    
<tr>
None.gif        
<td height="40" align="center"/>
None.gif        
<!-- 显示当前测试的问题 -->
None.gif        
<td valign="top"><div id="qustext" class="big"></div></td>
None.gif    
</tr>
None.gif    
<!-- 显示当前题目的选项 -->
None.gif    
<tr>
None.gif        
<td width="8%" class="showhand" onclick="setAnsA()">
None.gif            
<div id="pA"><div class="ans">A</div></div>
None.gif        
</td>
None.gif        
<td><div id="a" class="anst"/></td>
None.gif        
<td width="8%"><input type="radio" name="checkAnswer" value="1"></td>
None.gif    
</tr>
None.gif    
<tr>
None.gif        
<td width="8%" class="showhand" onclick="setAnsB()">
None.gif            
<div id="pB"><div class="ans">B</div></div>
None.gif        
</td>
None.gif        
<td><div id="b" class="anst"/></td>
None.gif        
<td width="8%"><input type="radio" name="checkAnswer" value="2"></td>
None.gif    
</tr>
None.gif    
<tr>
None.gif        
<td width="8%" class="showhand" onclick="setAnsC()">
None.gif            
<div id="pC"><div class="ans">C</div></div>
None.gif        
</td>
None.gif        
<td><div id="c" class="anst"/></td>
None.gif        
<td width="8%"><input type="radio" name="checkAnswer" value="3"></td>
None.gif    
</tr>
None.gif    
<tr>
None.gif        
<td width="8%" class="showhand" onclick="setAnsD()">
None.gif            
<div id="pD"><div class="ans">D</div></div>
None.gif        
</td>
None.gif        
<td><div id="d" class="anst"/></td>
None.gif        
<td width="8%"><input type="radio" name="checkAnswer" value="4"></td>
None.gif    
</tr>
None.gif
</table>
None.gif
</FORM>
None.gif
</BODY>
None.gif
</HTML>

ex40.js:(处理脚本程序)
None.gif//初始化程序,调入参数对测试数据初始化
None.gif
function getTestSet()
None.gif{
None.gif    
//从URL信息字串中读取参数值
None.gif
    var dataQueue=location.search;
None.gif    dataQueue
=dataQueue.substring(1,dataQueue.length);
None.gif    document.hiddenElements.testNum.value
=dataQueue;
None.gif    
//生成题库总量
None.gif
    var xmldoc=document.all("qusXML").XMLDocument;
None.gif    
var testNode=xmldoc.documentElement;
None.gif    
var databaseN=testNode.attributes.getNamedItem("qusNu").value;
None.gif    
if(dataQueue=="所有")
None.gif    {
None.gif        document.hiddenElements.testNum.value
=databaseN;
None.gif    }
None.gif    totalNum.innerHTML
=""+document.hiddenElements.testNum.value+"";
None.gif}
None.gif
None.gif
//开始测试
None.gif
function startTest()
None.gif{
None.gif    
if(document.hiddenElements.testStart.value==1&&document.hiddenElements.testOver==0)
None.gif    {
None.gif        alert(
"测试已经开始,快做题吧!");
None.gif    }
None.gif    
else if(document.hiddenElements.testOver.value==1)
None.gif    {
None.gif        alert(
"测试已经结束,有什么收获么?");
None.gif    }
None.gif    
else
None.gif    {
None.gif        document.hiddenElements.testStart.value
=1;
None.gif        
//调用处理XML文档信息的程序;
None.gif
        readXMLDocument();
None.gif    }
None.gif}
None.gif
None.gif
//下一题
None.gif
function nextQuestion()
None.gif{
None.gif    
if(document.hiddenElements.testStart.value==0)
None.gif    {
None.gif        alert(
"请先单击开始按钮!");
None.gif    }
None.gif    
else
None.gif    {
None.gif        
if(document.hiddenElements.testOver.value==1)
None.gif        {
None.gif            alert(
"测试已经结束,有什么收获么?");
None.gif        }
None.gif        
else
None.gif        {
None.gif            
if(checkAnswer()==-1)
None.gif            {
None.gif                alert(
"请选择一个答案:");
None.gif            }
None.gif            
else
None.gif            {
None.gif                
//将用户当前选择的答案转化为数值,累加到总分中
None.gif
                var gd=parseInt(document.hiddenElements.AnswerQueue.value);
None.gif                gd
+=parseInt(checkAnswer());
None.gif                document.hiddenElements.AnswerQueue.value
=gd;
None.gif                
//显示下一题
None.gif
                readXMLDocument();
None.gif                
//复位当前按钮
None.gif
                document.testArea.checkAnswer[0].checked=true;
None.gif                document.testArea.checkAnswer[
0].checked=false;
None.gif            }
None.gif        }
None.gif    }
None.gif}
None.gif
None.gif
function showAnswer()
None.gif{
None.gif    alert(
"暂不提供答案提示功能!");
None.gif}
None.gif
None.gif
//读取XML数据,显示题目
None.gif
function readXMLDocument()
None.gif{
None.gif    
var xmldoc,QuestionNode;
None.gif    
var TextNode;
None.gif    
//指向答案节点的数组
None.gif
    var AnswerNode=new Array(4);
None.gif    
//定义测试题目总数和当前题目序号
None.gif
    var tolnum,num;
None.gif    tolnum
=document.hiddenElements.testNum.value;
None.gif    num
=document.hiddenElements.nowNum.value;
None.gif    
//如果当前题目序号等于总测试题数,结束测试(注意num是从0开始的)
None.gif
    if(num==tolnum)
None.gif    {
None.gif        document.hiddenElements.testOver.value
=1;
None.gif        alert(
"测试结束,来看看您的测试结果!");
None.gif        getResult();
None.gif    }
None.gif    
else
None.gif    {
None.gif        num
++;
None.gif        document.hiddenElements.nowNum.value
=num;
None.gif        
//XML数据岛连接 读取测试题目信息
None.gif
        xmldoc=document.all("qusXML").XMLDocument;
None.gif        
//XML文档数据调用
None.gif
        QuestionNode=xmldoc.getElementsByTagName("question");
None.gif        TextNode
=QuestionNode.item(num-1).firstChild;
None.gif        AnswerNode[
0]=TextNode.nextSibling;
None.gif        AnswerNode[
1]=AnswerNode[0].nextSibling;
None.gif        AnswerNode[
2]=AnswerNode[1].nextSibling;
None.gif        AnswerNode[
3]=AnswerNode[2].nextSibling;
None.gif        
//清空上次选择的答案,复位答案选框
None.gif
        pA.innerHTML="<div class='ans'>A</div>";
None.gif        pB.innerHTML
="<div class='ans'>B</div>";
None.gif        pC.innerHTML
="<div class='ans'>C</div>";
None.gif        pD.innerHTML
="<div class='ans'>D</div>";
None.gif        
//调入试题答案,将相应的分值存储到表单中
None.gif
        document.hiddenElements.Answer1Value.value=AnswerNode[0].attributes.getNamedItem("gd").value;
None.gif        document.hiddenElements.Answer2Value.value
=AnswerNode[1].attributes.getNamedItem("gd").value;
None.gif        document.hiddenElements.Answer3Value.value
=AnswerNode[2].attributes.getNamedItem("gd").value;
None.gif        document.hiddenElements.Answer4Value.value
=AnswerNode[3].attributes.getNamedItem("gd").value;
None.gif        
//在页面上显示试题和选项
None.gif
        thisNum.innerHTML=""+num+"";
None.gif        qustext.innerHTML
=TextNode.firstChild.nodeValue;
None.gif        a.innerHTML
=AnswerNode[0].firstChild.nodeValue;
None.gif        b.innerHTML
=AnswerNode[1].firstChild.nodeValue;
None.gif        c.innerHTML
=AnswerNode[2].firstChild.nodeValue;
None.gif        d.innerHTML
=AnswerNode[3].firstChild.nodeValue;
None.gif    }
None.gif}
None.gif
None.gif
//参照隐藏表单中的分数值将选择转化为分数
None.gif
function checkAnswer()
None.gif{
None.gif    
var i=0;
None.gif    
while(i<4&&!document.testArea.checkAnswer[i].checked)
None.gif        i
++;
None.gif    
switch(i)
None.gif    {
None.gif        
case 0:return document.hiddenElements.Answer1Value.value;
None.gif        
case 1:return document.hiddenElements.Answer2Value.value;
None.gif        
case 2:return document.hiddenElements.Answer3Value.value;
None.gif        
case 3:return document.hiddenElements.Answer4Value.value;
None.gif        
default:return -1;        
None.gif    }
None.gif}
None.gif
None.gif
//显示测试结果
None.gif
function getResult()
None.gif{
None.gif    document.hiddenElements.testOver.value
=1;
None.gif    
var testgd=document.hiddenElements.AnswerQueue.value;
None.gif    
var titlegd=document.hiddenElements.testNum.value*5;
None.gif    
var dig=testgd/titlegd;
None.gif    
var result="您的分数为"+testgd+"(最高"+titlegd+"分),正处于";
None.gif    
if(dig<=0.33)
None.gif        result
+="儿童时期";
None.gif    
else if(dig<0.66)
None.gif        result
+="青少年时期";
None.gif    
else
None.gif        result
+="成年时期";
None.gif    alert(result);
None.gif}
None.gif
None.gif
//使用CSS样式定义处理按钮效果
None.gif
function setAnsA()
None.gif{
None.gif    document.testArea.checkAnswer[
0].checked=true;
None.gif    pA.innerHTML
="<div class='anssel'>A</div>";
None.gif    pB.innerHTML
="<div class='ans'>B</div>";
None.gif    pC.innerHTML
="<div class='ans'>C</div>";
None.gif    pD.innerHTML
="<div class='ans'>D</div>";
None.gif}
None.gif
function setAnsB()
None.gif{
None.gif    document.testArea.checkAnswer[
1].checked=true;
None.gif    pA.innerHTML
="<div class='ans'>A</div>";
None.gif    pB.innerHTML
="<div class='anssel'>B</div>";
None.gif    pC.innerHTML
="<div class='ans'>C</div>";
None.gif    pD.innerHTML
="<div class='ans'>D</div>";
None.gif}
None.gif
function setAnsC()
None.gif{
None.gif    document.testArea.checkAnswer[
2].checked=true;
None.gif    pA.innerHTML
="<div class='ans'>A</div>";
None.gif    pB.innerHTML
="<div class='ans'>B</div>";
None.gif    pC.innerHTML
="<div class='anssel'>C</div>";
None.gif    pD.innerHTML
="<div class='ans'>D</div>";
None.gif}
None.gif
function setAnsD()
None.gif{
None.gif    document.testArea.checkAnswer[
3].checked=true;
None.gif    pA.innerHTML
="<div class='ans'>A</div>";
None.gif    pB.innerHTML
="<div class='ans'>B</div>";
None.gif    pC.innerHTML
="<div class='ans'>C</div>";
None.gif    pD.innerHTML
="<div class='anssel'>D</div>";
None.gif}

功能和原理:
开始先选择题目数量,通过URL参数传递到测试页面,并设置隐藏题目总数字段的值,然后分别对下一题等按钮进行事件处理,最后判断测试完毕后给出一直进行计算放在隐藏字段中的总得分数.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值