返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JSONP跨域模拟百度搜索
  • 696
分享到

JSONP跨域模拟百度搜索

2024-04-02 19:04:59 696人浏览 安东尼
摘要

目录一、什么是JSONP二、jsONP跨域请求三、模拟百度搜索四、JSONP缺点一、什么是JSONP JSONP是JSON with padding(填充式JSON或参数式JSON)

一、什么是JSONP

JSONPJSON with padding(填充式JSON或参数式JSON)的简写,是应用JSON的一种新方法,在后来的WEB服务中非常流行,JSONP看起来与JSON差不多,只不过是被包含在函数中调用的JSON,就像下面这样:


callback({"name": "王欢"});

SONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面 中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的JSON数据。下面就是一个典型的JSONP请求。


https://freegeoip.net/json/?callback=handleResponse

        这个URL是在请求一个JSONP地理定位服务,通过查询字符串来指定JSONP服务的回调参数是很常见的,就像上面的URL所示,这里指定的回调函数的名字叫做:handleResponse()
        JSONP是通过动态<script>元素来使用的,使用时可以为src属性指定一个跨域URL。可以不受限制的从其他域加载资源,因为JSONP是有效的javascript代码,所以在请求完成后,即在JSONP响应加载到页面中以后,就会立即执行。

二、JSONP跨域请求

        我们知道,同源策略是浏览器的一种安全机制,所谓的源是指协议、域名和端口号,当我们的脚本在运行时,浏览器会检测它所执行的脚本和他所取得的的数据与我们html页面是否相同,如果相同,就是同源的,会进行成功的请求,如果他们的源不相同,就是跨域请求。在默认情况下,浏览器是不支持跨域请求的,那么如果我们想要跨域请求,该如何操作呢?
        script标签是不受同源策略的限制的,即我们在请求script脚本的时候,无论是在HTML所在的服务器还是其他服务器,它都可以请求到,所以我们就利用script标签的这种性质来进行数据的跨域请求。就来看看JSONP是如何进行跨域请求的。
        首先,我们请求一段script代码,这段代码里如果它能调用我们所指定的一个函数,并将数据作为实参传递进来,那么只要我们定义了这个函数并定义了形参,形参就会接收到他的实参来得到数据。举个例子:
        假设在脚本中定义了一个getData(data) ,如果现在请求一个脚本,这个脚本能够调用getData()这个函数,并将data 作为实参传递进来,那形参收到的数据就可以进行相应的处理。


<script>
        function getData(data){
            console.log(data);
        }
        var script = document.createElement('script');
        script.id = 'jsonp';
        script.src = 'jsonp.js';
        document.body.appendChild(script);
    </script>

        假设前端已经把函数名告诉了后端,后端就可以调用这个getData() ,并且可以传递信息。在jsonp.html就可以请求到下述jsonp.js文件。


getData({
    name: '小王',
    age: 20
})

        运行得到结果为:

  

  

        得到了一个Object对象,就是我们所传递的数据。
        那么,我们如何告诉服务器getData()这个函数呢?如果我们每次都固定是getData(),我们的开发会很死板,就不能定义其他函数名字。实际上,我们可以通过get请求将我们前端定义的函数名字通过参数告诉后端,后端动态生成这样的一个脚本文件并返回给函数的调用就可以。
        百度就有一个这样的接口,我们一起来看看。
        打开浏览器百度页面,打开调试工具,看一下NETwork标签下面会监听所有关于浏览器向服务器发送的Http请求并查看数据。

        在搜索框键入“b”,请求如图:

        请求得到的关键字为:

在这里插入图片描述

        这里的callback函数其实是Jquery生成的一个全局函数。得到这个URL后,我们可以保存其有用的信息,并将回调函数换成别的函数:


https://www.baidu.com/sugrec?pre=1&wd=b&req=2&csor=1&cb=getData();


       将其输入到地址栏中进行测试:

        可以发现,这个回调函数就变成了我们设置的。

三、模拟百度搜索

       我们现在就可以通过这个接口去发生JSON来模拟一下百度搜索页面。
我们定义一个全局变量作为接收数据的函数,data就是接收到的数据,一旦getdata()函数被调用,说明我们我们的Jsonp函数就发送完成,此时可以通过removeChild()删除script标签,这样就可以实现每当我们发送一次请求,script标签在接收到数据后就会被删除,在数据处理的时候,getData()返回给我们的是一个对象,对象里面有一个关键字g,里面对应的是一个数组,数组里面是字符串,我们先将这个数组遍历,然后根据每个元素生成一个li加到input下面的ul就可以,先将ul里面的html清空,这样的话,每次请求的li都是全新的,当keyup出来的时候,首先取到当前input的value值并调用getdata()函数,将wd传进来,就实现了jsonp传递数据的过程。

代码如下:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            position: relative;
            width: 600px;
            height: 40px;
        }
        input {
            width: 500px;
            height: 40px;
            border: 2px solid #4E6EF2;
        }
        button{
            position: absolute;
            left: 411px;
            top: 0;
            width: 95px;
            height: 44px;
            background-color: #4E6EF2;
            border: none;
            font-size: 18px;
            color: white;
        }
        ul{
            position: relative;
            left: -40px;
            top: -10px;
            width: 411px;
            height: 400px;
            
        }
        li{
            height: 40px;
            width: 411px;
            line-height: 40px;
            font-size: 16px;
            list-style: none;

        }
    </style>
</head>
<body>
   <div>
    <input type="text" value =''>
    <button>百度一下</button>
   </div>
    <ul></ul>
    <script src="jquery.js"></script>
    <script>
     //
        function getData(data){
            var script = document.querySelector('#jsonp');
            script.parentnode.removeChild(script);
            $('ul').html('');
            for(var i =0;i<data.g.length;i++){
                $('<li>'+data.g[i].q +'</li>').appendTo('ul');
            }
        }
        //动态生成script脚本
        function getList(wd){
            var script = document.createElement('script');
            script.id = 'jsonp';
            script.src = 'https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=26350&req=2&csor=1&cb=getData&wd='+wd;
           
            document.body.appendChild(script);
        }
  //给
        var ipt = document.querySelector('input');
        ipt.addEventListener('keyup',function(){
            var wd = this.value;
            getList(wd);
            console.log(wd);
        })
    </script>
</body>
</html>

效果为:

四、JSONP缺点

        JSONP之所以在开发人员中极为流行,是因为它非常简单易用,不过他也有两点不足:

  • 首先,JSONP是从其他域中加载执行代码。如果其他域不安全,很可能会在响应中夹带一些恶意代码,而此时除了完全放弃JSONP调用之外,没有办法追究。
  • 其次,要确定JSONP请求是否失败并不容易。虽然HTML5<script>元素新增了一个onerror事件处理程序,但目前还没有得到任何浏览器的支持。为此,开发人员不得不使用计时器检测指定时间内是否接收到了响应。但是毕竟不是每个用户的上网速度和带宽都一样,所以操作起来也不尽人意。

到此这篇关于JSONP跨域模拟百度搜索的文章就介绍到这了,更多相关JSONP跨域模拟百度搜索内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JSONP跨域模拟百度搜索

本文链接: https://www.lsjlt.com/news/160220.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JSONP跨域模拟百度搜索
    目录一、什么是JSONP二、JSONP跨域请求三、模拟百度搜索四、JSONP缺点一、什么是JSONP JSONP是JSON with padding(填充式JSON或参数式JSON)...
    99+
    2024-04-02
  • 如何进行JSONP跨域模拟百度搜索
    这篇文章将为大家详细讲解有关如何进行JSONP跨域模拟百度搜索,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、什么是JSONPJSONP是JSON with padding(填充式JSON...
    99+
    2023-06-22
  • JS模拟百度搜索框和选项卡的实现
    目录练习1 练习2,选项卡,详细代码如下:练习1 实现搜索框内,输入相关数字,在下方显示相关内容,模拟百度搜索,详细代码如下: <!DOCTYPE html> ...
    99+
    2024-04-02
  • Python10行代码实现模拟百度搜索的示例
    目录1. 获取百度搜索接口2. 指定搜索内容3. UA伪装4. 将响应内容写入文件5. 使用浏览器打开页面1000块钱做个百度?能提出这种要求的客户实乃乙方克星、民族之光、科创永动机...
    99+
    2024-04-02
  • JS如何模拟实现百度搜索框和选项卡
    这篇文章主要介绍了JS如何模拟实现百度搜索框和选项卡,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。练习1实现搜索框内,输入相关数字,在下方显示相关内容,模拟百度搜索,详细代码...
    99+
    2023-06-29
  • win10搜索框如何设置百度搜索
    这篇文章主要介绍“win10搜索框如何设置百度搜索”,在日常操作中,相信很多人在win10搜索框如何设置百度搜索问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”win10搜索框如何设置百度搜索”的疑惑有所帮助!...
    99+
    2023-07-01
  • 百度搜索引擎一些鲜为人知的深度搜索语法
    目录搜索语法汇总【建议收藏】1、filetype  搜索文件的后缀或者扩展名2、info 网站基本信息3、inurl 网址链接包含的关键字4、 index of 对搜索引擎...
    99+
    2024-04-02
  • python实现简单的百度搜索
    #!/usr/bin/python # coding=utf-8 import urllib import urllib2 #实现百度关键字查询的小例子 #定义基础url url = "http://www.baidu.com/s" ...
    99+
    2023-01-31
    百度搜索 简单 python
  • js怎么实现百度搜索提示框
    小编给大家分享一下js怎么实现百度搜索提示框,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果如下所示话不多说,请看代码:<...
    99+
    2024-04-02
  • 使用JavaScript编写一个百度搜索框
    使用JavaScript编写一个百度搜索框?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实现原理向输入框动态输入时关键词,将当前关键词作为问号参数后面的值,因为要跨域使用百度的...
    99+
    2023-06-06
  • Python项目实战:百度百科关键字搜索信息
    前言今天为大家利用Python的format转发关键字来获取百度百科搜索信息,比如说你不懂一个名词,动词是什么意思,你可上百度百科上面自行搜索,今天用Python模拟百度百科搜索信息功能导入第三方库...
    99+
    2023-06-02
  • Python模拟百度登录实例
    原文:http://www.jb51.net/article/78406.htm 记录下来,慢慢学习: 要先获取token,然后再登录 # -*- coding: utf8 -*- import urll...
    99+
    2023-01-31
    实例 Python
  • Python通过tkinter实现百度搜索的代码
    本篇内容介绍了“Python通过tkinter实现百度搜索的代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python主要用来做什么Py...
    99+
    2023-06-14
  • php如何实现类似百度搜索功能
    这篇“php如何实现类似百度搜索功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php如何实现类似百度搜索功能”文章吧。p...
    99+
    2023-07-05
  • 仿百度的关键词匹配搜索示例
    复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Typ...
    99+
    2022-11-15
    关键词 匹配搜索
  • 2016年百度搜索各大算法有哪些
    这篇文章主要讲解了“2016年百度搜索各大算法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“2016年百度搜索各大算法有哪些”吧!  先来个算法总体回顾,2016年共公布6大算法,下面...
    99+
    2023-06-10
  • 百度站内搜索不支持https怎么办
    这篇文章将为大家详细讲解有关百度站内搜索不支持https怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近手机端开启了https,为了绿锁需要解决如下问题:图片jscss样式form查询也要用htt...
    99+
    2023-06-08
  • Android实现模拟搜索功能
    本文实例为大家分享了Android实现模拟搜索功能的具体代码,供大家参考,具体内容如下 先看效果图,合适了再接着往下看: 我们看到的这个页面,是由两部分组成,顶部的自定义的搜索框,...
    99+
    2024-04-02
  • android百度地图之公交线路详情搜索
    本篇文章可以实现百度公交线路搜索,可以选择多条线路,具体实现代码如下: 一、公交线路详情检索 获取公交线路的详情主要分来两步,1.获取公交线路的Uid,2.通过Uid获取公...
    99+
    2022-06-06
    地图 Android
  • Dreamweaver如何制作百度搜索栏静态页面
    这篇文章主要介绍了Dreamweaver如何制作百度搜索栏静态页面,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。方法如下:如果将搜索框分为块状,可以将他分为4段,如图所示打开...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作