更多操作
无编辑摘要 |
无编辑摘要 |
||
第1行: | 第1行: | ||
/*<%-- [PAGE_INFO] | |||
comment = #Please do not remove this struct. It's record contains some important information of edit. This struct will be removed automatically after you push edits.# | |||
pageTitle = #MediaWiki:Gadget-tikuRenderModule.js# | |||
pageID = #3426# | |||
revisionID = #69839# | |||
contentModel = #javascript# | |||
contentFormat = #text/javascript# | |||
[END_PAGE_INFO] --%>*/ | |||
//主函数 | |||
function renderTimuFromSessionStorage(){ | function renderTimuFromSessionStorage(){ | ||
var timuList = gDomTimuList() | var timuList = gDomTimuList() | ||
console.log(timuList) | |||
var order = timuList.order | var order = timuList.order | ||
var timu = timuList.timu | var timu = timuList.timu | ||
var errors = timuList.errors | var errors = timuList.errors | ||
var repeatSource = timuList.repeatSource | var repeatSource = timuList.repeatSource | ||
for(var i=0;i<order.length;i++){ | for(var i=0;i<order.length;i++){ | ||
if(order[i].isError){ | |||
var errorWidget = new OO.ui.MessageWidget( { | var errorWidget = new OO.ui.MessageWidget( { | ||
type: 'error', | type: 'error', | ||
第18行: | 第25行: | ||
}else{ | }else{ | ||
var dataJSON = timu[i].dataJSON | var dataJSON = timu[i].dataJSON | ||
var o = newTimu(i,dataJSON,{})[dataJSON.type]() | |||
render(i,dataJSON.type,o) | render(i,dataJSON.type,o) | ||
var needCheck = $('#noRepeatCheck').length<=0 | var needCheck = $('#noRepeatCheck').length<=0 | ||
第28行: | 第35行: | ||
render(i,'A',warningWidget.$element) | render(i,'A',warningWidget.$element) | ||
} | } | ||
} | } | ||
} | } | ||
} | } | ||
function | |||
//题目渲染函数 | |||
//生成info | |||
function infoInline(info){ | |||
return $('<div class="info">'+info+'</div>') | |||
} | } | ||
//单行题干的处理titleInline(type, source, title) | |||
//生成titleGroup | |||
function titlesGroup(titlesList){ | |||
var group = $('<div class="titlesGroup"></div>') | |||
for(var i=0;i<titlesList.length;i++){ | |||
group.append(titlesList[i]) | |||
} | } | ||
return group | |||
} | } | ||
function | //生成titleInline | ||
function titleInline(id, type,originalSource, sourceSuffix,title, classes){ | |||
classes = classes===undefined?'':classes | |||
return $('<div id="title-'+id+'" class="'+classes+'"></div>').append( | |||
titleInlineType(type), | |||
titleInlineSource(originalSource,sourceSuffix), | |||
titleInlineTitle(title) | |||
) | |||
} | } | ||
function | function titleInlineType(type){ | ||
var | var typeChinese = { | ||
A:'A', | |||
A2:'A2', | |||
A3:'A3', | |||
B:'B', | |||
C:'C', | |||
X:'X', | |||
TK:'填空', | |||
PD:'判断', | |||
MJ:'名解' | |||
} | } | ||
return | return $('<p class="type">'+typeChinese[type]+'</p>') | ||
} | } | ||
//从有中文的source中提取最后一个连续数字作为真实的source | //从有中文的source中提取最后一个连续数字作为真实的source | ||
第88行: | 第87行: | ||
} | } | ||
return {prefix:prefix,source:realSource} | return {prefix:prefix,source:realSource} | ||
} | |||
//返回source的obj | |||
function titleInlineSource(originalSource, suffix){ | |||
var realSource = getRealSource(originalSource) | |||
var prefix = realSource.prefix | |||
var source = realSource.source | |||
var suffix = suffix === undefined ? '':'-'+suffix | |||
return $('<p class="source">'+prefix+source+suffix+'</p>') | |||
} | } | ||
function | //返回sourceRange的obj | ||
function rangeInline(originalSource, sourceRange, type){ | |||
if( | var source = getRealSource(originalSource).source | ||
if( | var end = source*1+sourceRange*1 -1 | ||
var rangeText = '第 '+source +' 到 ' + end + ' 题' | |||
var suffix = type==='B'?'共用备选答案':'共用题干' | |||
return $('<div class="sourceRange">'+rangeText + suffix +'</div>') | |||
} | |||
//返回title 的 obj | |||
function titleInlineTitle(title){ | |||
return $('<p class="title">'+title+'</p>') | |||
} | |||
//生成B、C型题的选择框 | |||
function dropDownInputWidget(id, availabelOptions){ | |||
var options = [] | |||
for(var i=0;i<availabelOptions.length;i++){ | |||
options.push({ | |||
data:availabelOptions[i], | |||
label:availabelOptions[i] | |||
}) | |||
} | |||
return new OO.ui.DropdownInputWidget( { | |||
name:'dropdown-input-'+id, | |||
options: options, | |||
classes:['dorpdown'] | |||
} ).$element | |||
} | |||
//生成options(options 是 Map对象) | |||
function optionsGroup(type,id,options){ | |||
var flexClass = (type==='B')||(type==='C') ? 'optionsGroup-flex':'' | |||
var inputType = type==='X' ? 'checkbox':'radio' | |||
var optionGroupObj = $('<div class="optionsGroup '+flexClass+'"></div>') | |||
options.forEach(function(value, key, map){ | |||
optionGroupObj.append(optionInline(id, key, value, !((type==='B')||(type==='C')), inputType)) | |||
}) | |||
return optionGroupObj | |||
} | |||
//生成optionInline | |||
function optionInline(id, option, content,input,inputType){ | |||
console.log(input) | |||
var input = input ? $('<input id="option-input-'+id+'-'+option+'" name="optionsGroup-' + id + '" type="'+inputType+'" value="' + option + '" />'):'' | |||
var optionLabel = $('<label for="option-input-'+id+'-'+option+'">'+option+'. </label>') | |||
var contentLabel = $('<label for="option-input-'+id+'-'+option+'">'+content+'</label>') | |||
return $('<div id="option-'+id+'-'+option+'" class="optionInline"></div>').append(input,optionLabel,contentLabel) | |||
} | |||
//清理json中的choice(清除空项并排序),接收Obj, | |||
function cleanOptions(options){ | |||
return sortDicByKey(filterEmptyEntries(options)) //返回一个 Map 对象 | |||
} | |||
//生成buttonGroup | |||
function buttonGroup(showSubmitBtn, showEditBtn, id, type, correctAnswer, hoverTarget){ | |||
console.log(showEditBtn) | |||
var buttonGroupObj = $('<div class="buttonGroup"></div>') | |||
if(showSubmitBtn){buttonGroupObj.append( | |||
new OO.ui.ButtonWidget( { | |||
id:'showThisAnswer-'+id, | |||
label: '提交', | |||
flags: [ | |||
'progressive' | |||
] | |||
} ).$element.bind("click",function (){ | |||
showThisAnswer(id,type,correctAnswer) | |||
}) | |||
)} | |||
if(showEditBtn){ | |||
buttonGroupObj.append( | |||
// $('<a class="editThisBtn" style="" href="javascript:void(0)"><span class="" id="editThis-' + id + '">题目有误?点击编辑本题</span></a>'), | |||
new OO.ui.ButtonWidget( { | |||
id:'editThis-' + id, | |||
classes:['editThisBtn'], | |||
framed: false, | |||
flags: [ | |||
'progressive' | |||
], | |||
icon: 'edit', | |||
label: '题目有误?点击编辑本题' | |||
} ).$element.bind("click",function (){ | |||
editThis(id) | |||
}) | |||
) | |||
hoverTarget.hover(function () { | |||
buttonGroupObj.children('.editThisBtn').fadeIn(10) | |||
},function (){ | |||
buttonGroupObj.children('.editThisBtn').fadeOut(70) | |||
}) | |||
} | |||
return buttonGroupObj | |||
} | |||
//生成subject 的form, 顺序items顺序添加 (title, options, buttonGroup) | |||
function subjectFrom(id, items, title, options, buttonGroup){ | |||
var form = $('<form id="timuFrom-'+id+'" class="subjectForm"></form>') | |||
for(var i=0;i<items.length;i++){ | |||
form.append(items[i]) | |||
} | |||
return form | |||
} | |||
//resultGroup: answer和explain的显示框 | |||
function resultGroup(id, items, answerInline,explainInline){ | |||
var group = $('<div id="resultGroup-'+id+'" class="resultGroup"></div>') | |||
for(var i=0;i<items.length;i++){ | |||
group.append(items[i]) | |||
} | |||
return group | |||
} | |||
//生成answerInline | |||
function answerInline(answer){ | |||
return $('<div class="answerInline"><label>正确答案:</label>'+answer+'</div>') | |||
} | |||
//生成explainInline | |||
function explainInline(explain){ | |||
return $('<div class="explainInline"><label>解析:</label>'+explain+'</div>') | |||
} | |||
//生成填空输入框 | |||
function fillBlank(id, title, pos, classes){ | |||
console.log(pos) | |||
var posReg = new RegExp(pos,'g') | |||
var blankLen = title.match(posReg).length | |||
var split = title.split(posReg) | |||
console.log(blankLen) | |||
var newTitle = '' | |||
for(var i=0;i<(blankLen+split.length);i++){ | |||
if(i%2===0){ | |||
newTitle += '<p class="title">'+split[Math.floor(i/2)]+'</div>' | |||
}else{ | |||
newTitle += new OO.ui.TextInputWidget( { | |||
name:'textInput-'+id+'-'+Math.floor(i/2), | |||
id:'textInput-'+id+'-'+Math.floor(i/2), | |||
classes:classes | |||
} ).$element.prop('outerHTML') | |||
} | |||
} | |||
return newTitle | |||
} | |||
function newTimu(id,json, settings){ | |||
settings = json.settings===undefined||json.isA3 ? settings:json.settings//检测json是否带有settings或者是否为A3子题目 | |||
parent = settings.parent === undefined ? '' : settings.parent | |||
showHr = settings.showHr == undefined ? true : settings.showHr | |||
showSubmitBtn = settings.showSubmitBtn === undefined ? true : settings.showSubmitBtn | |||
showEditBtn = settings.showEditBtn === undefined ? true : settings.showEditBtn | |||
showBtnGroup = settings.showBtnGroup === undefined? true:settings.showBtnGroup | |||
var o = new Object() | var o = new Object() | ||
o.type = json.type | |||
//将choice | o.pos = json.pos | ||
if(typeOfObj( | o.inputBox = json.inputBox | ||
o.source = json.source | |||
o.sourceRange = json.sourceRange | |||
o.info = json.info | |||
o.title = json.title | |||
o.options = json.choices | |||
console.log(o.options) | |||
//将choice 统一为Array的转换为obj | |||
if(typeOfObj(o.options)==='[object Array]'&&o.options.length===1&&o.type!=='A3'){ | |||
o.options = o.options[0] | |||
} | } | ||
o.options = o.options!==undefined? cleanOptions(o.options):'' | |||
console.log(o.options) | |||
o.answer = json.answer | |||
o.explain = json.explain | |||
o.temp = { | o.temp = { | ||
main:$('<div name="timu-'+(id+1)+'" id="'+id+'" class="type'+type+' timuContainer"><p class="timuID">'+id+'</p></div>'), | main:$('<div name="timu-'+(id+1)+'" id="'+id+'" class="type'+o.type+' timuContainer"><p class="timuID">'+id+'</p></div>'), | ||
subject:$('< | subject:$('<form class="subject"></form>'), | ||
range:$('<div class="sourceRange"></div>'), | range:$('<div class="sourceRange"></div>'), | ||
info:$('<div class="info"></div>'), | info:$('<div class="info"></div>'), | ||
第112行: | 第277行: | ||
title:$('<p class="title"></p>'), | title:$('<p class="title"></p>'), | ||
options:$('<div class="options"></div>'), | options:$('<div class="options"></div>'), | ||
btn:$('<button class="button-small button-pill button button-caution" id="showSingle-' + id + '" class="showSingleBtn">提交</button>'), | btn:$('<button type="button" class="button-small button-pill button button-caution" id="showSingle-' + id + '" class="showSingleBtn">提交</button>'), | ||
editBtn:$('<a class="editThisButton" style="display:none;font-size: 14px;margin-left: 5px" href="javascript:void(0)"><span class="" id="editThis-' + id + '">题目有误?点击编辑本题</span></a>'), | editBtn:$('<a class="editThisButton" style="display:none;font-size: 14px;margin-left: 5px" href="javascript:void(0)"><span class="" id="editThis-' + id + '">题目有误?点击编辑本题</span></a>'), | ||
ansCon:$('<div id="ansContainer" class="ansContainer noDisplay"></div>'), | ansCon:$('<div id="ansContainer" class="ansContainer noDisplay"></div>'), | ||
第120行: | 第285行: | ||
subTitle:$('<div id=""></div>') | subTitle:$('<div id=""></div>') | ||
} | } | ||
o.parent = parent | o.parent = parent | ||
if( | // if(this.type==='A3'){ | ||
// $(this).children('.subject').children('.editThisButton').fadeIn(1) | |||
// } | |||
o.temp.main.hover(function () { | o.temp.main.hover(function () { | ||
$ | $('editThis-' + id).fadeIn(10) | ||
},function (){ | },function (){ | ||
$ | $('editThis-' + id).fadeOut(70) | ||
}) | }) | ||
o.A = function () { | o.A = function () { | ||
this | //subjectForm | ||
this. | var optionsGroupObj = optionsGroup(this.type, id, this.options) | ||
var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline') | |||
this. | var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):'' | ||
var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj]) | |||
var | //resultGroupObj | ||
var answerInlineObj = answerInline(this.answer) | |||
var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain) | |||
var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj]) | |||
this.temp.main.append(subjectForm,resultGroupObj) | |||
this. | |||
this.temp.main.append( | |||
if( | if(showHr){this.temp.main.append('<hr>')} | ||
return this.temp.main | return this.temp.main | ||
} | } | ||
o.A2 = function () { | o.A2 = function () { | ||
this | //subjectForm | ||
this. | var optionsGroupObj = optionsGroup(this.type, id, this.options) | ||
var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline') | |||
this. | var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main) | ||
var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj]) | |||
var | //resultGroupObj | ||
var answerInlineObj = answerInline(this.answer) | |||
var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain) | |||
var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj]) | |||
this.temp.main.append(subjectForm,resultGroupObj) | |||
this. | |||
this.temp.main.append( | |||
if( | if(showHr){this.temp.main.append('<hr>')} | ||
return this.temp.main | return this.temp.main | ||
} | } | ||
o.A3 = function () { | o.A3 = function () { | ||
console.log(settings) | |||
var realSource = getRealSource(json.source) | var realSource = getRealSource(json.source) | ||
//subjectForm | |||
var range = rangeInline(this.source, this.sourceRange) | |||
var info = infoInline(this.info) | |||
var | |||
this. | var subTitlesList = [] | ||
for(var i=0;i< | for(var i=0;i<this.title.length;i++){ | ||
if(this.explain[i]==undefined){ | |||
if( | this.explain[i] = '暂无解析' | ||
} | } | ||
var data = { | var data = { | ||
'isA3':true, | |||
"type":"A", | "type":"A", | ||
"source":prefix+ | "source":realSource.prefix+realSource.source+'-'+(i+1), | ||
"title": | "title":this.title[i], | ||
"answer": | "answer":this.answer[i], | ||
"explain": | "explain":this.explain[i], | ||
"choices": | "choices":this.options.get(i+''), | ||
} | } | ||
console.log(data) | |||
console.log(this.options) | |||
subTitlesList.push(newTimu(id+'-'+i,data,{ | |||
showHr:false, | |||
showEditBtn:false, | |||
showSubmitBtn:false, | |||
showBtnGroup:false | |||
}).A()) | |||
} | } | ||
console.log(this.answer) | |||
var buttonGroupObj = buttonGroup(true, false, id, this.type, this.answer, this.temp.main) | |||
console.log(buttonGroupObj) | |||
var subjectFormObj = subjectFrom(id, [subTitlesList,buttonGroupObj]) | |||
this.temp.main.append(range,info, subjectFormObj) | |||
this.temp.main.append( | |||
this.temp.main.append('<hr>') | |||
return this.temp.main | return this.temp.main | ||
} | } | ||
o.B = function () { | o.B = function () { | ||
var realSource = getRealSource(json.source) | var realSource = getRealSource(json.source) | ||
var | //subjectForm | ||
var range = rangeInline(this.source, this.sourceRange) | |||
var optionsGroupObj = optionsGroup(this.type, id, this.options) | |||
var | var titleInlineList = [] | ||
this.temp. | for(var i=0;i<this.title.length;i++){ | ||
var dropdown = dropDownInputWidget(id+'-'+i, mapKeysList(this.options)) | |||
var titleInlineObj = titleInline(id+'-'+i, this.type, json.source, i, this.title[i],'titleInline') | |||
titleInlineObj.append(dropdown) | |||
titleInlineList.push(titleInlineObj) | |||
} | |||
var titlesGroupObj = titlesGroup(titleInlineList) | |||
var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main) | |||
var subjectForm = subjectFrom(id, [optionsGroupObj, titlesGroupObj, buttonGroupObj]) | |||
//resultGroupObj | |||
var resultGroupList = [] | |||
for(var i=0;i<this.answer.length;i++){ | |||
var answerInlineObj = answerInline(this.answer[i]) | |||
var explainInlineObj = this.explain[i] === undefined || this.explain[i] === '' ? '暂无解析' : explainInline(this.explain[i]) | |||
resultGroupList.push( | |||
for(var i=0;i< | '<b>'+realSource.prefix+realSource.source+'-'+i+'</b>', | ||
var | $('<div style="margin-left:10px"></div>').append(answerInlineObj), | ||
var | $('<div style="margin-left:10px"></div>').append(explainInlineObj) | ||
) | |||
} | } | ||
var resultGroupObj = resultGroup(id, resultGroupList) | |||
this.temp. | this.temp.main.append(range ,subjectForm,resultGroupObj) | ||
if( | if(showHr){this.temp.main.append('<hr>')} | ||
return this.temp.main | return this.temp.main | ||
} | } | ||
o.C = function () { | o.C = function () { | ||
var realSource = getRealSource(json.source) | var realSource = getRealSource(json.source) | ||
var | //subjectForm | ||
var range = rangeInline(this.source, this.sourceRange) | |||
var optionsGroupObj = optionsGroup(this.type, id, this.options) | |||
var titleInlineList = [] | |||
for(var i=0;i<this.title.length;i++){ | |||
this.temp. | var dropdown = dropDownInputWidget(id+'-'+i, mapKeysList(this.options)) | ||
var titleInlineObj = titleInline(id+'-'+i, this.type, json.source, i, this.title[i],'titleInline') | |||
titleInlineObj.append(dropdown) | |||
titleInlineList.push(titleInlineObj) | |||
} | |||
var titlesGroupObj = titlesGroup(titleInlineList) | |||
var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main) | |||
var subjectForm = subjectFrom(id, [titlesGroupObj, optionsGroupObj, buttonGroupObj]) | |||
//resultGroupObj | |||
var resultGroupList = [] | |||
for(var i=0;i<this.answer.length;i++){ | |||
var answerInlineObj = answerInline(this.answer[i]) | |||
var explainInlineObj = this.explain[i] === undefined || this.explain[i] === '' ? '暂无解析' : explainInline(this.explain[i]) | |||
resultGroupList.push( | |||
for(var i=0;i< | '<b>'+realSource.prefix+realSource.source+'-'+i+'</b>', | ||
var | $('<div style="margin-left:10px"></div>').append(answerInlineObj), | ||
var | $('<div style="margin-left:10px"></div>').append(explainInlineObj) | ||
) | |||
} | } | ||
var resultGroupObj = resultGroup(id, resultGroupList) | |||
this.temp. | this.temp.main.append(range ,subjectForm,resultGroupObj) | ||
if( | if(showHr){this.temp.main.append('<hr>')} | ||
return this.temp.main | return this.temp.main | ||
} | } | ||
o.X = function () { | o.X = function () { | ||
this | //subjectForm | ||
this. | var optionsGroupObj = optionsGroup(this.type, id, this.options) | ||
var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline') | |||
this. | var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):'' | ||
var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj]) | |||
var | //resultGroupObj | ||
var answerInlineObj = answerInline(this.answer) | |||
var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain) | |||
var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj]) | |||
this.temp.main.append(subjectForm,resultGroupObj) | |||
this.temp.main.append( | |||
if( | if(showHr){this.temp.main.append('<hr>')} | ||
return this.temp.main | return this.temp.main | ||
} | } | ||
第344行: | 第464行: | ||
this.temp.explain.nextAll('.explain').html(json.explain) | this.temp.explain.nextAll('.explain').html(json.explain) | ||
var ans = '' | var ans = '' | ||
var ansOption = '' | |||
if(isInArray(dic.right, json.answer.toLowerCase())){ | if(isInArray(dic.right, json.answer.toLowerCase())){ | ||
ans = '正确' | ans = '正确' | ||
ansOption = 'A' | |||
}else if(isInArray(dic.wrong, json.answer.toLowerCase())){ | }else if(isInArray(dic.wrong, json.answer.toLowerCase())){ | ||
ans = '错误' | ans = '错误' | ||
ansOption = 'B' | |||
}else { | }else { | ||
ans = '系统错误:该判断题答案不符合标准格式' | ans = '系统错误:该判断题答案不符合标准格式' | ||
} | } | ||
if( | //subjectForm | ||
var option = new Map() | |||
option.set('A', '正确') | |||
option.set('B', '错误') | |||
var optionsGroupObj = optionsGroup(this.type, id, option) | |||
var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline') | |||
var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, 'A', ansOption, this.temp.main):'' | |||
var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj]) | |||
//resultGroupObj | |||
var answerInlineObj = answerInline(ans) | |||
var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain) | |||
var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj]) | |||
this.temp.main.append(subjectForm,resultGroupObj) | |||
if(showHr){this.temp.main.append('<hr>')} | |||
return this.temp.main | return this.temp.main | ||
} | } | ||
o.TK = function () { | o.TK = function () { | ||
this. | var tkTitle = fillBlank(id, this.title, this.pos, ['textInput-tk']) | ||
this. | var titleInlineObj = titleInline(id, this.type,this.source,undefined,tkTitle, 'titleInline-no-flex') | ||
titleInlineObj.children('.textInput-tk').each(function(i,v){ | |||
console.log(i,v) | |||
$(this).children('input').css( | |||
'display','inline' | |||
) | |||
$(this).children('input').css( | |||
} | 'width','200px' | ||
) | |||
}) | |||
var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):'' | |||
var subjectForm = subjectFrom(id, [titleInlineObj, buttonGroupObj]) | |||
this.temp.main.append(subjectForm) | |||
this.temp.main.append( | |||
if( | if(showHr){this.temp.main.append('<hr>')} | ||
return this.temp.main | return this.temp.main | ||
} | } | ||
o.MJ = function () { | o.MJ = function () { | ||
var mjTitle = '' | |||
this. | if(this.inputBox===0){ | ||
mjTitle = json.title + ':<span class="blur" tabindex="0" style="display:inline;outline=0;" onclick="">' + json.answer +'</span>' | |||
this. | }else{ | ||
mjTitle = fillBlank(id, this.title+':()', '()', ['textInput-mj']) | |||
this. | } | ||
var titleInlineObj = titleInline(id, this.type,this.source,undefined,mjTitle, 'titleInline-no-flex') | |||
titleInlineObj.children('.textInput-mj').each(function(i,v){ | |||
console.log(i,v) | |||
$(this).children('input').css( | |||
'display','inline' | |||
) | |||
$(this).children('input').css( | |||
'width','auto' | |||
) | |||
}) | |||
var buttonGroupObj = this.inputBox!==0 ? buttonGroup(showSubmitBtn, showEditBtn, id, 'TK', [this.answer], this.temp.main):'' | |||
var subjectForm = subjectFrom(id, [titleInlineObj, buttonGroupObj]) | |||
if( | this.temp.main.append(subjectForm) | ||
if(showHr){this.temp.main.append('<hr>')} | |||
return this.temp.main | return this.temp.main | ||
} | } | ||
return o | return o | ||
} | } | ||
function | |||
var | function getSelectedAnswer(id){ | ||
var data = formToJSON('#timuFrom-'+id,true) | |||
return data | |||
return | |||
} | } | ||
function | function showThisAnswer(id,type,correctAnswer){ | ||
var subjectCon = $('#'+id) | var subjectCon = $('#'+id) | ||
var titleCon = subjectCon.children('.subject').children('.titleContainer') | var titleCon = subjectCon.children('.subject').children('.titleContainer') | ||
var | var resultGroup = $('#resultGroup-'+id) | ||
resultGroup.fadeIn(100) | |||
var answers = subjectCon.children('.subject').children('.options') | var answers = subjectCon.children('.subject').children('.options') | ||
$('#showThisAnswer-'+id).fadeOut(1) | |||
if(type==="A" || type ==='A2'){ | if(type==="A" || type ==='A2'){ | ||
var | var optionGroupID = 'optionsGroup-'+id | ||
var | var optionInlinePrefixID = 'option-'+id | ||
var usersChoice = getSelectedAnswer(id)[optionGroupID] | |||
var | |||
var | var correctDivObj = $('#'+optionInlinePrefixID + '-' + correctAnswer) | ||
var usersChoiceDivObj = $('#'+optionInlinePrefixID + '-' + usersChoice) | |||
$('# | |||
if(usersChoice===correctAnswer){ | |||
if( | correctDivObj.addClass('correct') | ||
}else{ | }else{ | ||
correctDivObj.addClass('correct') | |||
usersChoiceDivObj.addClass('wrong') | |||
} | } | ||
}else if(type==='A3'){ | }else if(type==='A3'){ | ||
for(var i=0;i<correctAnswer.length;i++){ | |||
for(var i=0;i< | |||
//以下与A型题时一样的代码,知识用subID替换ID变量 | //以下与A型题时一样的代码,知识用subID替换ID变量 | ||
showThisAnswer(id+'-'+i,'A',correctAnswer[i]) | |||
} | } | ||
} else if(type==='B'){ | |||
var dropDownInputPrefix = 'dropdown-input-'+id +'-' | |||
var usersChoice = getSelectedAnswer(id) | |||
console.log(usersChoice) | |||
for(var i in usersChoice){ | |||
var dorpdownID = i.replace(dropDownInputPrefix,'')//获取子ID | |||
var subTimuID = id+'-'+dorpdownID | |||
var thisTimuUsersChoice = usersChoice[i] | |||
var | var thisTimuCorrectAnswer = correctAnswer[dorpdownID] | ||
var | var subTimuDiv = $('#title-'+subTimuID) | ||
if(thisTimuUsersChoice===thisTimuCorrectAnswer){ | |||
subTimuDiv.addClass('correct') | |||
}else{ | |||
subTimuDiv.addClass('wrong') | |||
subTimuDiv.append('<label class="answerTip">正确答案:'+thisTimuCorrectAnswer+'</label>') | |||
} | } | ||
} | |||
} | |||
} else if(type=="C"){ | } else if(type=="C"){ | ||
var dropDownInputPrefix = 'dropdown-input-'+id +'-' | |||
var usersChoice = getSelectedAnswer(id) | |||
console.log(usersChoice) | |||
for(var i in usersChoice){ | |||
var | var dorpdownID = i.replace(dropDownInputPrefix,'')//获取子ID | ||
var | var subTimuID = id+'-'+dorpdownID | ||
var thisTimuUsersChoice = usersChoice[i] | |||
var thisTimuCorrectAnswer = correctAnswer[dorpdownID] | |||
var subTimuDiv = $('#title-'+subTimuID) | |||
if(thisTimuUsersChoice===thisTimuCorrectAnswer){ | |||
subTimuDiv.addClass('correct') | |||
}else{ | |||
subTimuDiv.addClass('wrong') | |||
subTimuDiv.append('<label class="answerTip">正确答案:'+thisTimuCorrectAnswer+'</label>') | |||
} | } | ||
} | |||
} | |||
}else if(type=="X"){ | }else if(type=="X"){ | ||
var | var optionGroupID = 'optionsGroup-'+id | ||
var | var optionInlinePrefixID = 'option-'+id | ||
var usersChoice = getCheckBoxValue(optionGroupID).sort() | |||
correctAnswer = correctAnswer.match(/[A-Z]/g).sort() | |||
var lenCorrect = correctAnswer.length | |||
var lenUser = usersChoice.length | |||
console.log(correctAnswer) | |||
for(var i=0;i<lenUser;i++){ | |||
console.log(isInArray(correctAnswer, usersChoice[i]),usersChoice[i] ,correctAnswer) | |||
for(var i=0;i< | if(!isInArray(correctAnswer, usersChoice[i])){ | ||
$('#'+optionInlinePrefixID + '-' + usersChoice[i]).addClass('wrong') | |||
if( | |||
} | } | ||
} | } | ||
for(var i=0;i< | |||
for(var i=0;i<lenCorrect;i++){ | |||
if(!isInArray(usersChoice,correctAnswer[i])){ | |||
$(' | $('#'+optionInlinePrefixID + '-' + correctAnswer[i]).addClass('notChoiced') | ||
}else { | |||
$('#'+optionInlinePrefixID + '-' + correctAnswer[i]).addClass('correct') | |||
} | |||
} | } | ||
}else if(type=="TK"){ | }else if(type=="TK"){ | ||
var textInputPrefix = 'textInput-'+id+'-' | |||
var usersChoice = getSelectedAnswer(id) | |||
for(var i in usersChoice){ | |||
var inputID = i.replace(textInputPrefix,'') | |||
console.log('#'+i) | |||
var | var corrcetAnswerText = correctAnswer[inputID]===undefined?'暂无答案':correctAnswer[inputID] | ||
if(usersChoice[i]===correctAnswer[inputID]){ | |||
for(var i | $('#'+i).html('<label class="answerTip correct">'+corrcetAnswerText+'</label>') | ||
var | |||
if( | |||
$('< | |||
}else{ | }else{ | ||
$('< | $('#'+i).after('<label class="answerTip wrong">'+corrcetAnswerText+'</label>') | ||
} | } | ||
} | } | ||
第562行: | 第652行: | ||
function removeBackground(obj){ | function removeBackground(obj){ | ||
obj.addClass('no-background') | obj.addClass('no-background') | ||
} | |||
//DOM操作 | |||
//获取checkbox值 | |||
function getCheckBoxValue(name) { | |||
var ids = $('input:checkbox[name="'+name+'"]:checked'); | |||
var data = []; | |||
for (var i = 0; i < ids.length; i ++) { | |||
//利用三元运算符去点 | |||
data.push(ids[i].value) | |||
} | |||
return data | |||
} | |||
//将题目放在模板加载位置 | |||
function addAfterIDData(id,content) { | |||
var data = $('.data') | |||
content.insertAfter(data[id]) | |||
} | |||
//渲染题目 | |||
function render(id,type,obj,parent,isAfter){ | |||
parent =parent !==undefined ?parent : '#subjectContainer-'+type | |||
if(typeof(parent)!=='object'){ | |||
parent = $(parent) | |||
} | |||
if(isObjExist(parent)){ | |||
if(isAfter){ | |||
parent.after(obj) | |||
}else { | |||
obj.appendTo(parent) | |||
} | |||
}else { | |||
addAfterIDData(id,obj) | |||
} | |||
} | |||
//基础函数 | |||
//判断函数 | |||
function isObjExist(t){ | |||
return $(t).length>0 | |||
} | |||
function isInArray (arr, value) { | |||
for (var i = 0; i < arr.length; i++) { | |||
if (value === arr[i]) { | |||
return true | |||
} | |||
} | |||
return false | |||
} | |||
//数据查询函数 | |||
function dicLen(dic){ | |||
var count=0; | |||
for(var key in dic){ | |||
console.log(key+'='+dic[key]); | |||
count++; | |||
} | |||
return count | |||
} | |||
//html操作函数 | |||
function entityToString(entity){ | |||
var div=$('<div></div>'); | |||
div.html(entity) | |||
var res=div.html(); | |||
console.log(entity,'->',res); | |||
return res; | |||
} | |||
//获取map中键的列表 | |||
function mapKeysList(map){ | |||
return Array.from(map.keys()) | |||
} | |||
//数据清理 | |||
//去除字典中的空值 | |||
function filterEmptyEntries(dic){ | |||
console.log(Object.fromEntries( | |||
Object.entries(dic).filter(function(key, value){return value !== null && value !== undefined && value.length !== 0}) | |||
)) | |||
return Object.fromEntries( | |||
Object.entries(dic).filter(function(key, value){return value !== null && value !== undefined && value.length !== 0}) | |||
) | |||
} | |||
//排序字典并返回一个map对象 | |||
function sortDicByKey(dic){ | |||
var sort = Object.keys(dic).sort() | |||
var map = new Map() | |||
for(var i=0;i<sort.length;i++){ | |||
map.set(sort[i],dic[sort[i]]) | |||
} | |||
return map | |||
} | } |
2023年6月22日 (四) 16:48的版本
/*<%-- [PAGE_INFO]
comment = #Please do not remove this struct. It's record contains some important information of edit. This struct will be removed automatically after you push edits.#
pageTitle = #MediaWiki:Gadget-tikuRenderModule.js#
pageID = #3426#
revisionID = #69839#
contentModel = #javascript#
contentFormat = #text/javascript#
[END_PAGE_INFO] --%>*/
//主函数
function renderTimuFromSessionStorage(){
var timuList = gDomTimuList()
console.log(timuList)
var order = timuList.order
var timu = timuList.timu
var errors = timuList.errors
var repeatSource = timuList.repeatSource
for(var i=0;i<order.length;i++){
if(order[i].isError){
var errorWidget = new OO.ui.MessageWidget( {
type: 'error',
showClose:true,
label: 'id='+i+'的题目加载错误,错误信息:'+errors[i].info.name+':'+errors[i].info.message+'\n'+'对应文本:'+errors[i].dataText
} )
render(i,'A',$('<di></div>').append(errorWidget.$element,'<hr>'))
}else{
var dataJSON = timu[i].dataJSON
var o = newTimu(i,dataJSON,{})[dataJSON.type]()
render(i,dataJSON.type,o)
var needCheck = $('#noRepeatCheck').length<=0
if(repeatSource[i]!==undefined&&needCheck){
var warningWidget = new OO.ui.MessageWidget( {
type: 'warning',
label: '本题与本页面id为'+repeatSource[i]+'的题目source参数重复,本参数重复可能引起错误,请检查并修改!'
} )
render(i,'A',warningWidget.$element)
}
}
}
}
//题目渲染函数
//生成info
function infoInline(info){
return $('<div class="info">'+info+'</div>')
}
//单行题干的处理titleInline(type, source, title)
//生成titleGroup
function titlesGroup(titlesList){
var group = $('<div class="titlesGroup"></div>')
for(var i=0;i<titlesList.length;i++){
group.append(titlesList[i])
}
return group
}
//生成titleInline
function titleInline(id, type,originalSource, sourceSuffix,title, classes){
classes = classes===undefined?'':classes
return $('<div id="title-'+id+'" class="'+classes+'"></div>').append(
titleInlineType(type),
titleInlineSource(originalSource,sourceSuffix),
titleInlineTitle(title)
)
}
function titleInlineType(type){
var typeChinese = {
A:'A',
A2:'A2',
A3:'A3',
B:'B',
C:'C',
X:'X',
TK:'填空',
PD:'判断',
MJ:'名解'
}
return $('<p class="type">'+typeChinese[type]+'</p>')
}
//从有中文的source中提取最后一个连续数字作为真实的source
function getRealSource(source){
var getContinueNumber = source.match(/[0-9]+/g)
var splitContinueNumber = source.split(/[0-9]+/g)
var realSource = getContinueNumber[getContinueNumber.length-1]*1
var prefix = ''
for(var i=0;i<getContinueNumber.length;i++){
prefix += splitContinueNumber[i]
}
return {prefix:prefix,source:realSource}
}
//返回source的obj
function titleInlineSource(originalSource, suffix){
var realSource = getRealSource(originalSource)
var prefix = realSource.prefix
var source = realSource.source
var suffix = suffix === undefined ? '':'-'+suffix
return $('<p class="source">'+prefix+source+suffix+'</p>')
}
//返回sourceRange的obj
function rangeInline(originalSource, sourceRange, type){
var source = getRealSource(originalSource).source
var end = source*1+sourceRange*1 -1
var rangeText = '第 '+source +' 到 ' + end + ' 题'
var suffix = type==='B'?'共用备选答案':'共用题干'
return $('<div class="sourceRange">'+rangeText + suffix +'</div>')
}
//返回title 的 obj
function titleInlineTitle(title){
return $('<p class="title">'+title+'</p>')
}
//生成B、C型题的选择框
function dropDownInputWidget(id, availabelOptions){
var options = []
for(var i=0;i<availabelOptions.length;i++){
options.push({
data:availabelOptions[i],
label:availabelOptions[i]
})
}
return new OO.ui.DropdownInputWidget( {
name:'dropdown-input-'+id,
options: options,
classes:['dorpdown']
} ).$element
}
//生成options(options 是 Map对象)
function optionsGroup(type,id,options){
var flexClass = (type==='B')||(type==='C') ? 'optionsGroup-flex':''
var inputType = type==='X' ? 'checkbox':'radio'
var optionGroupObj = $('<div class="optionsGroup '+flexClass+'"></div>')
options.forEach(function(value, key, map){
optionGroupObj.append(optionInline(id, key, value, !((type==='B')||(type==='C')), inputType))
})
return optionGroupObj
}
//生成optionInline
function optionInline(id, option, content,input,inputType){
console.log(input)
var input = input ? $('<input id="option-input-'+id+'-'+option+'" name="optionsGroup-' + id + '" type="'+inputType+'" value="' + option + '" />'):''
var optionLabel = $('<label for="option-input-'+id+'-'+option+'">'+option+'. </label>')
var contentLabel = $('<label for="option-input-'+id+'-'+option+'">'+content+'</label>')
return $('<div id="option-'+id+'-'+option+'" class="optionInline"></div>').append(input,optionLabel,contentLabel)
}
//清理json中的choice(清除空项并排序),接收Obj,
function cleanOptions(options){
return sortDicByKey(filterEmptyEntries(options)) //返回一个 Map 对象
}
//生成buttonGroup
function buttonGroup(showSubmitBtn, showEditBtn, id, type, correctAnswer, hoverTarget){
console.log(showEditBtn)
var buttonGroupObj = $('<div class="buttonGroup"></div>')
if(showSubmitBtn){buttonGroupObj.append(
new OO.ui.ButtonWidget( {
id:'showThisAnswer-'+id,
label: '提交',
flags: [
'progressive'
]
} ).$element.bind("click",function (){
showThisAnswer(id,type,correctAnswer)
})
)}
if(showEditBtn){
buttonGroupObj.append(
// $('<a class="editThisBtn" style="" href="javascript:void(0)"><span class="" id="editThis-' + id + '">题目有误?点击编辑本题</span></a>'),
new OO.ui.ButtonWidget( {
id:'editThis-' + id,
classes:['editThisBtn'],
framed: false,
flags: [
'progressive'
],
icon: 'edit',
label: '题目有误?点击编辑本题'
} ).$element.bind("click",function (){
editThis(id)
})
)
hoverTarget.hover(function () {
buttonGroupObj.children('.editThisBtn').fadeIn(10)
},function (){
buttonGroupObj.children('.editThisBtn').fadeOut(70)
})
}
return buttonGroupObj
}
//生成subject 的form, 顺序items顺序添加 (title, options, buttonGroup)
function subjectFrom(id, items, title, options, buttonGroup){
var form = $('<form id="timuFrom-'+id+'" class="subjectForm"></form>')
for(var i=0;i<items.length;i++){
form.append(items[i])
}
return form
}
//resultGroup: answer和explain的显示框
function resultGroup(id, items, answerInline,explainInline){
var group = $('<div id="resultGroup-'+id+'" class="resultGroup"></div>')
for(var i=0;i<items.length;i++){
group.append(items[i])
}
return group
}
//生成answerInline
function answerInline(answer){
return $('<div class="answerInline"><label>正确答案:</label>'+answer+'</div>')
}
//生成explainInline
function explainInline(explain){
return $('<div class="explainInline"><label>解析:</label>'+explain+'</div>')
}
//生成填空输入框
function fillBlank(id, title, pos, classes){
console.log(pos)
var posReg = new RegExp(pos,'g')
var blankLen = title.match(posReg).length
var split = title.split(posReg)
console.log(blankLen)
var newTitle = ''
for(var i=0;i<(blankLen+split.length);i++){
if(i%2===0){
newTitle += '<p class="title">'+split[Math.floor(i/2)]+'</div>'
}else{
newTitle += new OO.ui.TextInputWidget( {
name:'textInput-'+id+'-'+Math.floor(i/2),
id:'textInput-'+id+'-'+Math.floor(i/2),
classes:classes
} ).$element.prop('outerHTML')
}
}
return newTitle
}
function newTimu(id,json, settings){
settings = json.settings===undefined||json.isA3 ? settings:json.settings//检测json是否带有settings或者是否为A3子题目
parent = settings.parent === undefined ? '' : settings.parent
showHr = settings.showHr == undefined ? true : settings.showHr
showSubmitBtn = settings.showSubmitBtn === undefined ? true : settings.showSubmitBtn
showEditBtn = settings.showEditBtn === undefined ? true : settings.showEditBtn
showBtnGroup = settings.showBtnGroup === undefined? true:settings.showBtnGroup
var o = new Object()
o.type = json.type
o.pos = json.pos
o.inputBox = json.inputBox
o.source = json.source
o.sourceRange = json.sourceRange
o.info = json.info
o.title = json.title
o.options = json.choices
console.log(o.options)
//将choice 统一为Array的转换为obj
if(typeOfObj(o.options)==='[object Array]'&&o.options.length===1&&o.type!=='A3'){
o.options = o.options[0]
}
o.options = o.options!==undefined? cleanOptions(o.options):''
console.log(o.options)
o.answer = json.answer
o.explain = json.explain
o.temp = {
main:$('<div name="timu-'+(id+1)+'" id="'+id+'" class="type'+o.type+' timuContainer"><p class="timuID">'+id+'</p></div>'),
subject:$('<form class="subject"></form>'),
range:$('<div class="sourceRange"></div>'),
info:$('<div class="info"></div>'),
titleCon:$('<div class="titleContainer"></div>'),
type:$('<p class="source"></p>'),
source:$('<p class="source"></p>'),
title:$('<p class="title"></p>'),
options:$('<div class="options"></div>'),
btn:$('<button type="button" class="button-small button-pill button button-caution" id="showSingle-' + id + '" class="showSingleBtn">提交</button>'),
editBtn:$('<a class="editThisButton" style="display:none;font-size: 14px;margin-left: 5px" href="javascript:void(0)"><span class="" id="editThis-' + id + '">题目有误?点击编辑本题</span></a>'),
ansCon:$('<div id="ansContainer" class="ansContainer noDisplay"></div>'),
correct:$('<p style="display:inline;"><b>正确答案:</b></p><p class="correctAnswer"></p><br>'),
explain:$('<p style="display:inline;"><b>解析: </b></p><p class="explain"></p><br>'),
select:$('<select class="button-small button-rounded button"></select>'),
subTitle:$('<div id=""></div>')
}
o.parent = parent
// if(this.type==='A3'){
// $(this).children('.subject').children('.editThisButton').fadeIn(1)
// }
o.temp.main.hover(function () {
$('editThis-' + id).fadeIn(10)
},function (){
$('editThis-' + id).fadeOut(70)
})
o.A = function () {
//subjectForm
var optionsGroupObj = optionsGroup(this.type, id, this.options)
var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')
var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):''
var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])
//resultGroupObj
var answerInlineObj = answerInline(this.answer)
var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)
var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])
this.temp.main.append(subjectForm,resultGroupObj)
if(showHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.A2 = function () {
//subjectForm
var optionsGroupObj = optionsGroup(this.type, id, this.options)
var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')
var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main)
var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])
//resultGroupObj
var answerInlineObj = answerInline(this.answer)
var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)
var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])
this.temp.main.append(subjectForm,resultGroupObj)
if(showHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.A3 = function () {
console.log(settings)
var realSource = getRealSource(json.source)
//subjectForm
var range = rangeInline(this.source, this.sourceRange)
var info = infoInline(this.info)
var subTitlesList = []
for(var i=0;i<this.title.length;i++){
if(this.explain[i]==undefined){
this.explain[i] = '暂无解析'
}
var data = {
'isA3':true,
"type":"A",
"source":realSource.prefix+realSource.source+'-'+(i+1),
"title":this.title[i],
"answer":this.answer[i],
"explain":this.explain[i],
"choices":this.options.get(i+''),
}
console.log(data)
console.log(this.options)
subTitlesList.push(newTimu(id+'-'+i,data,{
showHr:false,
showEditBtn:false,
showSubmitBtn:false,
showBtnGroup:false
}).A())
}
console.log(this.answer)
var buttonGroupObj = buttonGroup(true, false, id, this.type, this.answer, this.temp.main)
console.log(buttonGroupObj)
var subjectFormObj = subjectFrom(id, [subTitlesList,buttonGroupObj])
this.temp.main.append(range,info, subjectFormObj)
this.temp.main.append('<hr>')
return this.temp.main
}
o.B = function () {
var realSource = getRealSource(json.source)
//subjectForm
var range = rangeInline(this.source, this.sourceRange)
var optionsGroupObj = optionsGroup(this.type, id, this.options)
var titleInlineList = []
for(var i=0;i<this.title.length;i++){
var dropdown = dropDownInputWidget(id+'-'+i, mapKeysList(this.options))
var titleInlineObj = titleInline(id+'-'+i, this.type, json.source, i, this.title[i],'titleInline')
titleInlineObj.append(dropdown)
titleInlineList.push(titleInlineObj)
}
var titlesGroupObj = titlesGroup(titleInlineList)
var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main)
var subjectForm = subjectFrom(id, [optionsGroupObj, titlesGroupObj, buttonGroupObj])
//resultGroupObj
var resultGroupList = []
for(var i=0;i<this.answer.length;i++){
var answerInlineObj = answerInline(this.answer[i])
var explainInlineObj = this.explain[i] === undefined || this.explain[i] === '' ? '暂无解析' : explainInline(this.explain[i])
resultGroupList.push(
'<b>'+realSource.prefix+realSource.source+'-'+i+'</b>',
$('<div style="margin-left:10px"></div>').append(answerInlineObj),
$('<div style="margin-left:10px"></div>').append(explainInlineObj)
)
}
var resultGroupObj = resultGroup(id, resultGroupList)
this.temp.main.append(range ,subjectForm,resultGroupObj)
if(showHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.C = function () {
var realSource = getRealSource(json.source)
//subjectForm
var range = rangeInline(this.source, this.sourceRange)
var optionsGroupObj = optionsGroup(this.type, id, this.options)
var titleInlineList = []
for(var i=0;i<this.title.length;i++){
var dropdown = dropDownInputWidget(id+'-'+i, mapKeysList(this.options))
var titleInlineObj = titleInline(id+'-'+i, this.type, json.source, i, this.title[i],'titleInline')
titleInlineObj.append(dropdown)
titleInlineList.push(titleInlineObj)
}
var titlesGroupObj = titlesGroup(titleInlineList)
var buttonGroupObj = buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main)
var subjectForm = subjectFrom(id, [titlesGroupObj, optionsGroupObj, buttonGroupObj])
//resultGroupObj
var resultGroupList = []
for(var i=0;i<this.answer.length;i++){
var answerInlineObj = answerInline(this.answer[i])
var explainInlineObj = this.explain[i] === undefined || this.explain[i] === '' ? '暂无解析' : explainInline(this.explain[i])
resultGroupList.push(
'<b>'+realSource.prefix+realSource.source+'-'+i+'</b>',
$('<div style="margin-left:10px"></div>').append(answerInlineObj),
$('<div style="margin-left:10px"></div>').append(explainInlineObj)
)
}
var resultGroupObj = resultGroup(id, resultGroupList)
this.temp.main.append(range ,subjectForm,resultGroupObj)
if(showHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.X = function () {
//subjectForm
var optionsGroupObj = optionsGroup(this.type, id, this.options)
var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')
var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):''
var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])
//resultGroupObj
var answerInlineObj = answerInline(this.answer)
var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)
var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])
this.temp.main.append(subjectForm,resultGroupObj)
if(showHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.PD = function () {
var dic = {
right: ['对', '正确', 't', '✓', '√', '1', 'true'],
wrong: ['错', '错误', '×', 'x', 'f', 'false', 'wrong', '0']
}
this.temp.type.text('判断')
this.temp.source.text(json.source)
this.temp.title.html(json.title)
this.temp.explain.nextAll('.explain').html(json.explain)
var ans = ''
var ansOption = ''
if(isInArray(dic.right, json.answer.toLowerCase())){
ans = '正确'
ansOption = 'A'
}else if(isInArray(dic.wrong, json.answer.toLowerCase())){
ans = '错误'
ansOption = 'B'
}else {
ans = '系统错误:该判断题答案不符合标准格式'
}
//subjectForm
var option = new Map()
option.set('A', '正确')
option.set('B', '错误')
var optionsGroupObj = optionsGroup(this.type, id, option)
var titleInlineObj = titleInline(id, this.type,this.source,undefined,this.title,'titleInline')
var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, 'A', ansOption, this.temp.main):''
var subjectForm = subjectFrom(id, [titleInlineObj, optionsGroupObj, buttonGroupObj])
//resultGroupObj
var answerInlineObj = answerInline(ans)
var explainInlineObj = this.explain === undefined || this.explain === '' ? '暂无解析' : explainInline(this.explain)
var resultGroupObj = resultGroup(id, [answerInlineObj, explainInlineObj])
this.temp.main.append(subjectForm,resultGroupObj)
if(showHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.TK = function () {
var tkTitle = fillBlank(id, this.title, this.pos, ['textInput-tk'])
var titleInlineObj = titleInline(id, this.type,this.source,undefined,tkTitle, 'titleInline-no-flex')
titleInlineObj.children('.textInput-tk').each(function(i,v){
console.log(i,v)
$(this).children('input').css(
'display','inline'
)
$(this).children('input').css(
'width','200px'
)
})
var buttonGroupObj = showBtnGroup? buttonGroup(showSubmitBtn, showEditBtn, id, this.type, this.answer, this.temp.main):''
var subjectForm = subjectFrom(id, [titleInlineObj, buttonGroupObj])
this.temp.main.append(subjectForm)
if(showHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.MJ = function () {
var mjTitle = ''
if(this.inputBox===0){
mjTitle = json.title + ':<span class="blur" tabindex="0" style="display:inline;outline=0;" onclick="">' + json.answer +'</span>'
}else{
mjTitle = fillBlank(id, this.title+':()', '()', ['textInput-mj'])
}
var titleInlineObj = titleInline(id, this.type,this.source,undefined,mjTitle, 'titleInline-no-flex')
titleInlineObj.children('.textInput-mj').each(function(i,v){
console.log(i,v)
$(this).children('input').css(
'display','inline'
)
$(this).children('input').css(
'width','auto'
)
})
var buttonGroupObj = this.inputBox!==0 ? buttonGroup(showSubmitBtn, showEditBtn, id, 'TK', [this.answer], this.temp.main):''
var subjectForm = subjectFrom(id, [titleInlineObj, buttonGroupObj])
this.temp.main.append(subjectForm)
if(showHr){this.temp.main.append('<hr>')}
return this.temp.main
}
return o
}
function getSelectedAnswer(id){
var data = formToJSON('#timuFrom-'+id,true)
return data
}
function showThisAnswer(id,type,correctAnswer){
var subjectCon = $('#'+id)
var titleCon = subjectCon.children('.subject').children('.titleContainer')
var resultGroup = $('#resultGroup-'+id)
resultGroup.fadeIn(100)
var answers = subjectCon.children('.subject').children('.options')
$('#showThisAnswer-'+id).fadeOut(1)
if(type==="A" || type ==='A2'){
var optionGroupID = 'optionsGroup-'+id
var optionInlinePrefixID = 'option-'+id
var usersChoice = getSelectedAnswer(id)[optionGroupID]
var correctDivObj = $('#'+optionInlinePrefixID + '-' + correctAnswer)
var usersChoiceDivObj = $('#'+optionInlinePrefixID + '-' + usersChoice)
if(usersChoice===correctAnswer){
correctDivObj.addClass('correct')
}else{
correctDivObj.addClass('correct')
usersChoiceDivObj.addClass('wrong')
}
}else if(type==='A3'){
for(var i=0;i<correctAnswer.length;i++){
//以下与A型题时一样的代码,知识用subID替换ID变量
showThisAnswer(id+'-'+i,'A',correctAnswer[i])
}
} else if(type==='B'){
var dropDownInputPrefix = 'dropdown-input-'+id +'-'
var usersChoice = getSelectedAnswer(id)
console.log(usersChoice)
for(var i in usersChoice){
var dorpdownID = i.replace(dropDownInputPrefix,'')//获取子ID
var subTimuID = id+'-'+dorpdownID
var thisTimuUsersChoice = usersChoice[i]
var thisTimuCorrectAnswer = correctAnswer[dorpdownID]
var subTimuDiv = $('#title-'+subTimuID)
if(thisTimuUsersChoice===thisTimuCorrectAnswer){
subTimuDiv.addClass('correct')
}else{
subTimuDiv.addClass('wrong')
subTimuDiv.append('<label class="answerTip">正确答案:'+thisTimuCorrectAnswer+'</label>')
}
}
} else if(type=="C"){
var dropDownInputPrefix = 'dropdown-input-'+id +'-'
var usersChoice = getSelectedAnswer(id)
console.log(usersChoice)
for(var i in usersChoice){
var dorpdownID = i.replace(dropDownInputPrefix,'')//获取子ID
var subTimuID = id+'-'+dorpdownID
var thisTimuUsersChoice = usersChoice[i]
var thisTimuCorrectAnswer = correctAnswer[dorpdownID]
var subTimuDiv = $('#title-'+subTimuID)
if(thisTimuUsersChoice===thisTimuCorrectAnswer){
subTimuDiv.addClass('correct')
}else{
subTimuDiv.addClass('wrong')
subTimuDiv.append('<label class="answerTip">正确答案:'+thisTimuCorrectAnswer+'</label>')
}
}
}else if(type=="X"){
var optionGroupID = 'optionsGroup-'+id
var optionInlinePrefixID = 'option-'+id
var usersChoice = getCheckBoxValue(optionGroupID).sort()
correctAnswer = correctAnswer.match(/[A-Z]/g).sort()
var lenCorrect = correctAnswer.length
var lenUser = usersChoice.length
console.log(correctAnswer)
for(var i=0;i<lenUser;i++){
console.log(isInArray(correctAnswer, usersChoice[i]),usersChoice[i] ,correctAnswer)
if(!isInArray(correctAnswer, usersChoice[i])){
$('#'+optionInlinePrefixID + '-' + usersChoice[i]).addClass('wrong')
}
}
for(var i=0;i<lenCorrect;i++){
if(!isInArray(usersChoice,correctAnswer[i])){
$('#'+optionInlinePrefixID + '-' + correctAnswer[i]).addClass('notChoiced')
}else {
$('#'+optionInlinePrefixID + '-' + correctAnswer[i]).addClass('correct')
}
}
}else if(type=="TK"){
var textInputPrefix = 'textInput-'+id+'-'
var usersChoice = getSelectedAnswer(id)
for(var i in usersChoice){
var inputID = i.replace(textInputPrefix,'')
console.log('#'+i)
var corrcetAnswerText = correctAnswer[inputID]===undefined?'暂无答案':correctAnswer[inputID]
if(usersChoice[i]===correctAnswer[inputID]){
$('#'+i).html('<label class="answerTip correct">'+corrcetAnswerText+'</label>')
}else{
$('#'+i).after('<label class="answerTip wrong">'+corrcetAnswerText+'</label>')
}
}
}
}
function removeBackground(obj){
obj.addClass('no-background')
}
//DOM操作
//获取checkbox值
function getCheckBoxValue(name) {
var ids = $('input:checkbox[name="'+name+'"]:checked');
var data = [];
for (var i = 0; i < ids.length; i ++) {
//利用三元运算符去点
data.push(ids[i].value)
}
return data
}
//将题目放在模板加载位置
function addAfterIDData(id,content) {
var data = $('.data')
content.insertAfter(data[id])
}
//渲染题目
function render(id,type,obj,parent,isAfter){
parent =parent !==undefined ?parent : '#subjectContainer-'+type
if(typeof(parent)!=='object'){
parent = $(parent)
}
if(isObjExist(parent)){
if(isAfter){
parent.after(obj)
}else {
obj.appendTo(parent)
}
}else {
addAfterIDData(id,obj)
}
}
//基础函数
//判断函数
function isObjExist(t){
return $(t).length>0
}
function isInArray (arr, value) {
for (var i = 0; i < arr.length; i++) {
if (value === arr[i]) {
return true
}
}
return false
}
//数据查询函数
function dicLen(dic){
var count=0;
for(var key in dic){
console.log(key+'='+dic[key]);
count++;
}
return count
}
//html操作函数
function entityToString(entity){
var div=$('<div></div>');
div.html(entity)
var res=div.html();
console.log(entity,'->',res);
return res;
}
//获取map中键的列表
function mapKeysList(map){
return Array.from(map.keys())
}
//数据清理
//去除字典中的空值
function filterEmptyEntries(dic){
console.log(Object.fromEntries(
Object.entries(dic).filter(function(key, value){return value !== null && value !== undefined && value.length !== 0})
))
return Object.fromEntries(
Object.entries(dic).filter(function(key, value){return value !== null && value !== undefined && value.length !== 0})
)
}
//排序字典并返回一个map对象
function sortDicByKey(dic){
var sort = Object.keys(dic).sort()
var map = new Map()
for(var i=0;i<sort.length;i++){
map.set(sort[i],dic[sort[i]])
}
return map
}