AS基礎(chǔ)教程整理第13/13頁
更新時(shí)間:2007年03月22日 00:00:00 作者:
第十四章 最后一個(gè)版本選擇題
上一個(gè)版本面向?qū)ο蟮拇a對(duì)我們這個(gè)基于XML的版本很有幫助,上一個(gè)版本我們是用對(duì)象的數(shù)組來存我們的數(shù)據(jù),這個(gè)版本里面,我們使用外部的XML文件
下面先看看XML文件的結(jié)構(gòu):
<QUIZ>
<QUESTION TEXT="at which version of flash were movie clips introduced?" ANSWER="2">
<CHOICE>version 1</CHOICE>
<CHOICE>version 2</CHOICE>
<CHOICE>version 3</CHOICE>
<CHOICE>version 4</CHOICE>
<CHOICE>version 5</CHOICE>
<CHOICE>version 6</CHOICE>
</QUESTION>
<QUESTION TEXT="when was actionscript formally declared a scripting language?" ANSWER="2">
<CHOICE>version 3</CHOICE>
<CHOICE>version 4</CHOICE>
<CHOICE>version 5</CHOICE>
</QUESTION>
<QUESTION TEXT="are regular expressions supported by flash 5 actionscript?" ANSWER="1">
<CHOICE>yes</CHOICE>
<CHOICE>no</CHOICE>
</QUESTION>
<QUESTION TEXT="which sound format offers the best compression?" ANSWER="0">
<CHOICE>mp3</CHOICE>
<CHOICE>aiff</CHOICE>
<CHOICE>wav</CHOICE>
</QUESTION>
<QUESTION TEXT="true or false: the post-increment operator (++) returns the value of its operand + 1." ANSWER="1">
<CHOICE>true</CHOICE>
<CHOICE>false</CHOICE>
</QUESTION>
<QUESTION TEXT="actionscript is based on..." ANSWER="3">
<CHOICE>java</CHOICE>
<CHOICE>javascript</CHOICE>
<CHOICE>c++</CHOICE>
<CHOICE>ecma-262</CHOICE>
<CHOICE>perl</CHOICE>
</QUESTION>
</QUIZ>
這個(gè)XML里面,QUIZ是我們的根元素
每一題都放在QUESTION元素內(nèi),題目正文為其屬性TEXT,正確答案為其屬性ANSWER(ANSWER=1代表選第二個(gè)答案)
每一題的選項(xiàng)則是QUESTION的子節(jié)點(diǎn)CHOICE
其實(shí)根本就不用解釋,大家直接看都能看懂
使用了外部XML之后,我們升級(jí)題目只需改動(dòng)XML文件即可,而上一個(gè)版本,修改外部AS文件之后還是需要EXPORT一次。
這個(gè)版本里面,將保留上個(gè)版本大部分的代碼,除了輸入題目數(shù)據(jù)的部分,將用XML來代替。
以下代碼寫到questionsArray.as中覆蓋其原來內(nèi)容
首先仍然定義一個(gè)數(shù)組來存放數(shù)據(jù)
var questionsArray = new Array();
然后我們定義一個(gè)XML對(duì)象來存放XML數(shù)據(jù)
var quizDoc = new XML();
之后是建立將XML解釋為我們存放題目的對(duì)象格式的函數(shù)buildQuestionsArray(),同時(shí)將它連接到新建的XML對(duì)象的onLoad函數(shù),讓XML下載完成之后執(zhí)行這個(gè)函數(shù)
quizDoc.onLoad = buildQuestionsArray
然后是執(zhí)行下載XML的AS
quizDoc.load("quiz.xml");
最后我們?cè)敿?xì)解說一下解釋XML的函數(shù)
// *** builds an array of question objects based on the dom tree in quizDoc
function buildQuestionsArray () {
// first, strip unwanted whitespace nodes from the tree.
// 除去無用的節(jié)點(diǎn),上一章已經(jīng)有介紹無用節(jié)點(diǎn)是如何出現(xiàn)的
stripWhitespaceDoublePass(quizDoc);
// now assign a convenient reference to the root QUIZ node
// XML文件的根節(jié)點(diǎn)QUIZ節(jié)點(diǎn)就是 quizDoc.childNodes[1],這里將其指名為quizNode,以便運(yùn)用
var quizNode = quizDoc.childNodes[1];
// for each question node that is a child of the QUIZ node...
// 下面的循環(huán)將逐個(gè)提取QUIZ節(jié)點(diǎn)的子節(jié)點(diǎn),即每條題目
for(var k = 0; k < quizNode.childNodes.length; k++) {
// make an array of the text nodes from each CHOICE node
// 為每條題目建立一個(gè)選項(xiàng)數(shù)組
var choicesArray = new Array();
// 下面的循環(huán)則是將題目的子節(jié)點(diǎn),即各選項(xiàng)的nodeValue輸入到choicesArray數(shù)組中
for(var j = 0; j < quizNode.childNodes[k].childNodes.length; j++) {
choicesArray[j] = quizNode.childNodes[k].childNodes[j].firstChild.nodeValue;
}
// construct a question object for each QUESTION node,
// and store it in questionsArray
// 用題目正文、選項(xiàng)數(shù)組、正確答案(正確答案目前還是字符串,所以用Number函數(shù)將之轉(zhuǎn)為數(shù)字)作為參數(shù),建立Question對(duì)象(定義Question對(duì)象的代碼已經(jīng)在上個(gè)例子中解釋了)
// 將新建的Question對(duì)象作為questionsArray數(shù)組的一個(gè)元素
questionsArray[k] = new Question (
Number(quizNode.childNodes[k].attributes.answer),
quizNode.childNodes[k].attributes.text,
choicesArray);
}
// done loading and processing the quiz questions
loadMsg = "";
// begin the quiz
// 調(diào)用函數(shù)makeQuestion,之后的進(jìn)度就同上一個(gè)例子了
makeQuestion(currentQuestion);
}
// *** Strips whitespace nodes from an XML document
// *** by passing twice through each level in the tree
// 下面函數(shù)用于除去無用的空白節(jié)點(diǎn),參數(shù)是需要處理的XML的根元素(我們已經(jīng)將其指名為XMLnode了)
function stripWhitespaceDoublePass(XMLnode) {
// Loop through all the children of XMLnode
// 循環(huán)依次將根元素的子元素提取出來
for (var k = 0; k < XMLnode.childNodes.length; k++) {
// If the current node is a text node...
// 如果該節(jié)點(diǎn)是一個(gè)文本節(jié)點(diǎn),就開始以下檢查 ...
if(XMLnode.childNodes[k].nodeType == 3) {
// ...check for any useful characters in the node.
var j = 0;
var emptyNode = true;
for(j = 0;j < XMLnode.childNodes[k].nodeValue.length; j++) {
// A useful character is anything over 32 (space, tab,
// new line, etc are all below).
// 因?yàn)榭崭?、TAB或換行等空白無意義字符的ASCII碼都小于32,檢查若大于32,即為有數(shù)據(jù)的節(jié)點(diǎn),同時(shí)用break;跳出檢查的循環(huán)
if(XMLnode.childNodes[k].nodeValue.charCodeAt(j) > 32) {
emptyNode = false;
break;
}
}
// If no useful charaters were found, delete the node.
// 若該節(jié)點(diǎn)沒有數(shù)據(jù),就是解釋時(shí)的錯(cuò)誤,將其刪除
if(emptyNode) {
XMLnode.childNodes[k].removeNode();
}
}
}
// Now that all the whitespace nodes have been removed from XMLnode,
// call stripWhitespaceDoublePass on its remaining children.
// 但是還沒完,我們只檢查了所有子節(jié)點(diǎn),而沒有檢查子節(jié)點(diǎn)的子節(jié)點(diǎn),所以以下的循環(huán)將所有子節(jié)點(diǎn)也送到本函數(shù)再繼續(xù)檢查
// 這種函數(shù)自己調(diào)用自己的方法,稱為遞歸,它將一直檢查子節(jié)點(diǎn)的子節(jié)點(diǎn)的子節(jié)點(diǎn)的……一直到該節(jié)點(diǎn)沒有子節(jié)點(diǎn)為止
for(var k = 0; k < XMLnode.childNodes.length; k++) {
stripWhitespaceDoublePass(XMLnode.childNodes[k]);
}
}
現(xiàn)在,我們可以把SWF和XML組成的題目交給一個(gè)不會(huì)編FLASH的老師了,他只要就會(huì)用記事本修改XML文件就行了
全教程完
相關(guān)文章
AS3.0實(shí)例學(xué)習(xí) 熟悉xml的運(yùn)用
AS3.0實(shí)例學(xué)習(xí) 熟悉xml的運(yùn)用...2007-12-12做了個(gè)flash對(duì)mc移動(dòng)的控制,代碼很簡(jiǎn)單:)
做了個(gè)flash對(duì)mc移動(dòng)的控制,代碼很簡(jiǎn)單:)...2007-01-01SWF自適應(yīng)布局技巧 (Rapid Flash Development)快速Flash開發(fā)
當(dāng)我們開發(fā)全站式Flash應(yīng)用時(shí),希望呈現(xiàn)一個(gè)鋪滿瀏覽器屏幕的Flash.2008-12-12