利用jsonp實現百度搜索--讓你徹底弄懂jsonp

各位同好,這篇文章是關于如何在自己的網站中實現百度搜索框的效果,所利用的是jsonp相關的知識點,所以在代碼實現之前先普及一下jsonp是用來干嘛的。

首先,我們知道jsonp是用來跨域的,那么,為什么要跨域呢,這里就是因為瀏覽器有一個同源策略的機制,同源策略阻止從一個源加載的文檔或腳本獲取或設置另一個源加載的文檔的屬性。

這里可能用朋友就會疑問,什么叫做同源,同源嘛,字面意思理解就是同一個源,所以,關鍵是在“源”上面。

一個的定義 (詳情)

如果協(xié)議,端口(如果指定了一個)和主機對于兩個頁面是相同的,則兩個頁面具有相同的。

因為這個機制,所以,今天我們要做的在你的個人網站上實現百度搜索的阻礙就是這個,那么jsonp就是來解決這個問題的。
知道了為什么要使用jsonp,那它到底是如何實現的呢?

早在很久以前,為了解決這個問題,機智的前輩們就發(fā)現,Web頁面上調用js文件時則不受是否跨域的影響(不僅如此,我們還發(fā)現凡是擁有"src"這個屬性的標簽都擁有跨域的能力,比如script、img、iframe)

首先我們來看一下,百度本身是怎么做的。
打開chrome,在chrome的調試窗口下看看百度搜索發(fā)出的請求。當輸入關鍵字“LOL”,如下圖:

Paste_Image.png

這里產生了一條類型為script的請求,這就是我們需要的東西,可以點開看一下里面是什么

Paste_Image.png

我們可以看到一個名為“JQuery110204094770724259329_1479977887752”的對象,這個對象里包含的,就是我們所需要的數據,比如圖片上對象下方的,g , p , q , s 這些,那這個對象是怎么被請求過來的呢?

Paste_Image.png

我們分析這個地址,我把它復制下來

https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=lol&sugmode=2&json=1&p=3&sid=1448_19036_18240_17944_21084_18560_17001_20593_21455_21409_21553_21378_21399&req=2&bs=lol&pbs=lol&csor=3&pwd=lol&cb=jQuery110204094770724259329_1479977887752&_=1479977887766

可以在鏈接的末尾看到我們熟悉的名字,所以我們可以知道,服務器是通過這個字段&cb=jQuery110204094770724259329_1479977887752將我們所需要的數據打包過來的,那我們如何接收呢,就是通過script標簽的src
例如:
<script src="http://www.baidu.com/su?wd='+關鍵字+'&cb=方法名';">

補充:經測試鏈接中間的那些可有可無,所以在這里將他們都刪除了,只留下最重要的不能缺少的,還有就是方法名是可以隨自己的喜好隨意取名的。關鍵字就是你在輸入框里所輸入的內容,我們會用this.value代替。

那么現在,這個數據就被我們加載到了自己的頁面中,就在這個方法名里面,接下來我們只需要將它解析出來,就可以為我們所用了。

弄清楚了上面這些,下面就開始實現我們今天要實現的百度搜索智能提示功能。
首先是HTML+CSS部分

<style>
    #keywords {width: 300px; height: 30px; padding: 5px; border:1px solid #f90; font-size: 16px;}
    #relative {border:1px solid #f90; width: 310px; margin: 0;padding: 0; display: none;}
    li a { line-height: 30px; padding: 5px; text-decoration: none; color: black; display: block;}
    li a:hover{ background: #f90; color: white; }
</style>
body>
    <input type="text" id="keywords" />
    <ul id="relative"></ul>
</body>

然后是js部分,做一下數據解析并在頁面渲染出來的工作。

<script>
//在這里通過myNeed函數解析數據
function myNeed(data) {
    var relative = document.getElementById('relative');
    var html = '';
    //由上文知道,我們所需要的字段都在s里面存放著
    if (data.s.length) {
        relative.style.display = 'block';
        //這里可以限制一下所需要聯想詞的個數,太多了也沒必要
        for (var i=0; i<data.s.length-5; i++) {
            html += '<li><a target="_blank" + data.s[i] +'</a></li>';
        }
        //渲染到頁面里
        relative.innerHTML = html;
    } else {
        relative.style.display = 'none';
    }
}
window.onload = function() {
    var keywords = document.getElementById('keywords');
    var relative = document.getElementById('relative');

    //每當有鍵盤事件的時候都要有相對應的聯想詞
    keywords.onkeyup = function() {
        //如果有輸入內容的時候,就生成一個script標簽獲取數據
        if ( this.value != '' ) {
            var oScript = document.createElement('script');
            oScript.src = 'http://www.baidu.com/su?wd='+this.value+'&cb=myNeed';
            document.body.appendChild(oScript);
        } else {
            relative.style.display = 'none';
        }
    }
    
}
</script>

以上就是今天我們所要講的內容了,重點我們總結一下,首先知道如何獲取數據(通過script標簽),然后再通過解析出對象中所包含的數據并渲染到頁面中來達到我們的目的,實現手法多種多樣,但原理都是一樣的,所以弄清楚了原理,隨便你想怎么玩都可以。就是這么簡單~
在最后,感謝彭創(chuàng)同學

上面所用的demo在我的GitHub里,歡迎路過的同學star,O(∩_∩)O~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1.什么是同源策略 1.要了解同源策略,我們必須先知道源即orgin 以百度頁面為例,谷歌瀏覽器打開控制臺:輸入l...
    GarenWang閱讀 1,560評論 2 8
  • 什么是同源策略 同源政策(same-origin policy)是指同域名(或ip),同端口,同協(xié)議視為同一個域,...
    小囧兔閱讀 685評論 0 1
  • Section1、為什么要跨域? 自古以來(1995年起),為了用戶的信息安全,瀏覽器就引入了同源策略。那么同源策...
    qhaobaba閱讀 467評論 0 0
  • 1. 跨域和同源 首先來看摘自MDN上對于跨域,較為標準的解釋: 當一個資源從與該資源本身所在的服務器不同的域或端...
    曉風殘月1994閱讀 453評論 0 0
  • 大部分情侶分手之后就像是仇人一樣,當時的狀態(tài)簡直恨不得要千刀萬剮。愛的有多重,傷的就有多深。 第一次聽到梁靜茹和古...
    貳鷲閱讀 469評論 1 6

友情鏈接更多精彩內容