注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:按 Ctrl-F5。
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 = eval('newTimu('+i+','+JSON.stringify(dataJSON)+',true).'+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)
}
}
}
}
function entityToString(entity){
var div=$('<div></div>');
div.html(entity)
var res=div.html();
console.log(entity,'->',res);
return res;
}
function addAfterIDData(id,content) {
var data = $('.data')
content.insertAfter(data[id])
}
function isObjExist(t){
return $(t).length>0
}
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 isInArray (arr, value) {
for (let 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
}
//从有中文的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}
}
function newTimu(id,json,editButton,hideButton,addHr,parent){
parent = parent !== undefined ? parent : ''
if(addHr===undefined){addHr=true}
if(hideButton===undefined){hideButton=false}
var type = json.type
var o = new Object()
//将choice 统一为Array的转换
if(typeOfObj(json.choices)==='[object Array]'&&json.choices.length===1&&type!=='A3'){
json.choices = json.choices[0]
}
o.temp = {
main:$('<div name="timu-'+(id+1)+'" id="'+id+'" class="type'+type+' timuContainer"><p class="timuID">'+id+'</p></div>'),
subject:$('<div class="subject"></div>'),
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 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.hideButton = hideButton
o.parent = parent
if(type!=='A3'&&type!=='PD'){
o.temp.btn.bind("click",function (){
showChoiceAnswer(id,type,json.answer)
})
}
o.temp.editBtn.bind("click",function (){
editThis(id)
})
if(type==='A3'){
$(this).children('.subject').children('.editThisButton').fadeIn(1)
}
o.temp.main.hover(function () {
$(this).children('.subject').children('.editThisButton').fadeIn(10)
},function (){
$(this).children('.subject').children('.editThisButton').fadeOut(70)
})
if(!editButton){
o.temp.editBtn = $('')
}
o.A = function () {
this.temp.type.text(json.type)
this.temp.source.text(json.source)
this.temp.title.html(json.title)
this.temp.correct.nextAll('.correctAnswer').html(json.answer)
this.temp.explain.nextAll('.explain').html(json.explain)
var options = formatAnsDic(json.choices)
for(var k in options) {
var label = '<label id="' + k + '"><input name="singelChoice-' + id + '" type="radio" value="' + k + '" />' + k + ':' + options[k] + '</label>'
this.temp.options.append(label)
}
this.temp.titleCon.append(this.temp.type,this.temp.source,this.temp.title)
this.temp.ansCon.append(this.temp.correct,this.temp.explain)
this.temp.subject.append(this.temp.titleCon,this.temp.options)
if(!hideButton){this.temp.subject.append(this.temp.btn,this.temp.editBtn)}
this.temp.main.append(this.temp.subject,this.temp.ansCon)
if(addHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.A2 = function () {
this.temp.type.text(json.type)
this.temp.source.text(json.source)
this.temp.title.html(json.title)
this.temp.correct.nextAll('.correctAnswer').html(json.answer)
this.temp.explain.nextAll('.explain').html(json.explain)
var options = formatAnsDic(json.choices)
for(var k in options) {
var label = '<label id="' + k + '"><input name="singelChoice-' + id + '" type="radio" value="' + k + '" />' + k + ':' + options[k] + '</label>'
this.temp.options.append(label)
}
this.temp.titleCon.append(this.temp.type,this.temp.source,this.temp.title)
this.temp.ansCon.append(this.temp.correct,this.temp.explain)
this.temp.subject.append(this.temp.titleCon,this.temp.options)
if(!hideButton){this.temp.subject.append(this.temp.btn,this.temp.editBtn)}
this.temp.main.append(this.temp.subject,this.temp.ansCon)
if(addHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.A3 = function () {
var subIDs = []
//由于source可能有前后缀,因此提取其中靠后连续数字作为真正的source
var realSource = getRealSource(json.source)
var prefix = realSource.prefix
json.source = realSource.source
var s = json.source*1;var e = json.source*1+json.sourceRange*1 -1
this.temp.range.text('第 '+s+' 到 '+e+' 题')
for(var i=0;i<json.title.length;i++){
subIDs.push(id+'-'+i)
if(json.explain[i]==undefined){
json.explain[i] = '暂无解析'
}
var data = {
"type":"A",
"source":prefix+s+'-'+(i+1),
"title":json.title[i],
"answer":json.answer[i],
"explain":json.explain[i],
"choices":json.choices[i],
}
var newA = newTimu(id+'-'+i,data,false, true,false).A()
render(id+'-'+i,'A',newA,this.temp.titleCon)
}
o.temp.btn.bind("click",function (){
showChoiceAnswer(subIDs,type,json.answer)
})
this.temp.info.text(json.info)
this.temp.subject.append(this.temp.range,this.temp.info,this.temp.titleCon)
if(!hideButton){this.temp.subject.append(this.temp.btn)}
this.temp.main.append(this.temp.subject)
if(addHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.B = function () {
this.temp.type.text(json.type)
//由于source可能有前后缀,因此提取其中靠后连续数字作为真正的source
var realSource = getRealSource(json.source)
var prefix = realSource.prefix
json.source = realSource.source
var s = json.source*1;var e = json.source*1+json.sourceRange*1 -1
this.temp.range.text('第 '+s+' 到 '+e+' 题')
var options = formatAnsDic(json.choices)
for(var k in options){
var label = '<li id="'+k+'">'+k+':'+options[k]+'</li>'
this.temp.options.append(label)
this.temp.select.append('<option value="'+k+'">'+k+'</option>')
}
for(var i=0;i<json.title.length;i++){
var reg1 = /\(\)/g
var text = json.title[i]
if(reg1.test(text)){
text = text.replace("()",this.temp.select.prop("outerHTML"))
}else{
text += this.temp.select.prop("outerHTML")
}
this.temp.subTitle.attr('id',id+'-'+i)
this.temp.source.text(prefix+s+'-'+(i+1))
this.temp.subTitle.html(this.temp.source.prop("outerHTML")+text)
this.temp.titleCon.append(this.temp.subTitle.prop("outerHTML"))
}
for(var i=0;i<json.answer.length;i++){
this.temp.correct.nextAll('.correctAnswer').append('<p id="ans-'+id +'-'+i+'">'+(s+i)+':'+json.answer[i]+'</p>')
this.temp.correct.nextAll('p').each(function () {
$(this).css('display','none')
})
}
for(var i=0;i<json.explain.length;i++){
this.temp.explain.nextAll('.explain').append('<p id="exp-'+id +'-'+i+'">'+(s+i)+':'+json.explain[i]+'</p>')
}
this.temp.subject.append(this.temp.range,this.temp.options,this.temp.titleCon)
if(!hideButton){this.temp.subject.append(this.temp.btn,this.temp.editBtn)}
this.temp.ansCon.append(this.temp.correct,this.temp.explain)
this.temp.main.append(this.temp.subject,this.temp.ansCon)
if(addHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.C = function () {
this.temp.type.text(json.type)
//由于source可能有前后缀,因此提取其中靠后连续数字作为真正的source
var realSource = getRealSource(json.source)
var prefix = realSource.prefix
json.source = realSource.source
var s = json.source*1;var e = json.source*1+json.sourceRange*1 -1
this.temp.range.text('第 '+s+' 到 '+e+' 题')
var options = formatAnsDic(json.choices)
for(var k in options){
var label = '<li id="'+k+'">'+k+':'+options[k]+'</li>'
this.temp.options.append(label)
this.temp.select.append('<option value="'+k+'">'+k+'</option>')
}
for(var i=0;i<json.title.length;i++){
var reg1 = /\(\)/g
var text = json.title[i]
if(reg1.test(text)){
text = text.replace("()",this.temp.select.prop("outerHTML"))
}else{
text += this.temp.select.prop("outerHTML")
}
this.temp.subTitle.attr('id',id+'-'+i)
this.temp.source.text(prefix+s+'-'+(i+1))
this.temp.subTitle.html(this.temp.source.prop("outerHTML")+text)
this.temp.titleCon.append(this.temp.subTitle.prop("outerHTML"))
}
for(var i=0;i<json.answer.length;i++){
this.temp.correct.nextAll('.correctAnswer').append('<p id="ans-'+id +'-'+i+'">'+(s+i)+':'+json.answer[i]+'</p>')
this.temp.correct.nextAll('p').each(function () {
$(this).css('display','none')
})
}
for(var i=0;i<json.explain.length;i++){
this.temp.explain.nextAll('.explain').append('<p id="exp-'+id +'-'+i+'">'+(s+i)+':'+json.explain[i]+'</p>')
}
this.temp.subject.append(this.temp.range,this.temp.titleCon,this.temp.options)
if(!hideButton){this.temp.subject.append(this.temp.btn,this.temp.editBtn)}
this.temp.ansCon.append(this.temp.correct,this.temp.explain)
this.temp.main.append(this.temp.subject,this.temp.ansCon)
if(addHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.X = function () {
this.temp.type.text(json.type)
this.temp.source.text(json.source)
this.temp.title.html(json.title)
this.temp.correct.nextAll('.correctAnswer').html(json.answer)
this.temp.explain.nextAll('.explain').html(json.explain)
var options = formatAnsDic(json.choices)
for(var k in options){
var label = '<label id="'+k+'"><input name="singelChoice-'+id+'" type="checkbox" value="'+k+'" />'+k+':'+options[k]+'</label>'
this.temp.options.append(label)
}
this.temp.titleCon.append(this.temp.type,this.temp.source,this.temp.title)
this.temp.ansCon.append(this.temp.correct,this.temp.explain)
this.temp.subject.append(this.temp.titleCon,this.temp.options)
if(!hideButton){this.temp.subject.append(this.temp.btn,this.temp.editBtn)}
this.temp.main.append(this.temp.subject,this.temp.ansCon)
if(addHr){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 = ''
if(isInArray(dic.right, json.answer.toLowerCase())){
ans = '正确'
}else if(isInArray(dic.wrong, json.answer.toLowerCase())){
ans = '错误'
}else {
ans = '系统错误:该判断题答案不符合标准格式'
}
this.temp.correct.nextAll('.correctAnswer').html(ans)
o.temp.btn.bind("click",function (){
showChoiceAnswer(id,'A',ans)
})
this.temp.options.append('<label id="正确" style="display: inline;"><input name="singelChoice-'+id+'" type="radio" value="正确" />正确</label>' +
'<label id="错误" style="display: inline;"><input name="singelChoice-'+id+'" type="radio" value="错误" />错误</label>')
this.temp.titleCon.append(this.temp.type,this.temp.source,this.temp.title)
this.temp.ansCon.append(this.temp.correct,this.temp.explain)
this.temp.subject.append(this.temp.titleCon,this.temp.options)
if(!hideButton){this.temp.subject.append(this.temp.btn,this.temp.editBtn)}
this.temp.main.append(this.temp.subject,this.temp.ansCon)
if(addHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.TK = function () {
this.temp.type.text('填空')
this.temp.source.text(json.source)
var form = $('<form id="form-'+id+'" class="title"></form>')
var pos = json.pos
var posReg = new RegExp(pos,'g')
console.log(posReg)
var posCount = json.title.match(posReg).length
for(var i=0;i<posCount;i++){
json.title = json.title.replace(pos,'<input name="'+id+'-'+i+'" id="'+id+'-'+i+'" type="text" form="form-'+id+'"/>')
}
form.html(json.title)
this.temp.title.html(json.title)
this.temp.correct.nextAll('.correctAnswer').html(json.answer)
this.temp.explain.nextAll('.explain').html(json.explain)
this.temp.titleCon.append(this.temp.type,this.temp.source,form)
this.temp.ansCon.append(this.temp.correct,this.temp.explain)
this.temp.subject.append(this.temp.titleCon,this.temp.options)
if(!hideButton){this.temp.subject.append(this.temp.btn,this.temp.editBtn)}
this.temp.main.append(this.temp.subject,this.temp.ansCon)
if(addHr){this.temp.main.append('<hr>')}
return this.temp.main
}
o.MJ = function () {
this.temp.type.text('名解')
this.temp.source.text(json.source)
this.temp.title.html(json.title + ':<span class="blur" tabindex="0" style="display:inline;outline=0;" onclick="">' + json.answer +'</span>')
this.temp.titleCon.append(this.temp.type,this.temp.source,this.temp.title)
this.temp.subject.append(this.temp.titleCon,this.temp.options)
this.temp.main.append(this.temp.subject)
if(addHr){this.temp.main.append('<hr>')}
return this.temp.main
}
return o
}
function formatAnsDic(d) {
var c = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
var dic = {}
for(var i=0;i<c.length;i++){
if(d[c[i]]===undefined){d[c[i]]=''}
if(d[c[i]].length>0){
dic[c[i]] = d[c[i]]
}
}
return dic
}
function showChoiceAnswer(id,type,correctAnswer){
var subjectCon = $('#'+id)
var titleCon = subjectCon.children('.subject').children('.titleContainer')
var ansCon = subjectCon.children('.ansContainer')
var answers = subjectCon.children('.subject').children('.options')
console.log(correctAnswer)
if(type==="A" || type ==='A2'){
var correctAnsText = correctAnswer
var choice = $('input[name="singelChoice-'+id+'"]:checked').val();
console.log(choice)
var showCorrect = answers.children('#'+correctAnsText)
var showChoice = answers.children('#'+choice)
console.log('#showSingle-'+id)
$('#showSingle-'+id).fadeOut(1)
ansCon.fadeIn(100)
if(choice===correctAnsText){
showCorrect.addClass('correct')
}else{
showCorrect.addClass('correct')
showChoice.addClass('wrong')
}
setTimeout(function (){
removeBackground(showChoice)
removeBackground(showCorrect)
}, 4000);
setTimeout(function (){
showCorrect.removeClass('no-background')
showChoice.removeClass('no-background')
showCorrect.removeClass('correct')
showChoice.removeClass('wrong')
}, 5000);
}else if(type==='A3'){
$('#showSingle-'+id).fadeOut(1)
for(var i=0;i<id.length;i++){
var subID = id[i]
var mainID = subID.split('-')[0]
console.log(subID)
console.log(mainID)
subjectCon = $('#'+ id[i])
titleCon = subjectCon.children('.subject').children('.titleContainer')
ansCon = subjectCon.children('.ansContainer')
answers = subjectCon.children('.subject').children('.options')
$('#showSingle-'+id).fadeOut(1)
var correctAns= correctAnswer[i]
//以下与A型题时一样的代码,知识用subID替换ID变量
showChoiceAnswer(subID,'A',correctAns)
}
} else if(type==='B'){
console.log(titleCon)
titleCon.children('div').each(function (index,i){
console.log(i)
var subTitleID = $(i).attr('id')
var ans = correctAnswer[index]
var choice = $('#'+id+'-'+index).find("option:selected").text();
$('#showSingle-'+id).fadeOut(1)
ansCon.fadeIn(100)
console.log(choice)
if(choice==ans){
$('#'+id+'-'+index).addClass('correct')
}else {
$('#'+id+'-'+index).addClass('wrong')
$('<p class="answerTip">正确答案:'+ans+'</p>').appendTo($('#'+id+'-'+index))
}
setTimeout(function (){
$('#'+id+'-'+index).removeClass('correct')
$('#'+id+'-'+index).removeClass('wrong')
}, 5000);
})
} else if(type=="C"){
console.log(titleCon)
$('#showSingle-'+id).fadeOut(1)
ansCon.fadeIn(100)
titleCon.children('div').each(function (index,i){
console.log(i)
var subTitleID = $(i).attr('id')
var ans = correctAnswer[index]
var choice = $('#'+id+'-'+index).find("option:selected").text();
console.log(choice)
if(choice==ans){
$('#'+id+'-'+index).addClass('correct')
}else {
$('#'+id+'-'+index).addClass('wrong')
$('<p class="answerTip">正确答案:'+ans+'</p>').appendTo($('#'+id+'-'+index))
}
setTimeout(function (){
$('#'+id+'-'+index).removeClass('correct')
$('#'+id+'-'+index).removeClass('wrong')
}, 5000);
})
}else if(type=="X"){
var correctAnsText = correctAnswer
var choice = ""
$('input[name="singelChoice-'+id+'"]:checked').each(function (){
choice += $(this).val()
})
console.log(choice)
console.log(correctAnsText)
$('#showSingle-'+id).fadeOut(1)
ansCon.fadeIn(100)
for(var i=0;i<choice.length;i++){
var showCorrect = answers.children('#'+correctAnsText[i])
var showChoice = answers.children('#'+choice[i])
if(correctAnsText.indexOf(choice[i])!=-1){
showChoice.addClass('correct')
}else{
showChoice.addClass('wrong')
}
}
for(var i=0;i<correctAnsText.length;i++){
console.log(i)
var showCorrect = answers.children('#'+correctAnsText[i])
$('<p class="answerTip">✓</p>').appendTo(showCorrect)
}
answers.children('label').each(function (){
var a = $(this)
setTimeout(function (){
removeBackground(a)
}, 4000);
setTimeout(function (){
a.removeClass('no-background')
a.removeClass('correct')
a.removeClass('wrong')
}, 5000);
})
}else if(type=="TK"){
$('#showSingle-'+id).fadeOut(1)
ansCon.fadeIn(100)
var answers = correctAnswer
console.log(answers[0])
var form =$('#form-'+id).serializeArray()
var myAns = []
console.log(form[0]['value'])
for(var i=0;i<form.length;i++){
var input = $('#form-'+id).children('#'+id+'-'+i)
if(answers[i] != form[i]['value']){
$('<p class="wrong TKcheck">'+answers[i]+'</p>').insertAfter(input)
}else{
$('<p class="correct TKcheck">'+answers[i]+'</p>').insertAfter(input)
}
}
}
}
function removeBackground(obj){
obj.addClass('no-background')
}