知识测试(应用程序)

简介

本文主要帮助开发者实现如下功能:

  • 创建多页面应用程序
  • 创建动态HTML元素(使用JSON创建HTML元素)
  • 在他们的应用程序中使用json和json解析器。
  • 在Tizen的Web应用程序使用第三方库,例如:定时器:在这里我们使用了倒数计时器作为第三方库来实现定时器功能

动态HTML元素的优点:

  • 和静态html相比,编码工作较少。
  • 可以很容易地修改HTML页面 - 添加/删除组件时无需显式地写HTML元素

本文附件中的示例应用程序--问答游戏,有利于让学校里的孩子们的了解更多的常识。 它是一个Web应用程序,包含许多的选择题。 对于多个选项,我们使用了单选按钮。 用户只能选择一个答案。 程序中使用了一个倒计时器。 用户必须在指定的期限内给出答案。 当用户只用了一小段时间时,这时会显示一条消息,用以告知用户。 一旦时间用完了,测试便会终止,而后用户可以再次接受测试。 

应用程序开始时,用户可以从如下三类中选择一类:

  • 动物
  • 植物

图1:应用程序的主页

图2:动物问答形式

图3:鸟问答

图4:分数显示

实现

下面简要说明了Quiz应用程序是如何实现的。 我们将展示如何设置定时器,通过JSON解析评估所选的答案,并显示分数。

Json:

JSON(JavaScript对象符号)是一种轻量级的,基于文本的格式,用于数据交互。 它独立于语言和平台(即和平台,语言无关)。  使用键值对格式,让人很容易读。 JSON使用JavaScript语法来描述数据对象。 例如我们示例应用程序中json结构(这个有点复杂,简单点的请参考www.w3schools.com/json):

{"questions":{ "animalQuestions" :[
 {
	"Question": "1.What food makes up nearly all (around 99%) of a Giant Panda’s diet?",
	"name":"animal1",
	"ids":["animal1-choice-1", "animal1-choice-2", "animal1-choice-3", "animal1-choice-4"],
	"labels":["Bamboo","Jowar","Wood","Grass"],
	"values":["Answer 1", "Answer 2","Answer 3", "Answer 4"],
	"Answer": "Answer 1"
	},
	{
	"Question": "2. What type of animal is the largest primate in the world?",
	"name":"animal2",
	"ids":["animal2-choice-1", "animal2-choice-2", "animal2-choice-3", "animal2-choice-4"],
	"labels":["Lion","Cheetah","Gorilla","King-Kong"],
	"values":["Answer 1", "Answer 2","Answer 3", "Answer 4"],
	"Answer": "Answer 3"
	},
        .   .   .
    ],
    
"birdQuestions":[
{
	"Question": "1. Species found in Australia",
	"name":"bird1",
	"ids":["bird1-choice-1", "bird1-choice-2", "bird1-choice-3", "bird1-choice-4"],
	"labels":["Marbled frogmouth","Spotted newtmouth","Mottled toadmouth","freckled salamandergob"],
	"values":["Answer 1", "Answer 2","Answer 3", "Answer 4"],
	"Answer": "Answer 1"
	},
	{
	"Question": "2. Which living bird lays the world’s largest egg?",
	"name":"bird2",
	"ids":["bird2-choice-1", "bird2-choice-2", "bird2-choice-3", "bird2-choice-4"],
	"labels":["Vulture","Owl","Ostrich","Eagle"],
	"values":["Answer 1", "Answer 2","Answer 3", "Answer 4"],
	"Answer": "Answer 3"
	},
       .   .   .
     ],
 }
}

JSON解析器和JSON库适用于许多不同的编程语言。 当前我们使jQuery API: jQuery.getJSON()来解析JSON。

我们使用 jQery的 getJSON()函数获取包含一个 AJAX HTTP GET请求的JSON数据。

语法

$(selector).getJSON(url,data,success(data,status,xhr))

参数 说明

url网址 - 必需的。 发送请求到指定的URL /文件名

数据 - 可选。 指定要发送到服务器的数据

success(data,status,xhr)函数 - 可选的。 指定请求成功时执行的函数。

其他参数:

 数据 - 包含从服务器/ JSON文件返回的数据。

 状态 - 包括一个含有请求状态的字符串(“success”,“notmodified”,“error”,“timeout”或“parsererror”)。

 
xhr - 包含一个XMLHttpRequest对象

JSON解析例子:

parseJsonQuestions = function(keyObject, formid, ansArr) {
$.getJSON("questions.json", function(data) {
	for ( var i = 0; i < data.questions[keyObject].length; i++) {
		var question = data.questions[keyObject][i].Question;
		var name = data.questions[keyObject][i].name;
	.  .  .
}
};

上面的代码片段解析了存放在questions.json文件中的json,questions.json文件是url参数指定的。 请注意,在回调函数中,称为“data”的对象包含了所有我们需要的JSON数据。 keyObject是问题数组的名字,每个问题数组格式为(“animalQuestions”,“birdQuestions”等)。

单选按钮

在我们的应用程序中,单选按钮使用的结构像这样(它对应于上面例子中使用的JSON):

<fieldset data-role="controlgroup">
                <legend>2. What type of animal is the largest primate in the world?</legend>
                <input type="radio" name="animal2" id="animal2-choice-1" value="choice-1"/>
                <label for="radio-choice-1">Lion</label>
                <input type="radio" name="animal2" id="animal2-choice-2" value="choice-2"  />
                <label for="radio-choice-2">Cheetah</label>
                <input type="radio" name="animal2" id="animal2-choice-3" value="choice-3"  />
                <label for="radio-choice-3">Gorilla</label>
                <input type="radio" name="animal2" id="animal2-choice-1" value="choice-4"  />
                <label for="radio-choice-4">King-Kong</label>
</fieldset>

现在,我们将展示如何动态创建单选按钮的代码。 下面是上述parseJsonQuestions()函数的完整版:

parseJsonQuestions = function(keyObject, formid, ansArr) {
var htmlQuestions = '';

$.getJSON("questions.json", function(data) {
	for ( var i = 0; i < data.questions[keyObject].length; i++) {
		var question = data.questions[keyObject][i].Question;
		var name = data.questions[keyObject][i].name;
	    .  .  . //read the json file
        htmlQuestions += '<fieldset data-role="controlgroup">';
        ansArr.push(answer); 
        htmlQuestions += '<legend>' + question + '</legend>';
        <strong>for</strong> ( <strong>var</strong> j = 0; j < labels.length; j++) {
        htmlQuestions += '<input type="radio" name="' + name + "' id="'
                      + ids[j] + '" value="' + values[j] + '"/>';
        htmlQuestions += '<label for="' + ids[j]
                      + '" style="height:30px;">' + labels[j] + '</label>';
       }
       htmlQuestions += '</fieldset>';
 }
document.getElementById(formid).innerHTML = htmlQuestions;
 });
};

我们在htmlQuestions变量中创建HTML,然后将其嵌入适当的表格中。 请注意,我们将所有的正确答案一起放到了ansArr变量中。

现在,读取单选按钮的值,我们可以使用这样类似的语法:

form = document.forms['animals'];
    for ( var i = 0; i < 4; i++) {
        if (form['animal1'][i].checked) {
            // do sth
        }
    }

定时器

在示例应用程序,用户必须在规定时间内回答所有的问答题。 因此,我们使用了一jQuery倒计时插件:jQuery Countdown。 它在MIT许可下可用。 我们用它来显示一个倒计时器,显示还剩下多少秒。

设置一个简单的倒计时是很容易的:

要刷新表单中的所有单选按钮(指定了id),我们需要设置属性“checked”为false,并调用刷新函数:

refreshQuizPage = function(id) {
	for(var i =1; i<=10;i++){
		for(var j=1;j<5;j++) {
			$('#'+id+i+'-choice-'+j).attr("checked",false).checkboxradio("refresh");
		}
	}
}

$('#'+timerId).countdown({
              Until : 120,
	Format : 'S',
	Compact : true,
	onTick : trackTime,
           onExpiry : goToHomePage
});

function goToHomePage(){
	refreshQuizPage(pageId);
	$('#'+pageTimerId).countdown('destroy');
	$.mobile.changePage("#menu", {
		transition : "slideup"
	});
}

timerId是div的名字,而div正是我们想放置定时器的地方。 我们使用选项:

  • Until- 时间倒计时过期时间,
  • Format - 显示倒计时的格式(例如“YOW”,其中Y - 年,O - 月,W - 周,...,S -秒)
  • compact - 紧凑型/不紧凑的形式,
  • onTick -每次倒计时更新自己时执行的回调函数,
  • onExpiry - 倒计时到期时执行的回调函数 

在我们的应用程序,调用“goToHomePage()”函数后,将把用户带回到家主页面。

有关更多选,请参阅文档。

我们设置一个回调,每当倒计时更新时便会执行 - trackTime(周期地)。 它被用来显示时间到了消息。

function trackTime(periods) {
if(periods[6]===30){
	alertMsgId.innerHTML = "You run out of time!"
  }
}

注:此应用程序可扩展成一个客户端 - 服务器应用程序,这样可以实现从服务器获取问题和答案。 在这里我们使用了JSON对象创建HTML元素,同样的JSON对象可以用作服务器的响应,用来创建HTML元素。

使用示例应用程序:

  1. 在设备上部署应用程序
  2. 将显示三大类。 你可以选择你想探索一个主题(玩问答知识测验)
  3. 选择类别后,计时器和多项选择题的问题便会显示出来。 你必须在给定时间内回答问题,并点击放置在同一个页面最后一节的提交按钮。 如果你在规定的时间内未完成答题,将显示一条消息,
  4. 查看你的成绩
  5. 如果你想再次参加考试,可以点击成绩页面中的“Take test again”(在任何类别中)按钮。
  6. 或通过单击退出按钮退出应用程序

要:

本文介绍了如何创建带有动态HTML元素的多页面应用程序。  示例程序中使用了json解析器,并解释了如何使用外部定时器。

文件附件: