- 英語
- 中文
- 日語
- 韓語
- 法語
- 俄語
- 德語
摘要:背景平時不知道用寫什么練手,這里就寫了一個類似百度翻譯的小。對于學生黨,能進入學校實驗室做項目更好。本文分享到此結束,筆者技術有限,理解有誤的地方還請大家多提,大家可以共同學習。
1. 背景:
平時不知道用js寫什么練手,這里就寫了一個類似百度翻譯的小demo。大家可以平時沒事兒了看看書,寫寫像這種類型的小demo,調用以下公開的api即可。對于學生黨,能進入學校實驗室做項目更好。進不去的,平時寫寫小demo練練也不差。(我為什么沒在實驗室)
2. demo前準備工作:頁面布局
了解百度翻譯API,所需配置參數
準備 MD5.js 加密算法函數(百度自己搜)
寫js代碼
3. 步驟:1. 頁面布局:
布局就不說了,直接貼圖上代碼:
可進行語言切換
html代碼:
要翻譯為: 英文
- 英語
- 中文
- 日語
- 韓語
- 法語
- 俄語
- 德語
翻譯結果:
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
這只只對所配置的參數做一介紹,官方API也有做解釋:
進入百度翻譯,左下角如圖:
點擊百度翻譯開放平臺:
q是你要翻譯的字符串
from是你在輸入時的語言
to是你要翻譯成什么語言
appid是你申請的百度翻譯測試賬號(注冊后秒發)
salt是一個隨機數,這里用事件表示
sign是對拼接的字符串的MD5加密,至于拼接的字符串其實就是: 待加密字符串 =
appid+q+salt+秘鑰(申請賬號時密碼也會給你) 最后把 待價密 的字符串傳入MD5函數,返回sign.
完整流程如圖:
3.準備MD5加密函數(可以百度自己搜,這里直接附代碼)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 加密:
發送請求時別忘了在參數最后面加上一個callback參數用來接收返回值
callback函數:
function fn(str) { var result = document.querySelector(".right .cont"); result.innerHTML = str.trans_result[0].dst; }4.寫js這里簡單的邏輯就不說了,說說這里的接口請求的實現和實現實時翻譯的邏輯(每輸入一兩個字就會主動給你翻譯)。首先這個列子的核心就是jsonp的跨域請求原理很簡單,就是每次請求都給他創建一個標簽插入body, 每次給標簽的src傳入不同的參數,待服務器給你返回數據,最終拿到數據渲染到頁面。這里要提醒的是要給請求的參數最后面加上一個回調函數,返回過來的數據客戶端可以從回調函數中拿取。其次就是實時翻譯,原理就是在敲鍵盤時每次按鍵抬起時隔一定的時間去請求,那就是鍵盤事件加上setInterval();每隔500ms去請求。
整個過程的代碼如下:
(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; }以上就是實現翻譯的過程,效果圖:
中 - 英
中 - 韓
這樣一個小小的翻譯小Demo就完成了,主要還是練習原生js,理解跨域請求的原理,其實跨域請求的方法很多,比如標簽的src,等等。這些方法大家都得去一一了解。
本文分享到此結束,筆者技術有限,理解有誤的地方還請大家多提,大家可以共同學習。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88318.html
摘要:背景平時不知道用寫什么練手,這里就寫了一個類似百度翻譯的小。對于學生黨,能進入學校實驗室做項目更好。本文分享到此結束,筆者技術有限,理解有誤的地方還請大家多提,大家可以共同學習。 1. 背景: 平時不知道用js寫什么練手,這里就寫了一個類似百度翻譯的小demo。大家可以平時沒事兒了看看書,寫寫像這種類型的小demo,調用以下公開的api即可。對于學生黨,能進入學校實驗室做項目更好。進不...
摘要:背景平時不知道用寫什么練手,這里就寫了一個類似百度翻譯的小。對于學生黨,能進入學校實驗室做項目更好。本文分享到此結束,筆者技術有限,理解有誤的地方還請大家多提,大家可以共同學習。 1. 背景: 平時不知道用js寫什么練手,這里就寫了一個類似百度翻譯的小demo。大家可以平時沒事兒了看看書,寫寫像這種類型的小demo,調用以下公開的api即可。對于學生黨,能進入學校實驗室做項目更好。進不...
摘要:前端日報精選流式分頁方案探索異步流程控制掘金虛擬內部是如何工作的眾成翻譯移動端圖片上傳旋轉壓縮的解決方案源碼分析整體流程支持中文譯升級指南掘金第期理解前端現狀答題救不了前端新人掘金進階系列文件上傳下載數組操作大全 2017-06-30 前端日報 精選 流式分頁方案探索異步流程控制 - 掘金虛擬DOM內部是如何工作的? - 眾成翻譯移動端圖片上傳旋轉、壓縮的解決方案 · Issue #1...
摘要:哈哈,我理解,架構就是骨架,如下圖所示譯年月個有趣的和庫前端掘金我們創辦的使命是讓你及時的了解開發中最新最酷的趨勢。 翻譯 | 上手 Webpack ? 這篇就夠了! - 掘金譯者:小 boy (滬江前端開發工程師) 本文原創,轉載請注明作者及出處。 原文地址:https://www.smashingmagazine.... JavaSrip... 讀 Zepto 源碼之代碼結構 - ...
閱讀 3453·2019-08-30 10:54
閱讀 3152·2019-08-29 16:38
閱讀 2175·2019-08-26 14:06
閱讀 1516·2019-08-23 15:39
閱讀 3040·2019-08-23 15:37
閱讀 2887·2019-08-23 13:50
閱讀 3194·2019-08-22 17:14
閱讀 2381·2019-08-22 15:44