因爲職業的須要,我每次上課都要點名來確認班上的到課率,由於一邊點一邊看學生舉手效率低下,就上網找了一篇用JavaScript文字轉語音的博客,實現了一個在線點名的網頁,下面是個人代碼:javascript
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>林小宅的花名冊</title> 6 7 <style type="text/css"> 8 #namename{ 9 line-height: 500px; 10 height: 500px; 11 text-align: center; 12 font-size: 100px; 13 } 14 .oo{ 15 width: 290px; 16 height: 20px; 17 margin: 0px auto; 18 } 19 </style> 20 </head> 21 <body> 22 <div id="namename"> 23 準備好了嗎? 24 </div> 25 <div class="oo"> 26 <select name="" id="kj"> 27 <option value="1" >前端1班</option> 28 <option value="2">前端2班</option> 29 <option value="3">前端3班</option> 30 <option value="4">前端4班</option> 31 <option value="5">大數據</option> 32 <option value="6">C語言</option> 33 </select> 34 <button onclick="clickme()">開始點名</button> 35 <button onclick="patient()">觀察人員</button> 36 </div> 37 <div id="bdtts_div_id"> 38 <audio id="tts_autio_id" autoplay="autoplay"> 39 <source id="tts_source_id" src="http://tts.baidu.com/text2audio?lan=zh&ie=UTF-8&spd=5&text=開始點名啦" type="audio/mpeg"> 40 <embed id="tts_embed_id" height="0" width="0" src=""> 41 </audio> 42 </div> 43 44 <script type="text/javascript"> 45 46 //前段一班 47 var fontEnd_class1 = "前端1班_鄭剴鴻_" 48 +"林彬_" 49 +"張偉彬_" 50 +"林慶祥_" 51 +"譚明智_" 52 +"羅旭強_" 53 +"蔡其成_" 54 +"李瑞林_" 55 +"潘粵湘_" 56 +"房霖_" 57 +"賴展凱_" 58 +"吳宗榮_" 59 +"楊丹娜_" 60 +"黃顯權_" 61 +"鄧富成_" 62 +"謝嘉煒_" 63 +"楊丹鳳_" 64 +"黎煒鬆_" 65 +"謝金航_" 66 +"龍偉樂_" 67 +"陳浩賢_" 68 +"王雨婷_" 69 +"黃俊威_" 70 +"梁達斌_" 71 +"陳澤凱_" 72 +"鄺梓豪_" 73 +"邱文威_" 74 +"陳熙才_" 75 +"梁關偉_" 76 +"陳家恆_" 77 +"黃超鏵_" 78 +"賴桂玲_" 79 +"吳勝睿_" 80 +"李永成_" 81 +"劉耿濤_" 82 +"張家毓_" 83 +"蔡志豪_" 84 +"周浩東_" 85 +"吳軍龍_" 86 +"鄞沛遠_" 87 +"李上欽_" 88 +"鄧錦鵬_" 89 +"陳俊安_" 90 +"陳治_" 91 +"梁玉婷_" 92 +"郭金川_" 93 +"陳健欣_" 94 +"李澤偉_" 95 +"林俊宇_" 96 +"陳劍鋒_" 97 +"黃鋼祥_" 98 +"廖家灼_" 99 +"何富鋮_" 100 +"許俊偉_" 101 +"王子泓_" 102 +"吳澤峯_"; 103 //前端2班 104 var fontEnd_class2 ="前端2班_孫惟晟_" 105 +"文浩旭_" 106 +"莊昊庭_" 107 +"廖偉健_" 108 +"聶大森_" 109 +"羅家敬_" 110 +"陳曉生_" 111 +"李曄韜_" 112 +"卜文博_" 113 +"彭旭成_" 114 +"梁婉婷_" 115 +"辛梓瀚_" 116 +"李思_" 117 +"林樂祺_" 118 +"黃才略_" 119 +"關瑜沛_" 120 +"梁沛立_" 121 +"梁紹鵬_" 122 +"植湛深_" 123 +"高建塘_" 124 +"顏卓越_" 125 +"羅浩延_" 126 +"陳昱鴻_" 127 +"周宇傑_" 128 +"餘釺華_" 129 +"談鈺鋒_" 130 +"盧炯銘_" 131 +"吳鍵東_" 132 +"張琦_" 133 +"梁佰華_" 134 +"冼耀琪_" 135 +"蘇世宇_" 136 +"劉家敏_" 137 +"範顯超_" 138 +"嚴朝朗_" 139 +"林逸新_" 140 +"李文龍_" 141 +"蔡東威_" 142 +"譚源潮_" 143 +"楊嘉鑫_" 144 +"劉浩威_" 145 +"楊柏麗_" 146 +"馮卓鵬_" 147 +"伍桑_" 148 +"譚建嵐_" 149 +"梁浩軒_" 150 +"鍾所願_" 151 +"蔣敏維_" 152 +"張海鵬_" 153 +"梁文傑_" 154 +"葉育豐_" 155 +"陳吉周_" 156 +"魏欽宏_" 157 +"韋雄哲_" 158 +"王遠旭_" 159 +"莊曉鑫_點名結束"; 160 //前段3班 161 var fontEnd_class3 = "前端3班_鄭浩佳_"+ 162 "湯嶽文_"+ 163 "黃澤嵐_"+ 164 "林澤儒_"+ 165 "李佳川_"+ 166 "郭宇亮_"+ 167 "陳婉麗_"+ 168 "林澤鑫_"+ 169 "董志勝_"+ 170 "劉鼕鼕_"+ 171 "盧欣苗_"+ 172 "謝根甫_"+ 173 "劉鈞鏗_"+ 174 "蔡爍_"+ 175 "張思敏_"+ 176 "邊建_"+ 177 "林桂鑫_"+ 178 "林曉鵬_"+ 179 "歐楚瑜_"+ 180 "蘇信泉_"+ 181 "張志創_"+ 182 "陳澤博_"+ 183 "黃仁海_"+ 184 "楊觀霖_"+ 185 "林浩鋒_"+ 186 "陳彥旭_"+ 187 "廖世躍_"+ 188 "洪曉東_"+ 189 "劉麗敏_"+ 190 "施木偉_"+ 191 "劉悅川_"+ 192 "李雄傑_"+ 193 "葉成浩_"+ 194 "楊澤軒_"+ 195 "吳偉陽_"+ 196 "崔嘉承_"+ 197 "陳振羣_"+ 198 "周仕穎_"+ 199 "朱家浩_"+ 200 "周志源_"+ 201 "黃澤浩_"+ 202 "林於聰_"+ 203 "馮時帆_"+ 204 "文漢鵬_"+ 205 "江俊霖_"+ 206 "謝俊威_"+ 207 "楊建林_"+ 208 "胡洛彬_"+ 209 "陳愷_"+ 210 "謝曉漫_"+ 211 "林煜_"+ 212 "陳潔瑩_"+ 213 "陳日冠_"+ 214 "鄧錦華_"+ 215 "梁釗柯_"+ 216 "辛子慧_點名結束"; 217 //前端4班 218 var fontEnd_class4 ="前端4班_吳炳麟_"+ 219 "高偉崇_"+ 220 "蔡晉昇_"+ 221 "吳宇軒_"+ 222 "黃慧燕_"+ 223 "黃海琦_"+ 224 "張榮_"+ 225 "葉羽楓_"+ 226 "餘秋材_"+ 227 "王偉傑_"+ 228 "黎航銘_"+ 229 "何偉業_"+ 230 "楊永裕_"+ 231 "黃欽豪_"+ 232 "張俊_"+ 233 "溫偉韜_"+ 234 "劉凱鋼_"+ 235 "鄭峻珩_"+ 236 "陳小楠_"+ 237 "江卓峯_"+ 238 "洪浩彬_"+ 239 "陸科良_"+ 240 "劉做林_"+ 241 "黃開築_"+ 242 "林祈宏_"+ 243 "柯銘_"+ 244 "陳華宏_"+ 245 "詹凡_"+ 246 "朱倍立_"+ 247 "鍾東煜_"+ 248 "餘華龍_"+ 249 "龍沛元_"+ 250 "許銘全_"+ 251 "翁聰穎_"+ 252 "肖東江_"+ 253 "辛懷睿_"+ 254 "吳勉銳_"+ 255 "林添信_"+ 256 "餘志憲_"+ 257 "林潔淮_"+ 258 "鄭家寶_"+ 259 "鄧偉業_"+ 260 "何濤_"+ 261 "劉藹瑞_"+ 262 "梁宇航_"+ 263 "範浩林_"+ 264 "陳俊源_點名結束"; 265 //C語言4班 266 var context1 = "C語言4班_冼明朗_劉宇鴻_"+ 267 "劉春雄_" 268 +"劉曉聰_" 269 +"劉粵豪_" 270 +"吳業朋_" 271 +"吳劍洋_" 272 +"吳德昊_" 273 +"吳桂洲_" 274 +"周澤鍇_" 275 +"唐進義_" 276 +"龐洪滔_" 277 +"廖輝健_" 278 +"張兆山_" 279 +"徐海祥_" 280 +"朱勇騰_" 281 +"朱桂濤_" 282 +"朱毅龍_" 283 +"李喜廷_" 284 +"李堪立_" 285 +"李新茹_" 286 +"李永聰_" 287 +"楊超文_" 288 +"林宇軒_" 289 +"林志權_" 290 +"林澤航_" 291 +"林琳_" 292 +"柯雅量_" 293 +"溫俊豪_" 294 +"潘華鋒_" 295 +"潘家炬_" 296 +"王奕敏_" 297 +"白昌煜_" 298 +"練慶欽_" 299 +"羅思惟_" 300 +"翁俊源_" 301 +"胡建斌_" 302 +"冼明朗_" 303 +"蘇浩洋_" 304 +"範德浩_" 305 +"藍文壕_" 306 +"蔡翠婷_" 307 +"謝銀光_" 308 +"邱利_" 309 +"郭珊珊_" 310 +"陳冠宇_" 311 +"陳泳銜_" 312 +"馬偉東_" 313 +"黃建成_" 314 +"黃文偉_" 315 +"黃膨釩_" 316 +"黃銳_" 317 +"黃梓豐_" 318 +"蘇西波_" 319 +"任旺_" 320 +"孫潤東_點名結束"; 321 //大數據班 322 var bigData_class = "大數據班_彭緒政_"+ 323 "廖炎彬_"+ 324 "馮嘉泳_"+ 325 "謝俊欽_"+ 326 "林澤彬_"+ 327 "陳森華_"+ 328 "雷濤_"+ 329 "宋子洋_"+ 330 "杜偉傑_"+ 331 "薛啓炫_"+ 332 "吳希豚_"+ 333 "黃廣準_"+ 334 "陳泓哲_"+ 335 "楊文豪_"+ 336 "韓俊銘_"+ 337 "方銘_"+ 338 "劉嘉楠_"+ 339 "陳澤銳_"+ 340 "張大橋_"+ 341 "黃志聰_"+ 342 "陳敏清_"+ 343 "蔡鎵鍔_"+ 344 "黃嘉泉_"+ 345 "蔡創洲_"+ 346 "譚俊傑_"+ 347 "陳廣金_"+ 348 "許坤威_"+ 349 "梁朗明_"+ 350 "吳桂平_"+ 351 "丘文源_"+ 352 "徐鴻宇_"+ 353 "陳梓萼_"+ 354 "李偉元_"+ 355 "鍾盟陽_"+ 356 "趙伯鋆_"+ 357 "陳嘉銘_"+ 358 "利錦成_"+ 359 "林楚炯_"+ 360 "葉偉傑_"+ 361 "歐陽一鳴_"+ 362 "肖哲華_"+ 363 "曾劍濤_"+ 364 "蔡鎧文_"+ 365 "林宏偉_"+ 366 "蘇乙航_"+ 367 "黃慶餘_"+ 368 "肖俊傑_"+ 369 "黃峻權_點名結束"; 370 371 function doTTS(ttsText){ 372 var ttsDiv = document.getElementById('bdtts_div_id'); 373 var ttsAudio = document.getElementById('tts_autio_id'); 374 ttsDiv.removeChild(ttsAudio); 375 var au1 = '<audio id="tts_autio_id" autoplay="autoplay">'; 376 var sss = '<source id="tts_source_id" src="http://tts.baidu.com/text2audio?lan=zh&ie=UTF-8&spd=5&text='+ttsText+'" type="audio/mpeg">'; 377 var eee = '<embed id="tts_embed_id" height="0" width="0" src="">'; 378 var au2 = '</audio>'; 379 ttsDiv.innerHTML += au1 + sss + eee + au2; 380 381 var media = document.getElementById("tts_autio_id"); 382 const playPromise = media.play(); 383 if (playPromise !== null){ 384 playPromise.catch(() => { media.play(); }) 385 } 386 document.getElementById("namename").innerHTML = ttsText; 387 } 388 389 var isKeepOn = true; 390 var whereStop = 0; 391 var nameList = [fontEnd_class1,fontEnd_class2,fontEnd_class3,fontEnd_class4,bigData_class,context1]; 392 var arr; 393 var blackName = ""; 394 function clickme(){ 395 arr = nameList[document.getElementById("kj").selectedIndex].split("_"); 396 for(var i = 0;i<arr.length;i++){ 397 //解決做用域的問題,以及setTimeout不能調用帶參數的函數,只能在匿名函數中封裝調用 398 (function(name,j){ 399 setTimeout(function(){doTTS(name)},j*2500); 400 })(arr[i],i); 401 } 402 } 403 404 function patient(){ 405 var name = document.getElementById("namename").innerHTML+" | "; 406 blackName +=name; 407 console.log(blackName); 408 } 409 410 411 412 413 </script> 414 </body> 415 </html>
這裏比較遺憾的是,當看到有學生沒有舉手的時候,沒有辦法暫停下來,待後續的改進,所以我加了一個按鈕,當發現學生沒有舉手的時候就點擊「觀察人員」,把該學生的名單打印到控制檯,點完以後再問沒來的具體狀況。作這個程序也就花了半個小時,卡在setTimeout()這個函數上。由於我須要實現的效果是每隔2秒就點一個學生的名字,用到了for循環,可是每次for循環的時候並不會停下來去點名,而是一會兒把for循環的語句執行完,把每一個setTimeout加到待執行隊列中,而後所有的setTimeout一下所有執行了,造成的效果就是一個班的54我的的名字同時點出來了。網上有人說能夠用當即執行函數,用了以後仍是沒有達到效果,後來才知道原來是setTimeout不能執行帶有參數的函數,必須得用一個匿名函數來封裝調用,最後的效果是這樣的 :css
1 for(var i = 0;i<arr.length;i++){ 2 //解決做用域的問題,以及setTimeout不能調用帶參數的函數,只能在匿名函數中封裝調用 3 (function(name,j){ 4 setTimeout(function(){doTTS(name)},j*2500); 5 })(arr[i],i); 6 }
另外就是音頻播放的問題,media.play()和media.pause()的含義,意思大概明白了,可是很難言語,這裏就不說了,只說解決的方法:html
1 var media = document.getElementById("tts_autio_id"); 2 const playPromise = media.play(); 3 if (playPromise !== null){ 4 playPromise.catch(() => { media.play(); }) 5 } 6 document.getElementById("namename").innerHTML = ttsText;
這是國外大神提供的參考代碼,使用了一下,發現很好用呢,就這樣,睡覺!!!前端