- 英語(yǔ)
- 中文
- 日語(yǔ)
- 韓語(yǔ)
- 法語(yǔ)
- 俄語(yǔ)
- 德語(yǔ)
摘要:背景平時(shí)不知道用寫(xiě)什么練手,這里就寫(xiě)了一個(gè)類似百度翻譯的小。對(duì)于學(xué)生黨,能進(jìn)入學(xué)校實(shí)驗(yàn)室做項(xiàng)目更好。本文分享到此結(jié)束,筆者技術(shù)有限,理解有誤的地方還請(qǐng)大家多提,大家可以共同學(xué)習(xí)。
1. 背景:
平時(shí)不知道用js寫(xiě)什么練手,這里就寫(xiě)了一個(gè)類似百度翻譯的小demo。大家可以平時(shí)沒(méi)事兒了看看書(shū),寫(xiě)寫(xiě)像這種類型的小demo,調(diào)用以下公開(kāi)的api即可。對(duì)于學(xué)生黨,能進(jìn)入學(xué)校實(shí)驗(yàn)室做項(xiàng)目更好。進(jìn)不去的,平時(shí)寫(xiě)寫(xiě)小demo練練也不差。(我為什么沒(méi)在實(shí)驗(yàn)室)
2. demo前準(zhǔn)備工作:頁(yè)面布局
了解百度翻譯API,所需配置參數(shù)
準(zhǔn)備 MD5.js 加密算法函數(shù)(百度自己搜)
寫(xiě)js代碼
3. 步驟:1. 頁(yè)面布局:
布局就不說(shuō)了,直接貼圖上代碼:
可進(jìn)行語(yǔ)言切換
html代碼:
要翻譯為: 英文
- 英語(yǔ)
- 中文
- 日語(yǔ)
- 韓語(yǔ)
- 法語(yǔ)
- 俄語(yǔ)
- 德語(yǔ)
翻譯結(jié)果:
css代碼:
*{ margin: 0; padding: 0; font-family: "微軟雅黑"; } html,body { height: 100%; } li { list-style: none; } body { overflow: hidden; } #main { width: 1000px; height: 80%; margin: 5% auto; } #main .left { float: left; width: 350px; height:330px; margin: 50px 0 0 50px; background-color: #fff; border: 1px solid #000; box-sizing: border-box; color: #fff; border-top-left-radius: 15px; border-top-right-radius: 15px; } #main .right { float: right; width: 350px; height: 330px; margin: 50px 50px 0 0; background-color: #fff; box-sizing: border-box; border: 1px solid #000; border-top-left-radius: 15px; border-top-right-radius: 15px; } #main .title { width: 100%; height: 40px; background-color: #333; line-height: 40px; text-indent: 20px; position: relative; color: #fff; border-top-left-radius: 15px; border-top-right-radius: 15px; } #main .lang { height: 40px; line-height: 40px; text-indent: 20px; letter-spacing: 2px; text-decoration: underline; color: #58a; cursor: pointer; } #main .lang:hover { text-decoration: none; color: #eee; } #main .text { width: 100%; height: 288px; padding: 20px; box-sizing: border-box; resize: none; outline: none; border: none; } #main .right .cont { width: 100%; height: 295px; padding: 20px; box-sizing: border-box; } #main .bottom { float: left; width: 100%; height: 40px; margin-top: 60px; } #main .bottom button { float: right; width: 65px; height: 35px; line-height: 35px; letter-spacing: 2px; border: none; margin-right: 50px; border-radius: 3px; outline: none; cursor: pointer; color: #eee; background-color: #333; } #main ul { width: 100%; padding: 20px 15px 0 20px; box-sizing: border-box; position: absolute; background: blue; background-color: #fff; border-bottom: 1px solid #333; display: none; } #main ul li { float:left; text-indent: 0; text-align: center; padding: 0 10px; margin: 0 10px; margin-bottom: 20px; border: 1px solid #000; border-radius: 5px; box-sizing: border-box; color: #333; cursor: pointer; } #main ul li:hover { background-color: #333; color: #fff; }
2,了解百度翻譯API
這只只對(duì)所配置的參數(shù)做一介紹,官方API也有做解釋:
進(jìn)入百度翻譯,左下角如圖:
點(diǎn)擊百度翻譯開(kāi)放平臺(tái):
q是你要翻譯的字符串
from是你在輸入時(shí)的語(yǔ)言
to是你要翻譯成什么語(yǔ)言
appid是你申請(qǐng)的百度翻譯測(cè)試賬號(hào)(注冊(cè)后秒發(fā))
salt是一個(gè)隨機(jī)數(shù),這里用事件表示
sign是對(duì)拼接的字符串的MD5加密,至于拼接的字符串其實(shí)就是: 待加密字符串 =
appid+q+salt+秘鑰(申請(qǐng)賬號(hào)時(shí)密碼也會(huì)給你) 最后把 待價(jià)密 的字符串傳入MD5函數(shù),返回sign.
完整流程如圖:
3.準(zhǔn)備MD5加密函數(shù)(可以百度自己搜,這里直接附代碼)MD5加密字符串:
var MD5 = function (string) { function RotateLeft(lValue, iShiftBits) { return (lValue<>>(32-iShiftBits)); } function AddUnsigned(lX,lY) { var lX4,lY4,lX8,lY8,lResult; lX8 = (lX & 0x80000000); lY8 = (lY & 0x80000000); lX4 = (lX & 0x40000000); lY4 = (lY & 0x40000000); lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF); if (lX4 & lY4) { return (lResult ^ 0x80000000 ^ lX8 ^ lY8); } if (lX4 | lY4) { if (lResult & 0x40000000) { return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); } else { return (lResult ^ 0x40000000 ^ lX8 ^ lY8); } } else { return (lResult ^ lX8 ^ lY8); } } function F(x,y,z) { return (x & y) | ((~x) & z); } function G(x,y,z) { return (x & z) | (y & (~z)); } function H(x,y,z) { return (x ^ y ^ z); } function I(x,y,z) { return (y ^ (x | (~z))); } function FF(a,b,c,d,x,s,ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); }; function GG(a,b,c,d,x,s,ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); }; function HH(a,b,c,d,x,s,ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); }; function II(a,b,c,d,x,s,ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b); }; function ConvertToWordArray(string) { var lWordCount; var lMessageLength = string.length; var lNumberOfWords_temp1=lMessageLength + 8; var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64; var lNumberOfWords = (lNumberOfWords_temp2+1)*16; var lWordArray=Array(lNumberOfWords-1); var lBytePosition = 0; var lByteCount = 0; while ( lByteCount < lMessageLength ) { lWordCount = (lByteCount-(lByteCount % 4))/4; lBytePosition = (lByteCount % 4)*8; lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)< >>29; return lWordArray; }; function WordToHex(lValue) { var WordToHexValue="",WordToHexValue_temp="",lByte,lCount; for (lCount = 0;lCount<=3;lCount++) { lByte = (lValue>>>(lCount*8)) & 255; WordToHexValue_temp = "0" + lByte.toString(16); WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2); } return WordToHexValue; }; function Utf8Encode(string) { string = string.replace(/ /g," "); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }; var x=Array(); var k,AA,BB,CC,DD,a,b,c,d; var S11=7, S12=12, S13=17, S14=22; var S21=5, S22=9 , S23=14, S24=20; var S31=4, S32=11, S33=16, S34=23; var S41=6, S42=10, S43=15, S44=21; string = Utf8Encode(string); x = ConvertToWordArray(string); a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476; for (k=0;k 加密:
發(fā)送請(qǐng)求時(shí)別忘了在參數(shù)最后面加上一個(gè)callback參數(shù)用來(lái)接收返回值
callback函數(shù):
function fn(str) { var result = document.querySelector(".right .cont"); result.innerHTML = str.trans_result[0].dst; }4.寫(xiě)js這里簡(jiǎn)單的邏輯就不說(shuō)了,說(shuō)說(shuō)這里的接口請(qǐng)求的實(shí)現(xiàn)和實(shí)現(xiàn)實(shí)時(shí)翻譯的邏輯(每輸入一兩個(gè)字就會(huì)主動(dòng)給你翻譯)。首先這個(gè)列子的核心就是jsonp的跨域請(qǐng)求原理很簡(jiǎn)單,就是每次請(qǐng)求都給他創(chuàng)建一個(gè)標(biāo)簽插入body, 每次給標(biāo)簽的src傳入不同的參數(shù),待服務(wù)器給你返回?cái)?shù)據(jù),最終拿到數(shù)據(jù)渲染到頁(yè)面。這里要提醒的是要給請(qǐng)求的參數(shù)最后面加上一個(gè)回調(diào)函數(shù),返回過(guò)來(lái)的數(shù)據(jù)客戶端可以從回調(diào)函數(shù)中拿取。其次就是實(shí)時(shí)翻譯,原理就是在敲鍵盤(pán)時(shí)每次按鍵抬起時(shí)隔一定的時(shí)間去請(qǐng)求,那就是鍵盤(pán)事件加上setInterval();每隔500ms去請(qǐng)求。
整個(gè)過(guò)程的代碼如下:
(function() { var title = document.querySelector(".left .title .lang"), ul = document.querySelector(".ul1"), lis = document.querySelectorAll(".ul1 li"), text = document.querySelector(".left .text"), result = document.querySelector(".right .cont"), reset = document.querySelector(".bottom .reset"), trans = document.querySelector(".bottom .trans"), key = true, length = lis.length, lang = "en", timer = null; function langShow() { if (key == true) { ul.style.display = "block"; key = false; } else { ul.style.display = "none"; key = true; } } function changeLang() { lang = this.getAttribute("data-lang"); title.innerHTML = this.innerHTML; this.parentNode.style.display = "none"; key = true; } function createScript(src) { var script = document.createElement("script"); script.id = "script1" script.src = src; document.body.appendChild(script); } function translate() { var value = "http://api.fanyi.baidu.com/api/trans/vip/translate?"; var date = Date.now(); var str = "20170605000052254"+text.value+date+"63r1c42X7_buc4OrXm1g"; var md5 = MD5(str); var data = "q=" + text.value + "&from=auto&to=" + lang + "&appid=20170605000052254" + "&salt=" + date + "&sign=" + md5 + "&callback=fn"; var src = value + data; createScript(src); } function init() { title.onclick = langShow; for (var i = 0; i < length; i++) { lis[i].onclick = changeLang; } reset.onclick = function() { text.value = ""; } trans.onclick = function() { if (text.value == "") { return; } var script = document.querySelector("#script1"); if (script) { script.parentNode.removeChild(script); translate(); } else { translate(); } } text.onkeydown = function() { clearTimeout(timer); timer = setInterval(function() { if (text.value == "") { return; } var script = document.querySelector("#script1"); if (script) { script.parentNode.removeChild(script); translate(); } else { translate(); } }, 500); clearTimeout(timer); } } init(); })(); function fn(str) { var result = document.querySelector(".right .cont"); result.innerHTML = str.trans_result[0].dst; }以上就是實(shí)現(xiàn)翻譯的過(guò)程,效果圖:
中 - 英
中 - 韓
這樣一個(gè)小小的翻譯小Demo就完成了,主要還是練習(xí)原生js,理解跨域請(qǐng)求的原理,其實(shí)跨域請(qǐng)求的方法很多,比如標(biāo)簽的src,等等。這些方法大家都得去一一了解。
本文分享到此結(jié)束,筆者技術(shù)有限,理解有誤的地方還請(qǐng)大家多提,大家可以共同學(xué)習(xí)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/112190.html
摘要:背景平時(shí)不知道用寫(xiě)什么練手,這里就寫(xiě)了一個(gè)類似百度翻譯的小。對(duì)于學(xué)生黨,能進(jìn)入學(xué)校實(shí)驗(yàn)室做項(xiàng)目更好。本文分享到此結(jié)束,筆者技術(shù)有限,理解有誤的地方還請(qǐng)大家多提,大家可以共同學(xué)習(xí)。 1. 背景: 平時(shí)不知道用js寫(xiě)什么練手,這里就寫(xiě)了一個(gè)類似百度翻譯的小demo。大家可以平時(shí)沒(méi)事兒了看看書(shū),寫(xiě)寫(xiě)像這種類型的小demo,調(diào)用以下公開(kāi)的api即可。對(duì)于學(xué)生黨,能進(jìn)入學(xué)校實(shí)驗(yàn)室做項(xiàng)目更好。進(jìn)不...
摘要:背景平時(shí)不知道用寫(xiě)什么練手,這里就寫(xiě)了一個(gè)類似百度翻譯的小。對(duì)于學(xué)生黨,能進(jìn)入學(xué)校實(shí)驗(yàn)室做項(xiàng)目更好。本文分享到此結(jié)束,筆者技術(shù)有限,理解有誤的地方還請(qǐng)大家多提,大家可以共同學(xué)習(xí)。 1. 背景: 平時(shí)不知道用js寫(xiě)什么練手,這里就寫(xiě)了一個(gè)類似百度翻譯的小demo。大家可以平時(shí)沒(méi)事兒了看看書(shū),寫(xiě)寫(xiě)像這種類型的小demo,調(diào)用以下公開(kāi)的api即可。對(duì)于學(xué)生黨,能進(jìn)入學(xué)校實(shí)驗(yàn)室做項(xiàng)目更好。進(jìn)不...
摘要:前端日?qǐng)?bào)精選流式分頁(yè)方案探索異步流程控制掘金虛擬內(nèi)部是如何工作的眾成翻譯移動(dòng)端圖片上傳旋轉(zhuǎn)壓縮的解決方案源碼分析整體流程支持中文譯升級(jí)指南掘金第期理解前端現(xiàn)狀答題救不了前端新人掘金進(jìn)階系列文件上傳下載數(shù)組操作大全 2017-06-30 前端日?qǐng)?bào) 精選 流式分頁(yè)方案探索異步流程控制 - 掘金虛擬DOM內(nèi)部是如何工作的? - 眾成翻譯移動(dòng)端圖片上傳旋轉(zhuǎn)、壓縮的解決方案 · Issue #1...
摘要:哈哈,我理解,架構(gòu)就是骨架,如下圖所示譯年月個(gè)有趣的和庫(kù)前端掘金我們創(chuàng)辦的使命是讓你及時(shí)的了解開(kāi)發(fā)中最新最酷的趨勢(shì)。 翻譯 | 上手 Webpack ? 這篇就夠了! - 掘金譯者:小 boy (滬江前端開(kāi)發(fā)工程師) 本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明作者及出處。 原文地址:https://www.smashingmagazine.... JavaSrip... 讀 Zepto 源碼之代碼結(jié)構(gòu) - ...
閱讀 1675·2021-11-15 11:37
閱讀 3408·2021-09-28 09:44
閱讀 1649·2021-09-07 10:15
閱讀 2784·2021-09-03 10:39
閱讀 2686·2019-08-29 13:20
閱讀 1291·2019-08-29 12:51
閱讀 2204·2019-08-26 13:44
閱讀 2124·2019-08-23 18:02