电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JS實現(xiàn)百度搜索框

瀏覽:112日期:2022-06-19 11:34:55

本文實例為大家分享了JS實現(xiàn)百度搜索框的具體代碼,供大家參考,具體內(nèi)容如下

實現(xiàn)原理

向輸入框動態(tài)輸入時關鍵詞,將當前關鍵詞作為問號參數(shù)后面的值,因為要跨域使用百度的接口,所以通過 JSONP 跨域創(chuàng)建 Ajax 請求?;卣{(diào)函數(shù)處理返回值。

嘗試研究了一下百度的接口,發(fā)現(xiàn)原生的 XHR 接口參數(shù)有點復雜(百度應該是考慮了很多情況)。

找了一個 2345 導航,在輸入框隨便輸入一個字母 s,打開 Network,發(fā)現(xiàn)它也是向百度的一個地址發(fā)送了請求,其中問號后面的‘&wd=s’發(fā)送的就是此關鍵詞,’&cb=’應該就是回調(diào)處理函數(shù),并且它的 Type 也是 script,2345 導航應該也是通過 JSONP 向百度獲取數(shù)據(jù)的。

JS實現(xiàn)百度搜索框

var script = document.createElement('script');script.src = 'https://www.baidu.com/su?&wd=' + encodeURI(this.value.trim()) + '&p=3&cb=handleSuggestion';document.body.appendChild(script);

點開那條請求,果然在里面看到了返回的數(shù)據(jù)。返回的結果是以一個對象的形式返回的。q 對應著檢索關鍵詞,s 對應著返回的結果(數(shù)組形式)

JS實現(xiàn)百度搜索框

后續(xù)只需要動態(tài)創(chuàng)建 li 標簽,設置里面的內(nèi)容,以及注意其他細節(jié)問題。

1.使用 flex 布局實現(xiàn)搜索框的水平垂直居中。

坑 設置完 flex 屬性之后發(fā)現(xiàn)并沒有水平垂直居中,當時設置了父盒子 height:100%,發(fā)現(xiàn)如果將 height 設置成具體值就可以實現(xiàn)居中。懷疑是設置了%高度無效,查了一下,高度百分比是相對于父盒子的,也就是 body。默認 html 和 body 是沒有設置 height 的。另外,在布局中對于沒有設置寬高的塊狀盒子,寬度默認是 100%的,高度是由里面的內(nèi)容自然撐開的。

2.先獲取常用的 DOM 節(jié)點,避免后續(xù)頻繁查詢操作 DOM。

3.為了避免在輸入過程中頻繁發(fā)送請求(如果打字速度快),對請求函數(shù)做了函數(shù)節(jié)流,調(diào)了一下間隔 130ms 差不多正好,時間再長就會有卡頓的感覺。使用了 ES6 中的箭頭函數(shù)避免了 setTimeout 中 this 指向的問題。

4.在回調(diào)函數(shù)中:

每一次執(zhí)行時首先要清除建議框里的內(nèi)容,不然上一次的結果還會存在建議框里!截取了結果中的前五個(如果把所有結果都展示出來感覺有點丑…百度官方是展示前四個搜索建議) 結果處理完畢后,執(zhí)行自執(zhí)行匿名函數(shù),刪除創(chuàng)建的 script 標簽;

5.由于 li 是動態(tài)創(chuàng)建的,點擊 li 標簽或者點擊'搜索一下'跳轉百度進行搜索時,利用事件冒泡原理,進行事件委托。這里沒有考慮兼容性問題:

e = e || window.event;target = e.target || e.srcElement;

6.除了點擊事件,鍵盤事件?回車鍵以及上下鍵都是進行事件委托進行注冊的。

最終能夠實現(xiàn)鍵盤上下鍵鼠標選擇,點擊“搜索一下”或回車鍵實現(xiàn)跳轉搜索。

代碼:

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <!-- 兼容性視圖 --> <meta http-equiv='X-UA-Compatible' content='ie=edge'> <meta content='更方便快捷搜索,從而達到事半功倍的效果' name='description'> <title>search you want</title> <style> html { height: 100%; } body { background: #f0f3ef; height: 100%; } .container { height: 100%; display: flex; justify-content: center; align-items: center; flex-direction: column; } .bgDiv { box-sizing: border-box; width: 595px; height: 55px; position: relative; /* position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); */ } .search-input-text { border: 1px solid #b6b6b6; width: 495px; background: #fff; height: 33px; line-height: 33px; font-size: 18px; padding: 3px 0 0 7px; } .search-input-button { width: 90px; height: 38px; color: #fff; font-size: 16px; letter-spacing: 3px; background: #3385ff; border: .5px solid #2d78f4; margin-left: -5px; vertical-align: top; opacity: .9; } .search-input-button:hover { opacity: 1; box-shadow: 0 1px 1px #333; cursor: pointer; } .suggest { width: 502px; position: absolute; top: 38px; border: 1px solid #999; background: #fff; display: none; } .suggest ul { list-style: none; margin: 0; padding: 0; } .suggest ul li { padding: 3px; font-size: 17px; line-height: 25px; cursor: pointer; } .suggest ul li:hover { background-color: #e5e5e5 } </style></head><body> <div class='container'> <div class='bgDiv'> <input type='text' value='' autofocus placeholder='關鍵詞'> <input type='button' value='搜索一下' id='btn'> <div class='suggest'> <ul id='search-result'> </ul> </div> </div> </div> <script> var suggestContainer = document.getElementsByClassName('suggest')[0]; var searchInput = document.getElementsByClassName('search-input-text')[0]; var bgDiv = document.getElementsByClassName('bgDiv')[0]; var searchResult = document.getElementById('search-result'); // 清除建議框內(nèi)容 function clearContent() { var size = searchResult.childNodes.length; for (var i = size - 1; i >= 0; i--) { searchResult.removeChild(searchResult.childNodes[i]); } }; var timer = null; // 注冊輸入框鍵盤抬起事件 searchInput.onkeyup = function (e) { suggestContainer.style.display = 'block'; // 如果輸入框內(nèi)容為空 清除內(nèi)容且無需跨域請求 if (this.value.length === 0) { clearContent(); return; } if (this.timer) { clearTimeout(this.timer); } if (e.keyCode !== 40 && e.keyCode !== 38) { // 函數(shù)節(jié)流優(yōu)化 this.timer = setTimeout(() => { // 創(chuàng)建script標簽JSONP跨域 var script = document.createElement('script'); script.src = 'https://www.baidu.com/su?&wd=' + encodeURI(this.value.trim()) + '&p=3&cb=handleSuggestion'; document.body.appendChild(script); }, 130) } }; // 回調(diào)函數(shù)處理返回值 function handleSuggestion(res) { // 清空之前的數(shù)據(jù)?。?clearContent(); var result = res.s; // 截取前五個搜索建議項 if (result.length > 4) { result = result.slice(0, 5) } for (let i = 0; i < result.length; i++) { // 動態(tài)創(chuàng)建li標簽 var liObj = document.createElement('li'); liObj.innerHTML = result[i]; searchResult.appendChild(liObj); } // 自執(zhí)行匿名函數(shù)--刪除用于跨域的script標簽 (function () { var s = document.querySelectorAll(’script’); for (var i = 1, len = s.length; i < len; i++) { document.body.removeChild(s[i]); } })() } function jumpPage() { window.open(`https://www.baidu.com/s?word=${encodeURI(searchInput.value)}`); } // 事件委托 點擊li標簽或者點擊搜索按鈕跳轉到百度搜索頁面 bgDiv.addEventListener('click', function (e) { if (e.target.nodeName.toLowerCase() === ’li’) { var keywords = e.target.innerText; searchInput.value = keywords; jumpPage(); } else if (e.target.id === ’btn’) { jumpPage(); } }, false); var i = 0; var flag = 1; // 事件委托 監(jiān)聽鍵盤事件 bgDiv.addEventListener('keydown', function (e) { var size = searchResult.childNodes.length; if (e.keyCode === 13) { jumpPage(); }; // 鍵盤向下事件 if (e.keyCode === 40) { if (flag === 0) { i = i + 2; } flag = 1; e.preventDefault(); if (i >= size) { i = 0; } if (i < size) { searchInput.value = searchResult.childNodes[i++].innerText; } }; // 鍵盤向上事件 if (e.keyCode === 38) { if (flag === 1) { i = i - 2; } flag = 0; e.preventDefault(); if (i < 0) { i = size - 1; } if (i > -1) { searchInput.value = searchResult.childNodes[i--].innerText; } }; }, false); // 點擊頁面任何其他地方 搜索結果框消失 document.onclick = () => clearContent() </script></body></html>

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: 百度
相關文章:
主站蜘蛛池模板: 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 3A别墅漆/3A环保漆_广东美涂士建材股份有限公司【官网】 | 同学聚会纪念册制作_毕业相册制作-成都顺时针宣传画册设计公司 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测| 硬齿面减速机_厂家-山东安吉富传动设备股份有限公司 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 东风体检车厂家_公共卫生体检车_医院体检车_移动体检车-锦沅科贸 | 超声波焊接机_超音波熔接机_超声波塑焊机十大品牌_塑料超声波焊接设备厂家 | 北京网站建设|北京网站开发|北京网站设计|高端做网站公司 | 包塑软管|金属软管|包塑金属软管-闵彬管业 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | HYDAC过滤器,HYDAC滤芯,现货ATOS油泵,ATOS比例阀-东莞市广联自动化科技有限公司 | 今日扫码_溯源二维码_产品防伪一物一码_红包墙营销方案 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 分轨 | 上传文件,即刻分离人声和伴奏 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 砂石生产线_石料生产线设备_制砂生产线设备价格_生产厂家-河南中誉鼎力智能装备有限公司 | 郑州水质检测中心_井水检测_河南废气检测_河南中环嘉创检测 | sfp光模块,高速万兆光模块工厂-性价比更高的光纤模块制造商-武汉恒泰通 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 旋转气浴恒温振荡器-往复式水浴恒温振荡器-金怡百科 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 深圳侦探联系方式_深圳小三调查取证公司_深圳小三分离机构 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 同步带轮_同步带_同步轮_iHF合发齿轮厂家-深圳市合发齿轮机械有限公司 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 酒精检测棒,数显温湿度计,酒安酒精测试仪,酒精检测仪,呼气式酒精检测仪-郑州欧诺仪器有限公司 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 扬子叉车厂家_升降平台_电动搬运车|堆高车-扬子仓储叉车官网 | 团建-拓展-拓展培训-拓展训练-户外拓展训练基地[无锡劲途] | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 |