你可能會考慮編碼問題,選項可供選擇,並在瀏覽器端的JavaScript正確答案以這樣的方式來從隨意觀看隱藏起來。
注意這個不會完全保護來自任何人,但不熟練的用戶的答案,但它會給你一些隱私。
這裏是我建議(見直播在jsfiddle)解決方案:
<div>Q: <span id="q"></span></div>
<div>1: <span id="o1"></span></div>
<div>2: <span id="o2"></span></div>
<div>3: <span id="o3"></span></div>
<div>Placeholder: <span id='p'></span></div>
<div>A: <span id='a'></span></div>
<script>
var cc=''.charCodeAt,sh=[].shift,jo=[].join,sp=''.split,
ma=[].map,fc=String.fromCharCode,lo=''.toLowerCase,
fe=[].forEach,
/* #1 */ r=function(s){
var f=function(c){
var v=cc.call(lo.call(c)),t=v>=96,k=(v-96+12)%26+1;
if(v<97 || v>122) return c; return fc(k+(t?96:64));
};
return jo.call(ma.call(sp.call(s,''),f), '');
},
/* #2 */ d=[
'Gur dhrfgvba gb nfx?', // The question to ask?
'Svefg cbffvoyr nafjre', // First possible answer
'Frpbaq cbffvoyr nafjre', // Second possible answer
'Guveq cbffvoyr nafjre', // Third possible answer
'[Naq gur nafjre vf...]', // [And the answer is...]
'Gur npghny nafjre!', // The actual answer!
],
/* #3 */ t=['q','o1','o2','o3','p','a'];
/* #4 */ fe.call(t,function(tr){
document.getElementById(tr).innerText=r(sh.call(d));
});
</script>
凡
- #1:
r
是的Caesar Cypher
- 的ROT13變化的混淆實施#2:
d
是一個ROT13編碼的字符串數組,應該在每次新任務時進行替換離子被呈現給用戶
- #3:
t
是DOM元素ID的陣列,以確定在其中的元件插入解碼字符串
- #4:插入解碼字符串到相應的元件。
當每個新的問題是從服務器,問題的編碼值,答案的選擇,佔位符的答案檢索,且實際答案本身在d
取代的值。
在您的應用程序中,選項可能是單選按鈕,附帶onClick
事件處理程序,它將檢查點擊選項與解碼答案以確定成功或失敗。
這裏是ROT13加密的未混淆的版本:
var rot13 = function(s){
return s.split('').map(function(c){
var v=c.toLowerCase().charCodeAt(0);
if(v<97 || v>122) return c;
var t = v>=96,
k = (v - 96 + 12) % 26 + 1;
return String.fromCharCode(k + (t ? 96 : 64));
}).join('');
};
這實在是一個太普通的一個問題,但通常你會送可能的答案給瀏覽器一個唯一的ID沿將用於請求服務器的實際答案。通常的做法是使用[AJAX](https://en.wikipedia.org/wiki/Ajax_(編程))瀏覽器到服務器請求(不需要刷新頁面)和某些數據庫服務器,可以讓你存儲問題,可能的答案,以及由唯一ID索引的實際答案。 –
@RobRaisch感謝羅布。我沒有提到它,但我不能將問題/答案存儲在數據庫中(這會更容易...)。我只是從第三方API中隨機生成它們。我不想存儲它們,因爲它們只能使用一次。但可能是我應該將它們臨時存儲在JSON文件中,然後在「測驗」之後刪除。 – Alex