jsonp跨域及实现百度首页联想功能的方法


Posted in Javascript onAugust 30, 2018

什么是跨域呢?

比如说ajax必须在自己的域(名)之下,才能进行异步的请求,如果不是在同一个域之下就不能进行请求,会报错。比如说我们用ajax去请求腾讯的API如果我们的这个域不在腾讯那个接口的'白名单'里面,腾讯的接口就会拒绝给我返回数据。但是大多数情况下,我们不可能每次都去去相应的网站申请一个'白名单',这个时候我们就要用到跨域这种方法,跨域有很多方式比如说用iframe但是这种的可操作性太差了,不能操作frame里面的DOM元素。当先最流行的一种的方式是使用jsonp这种方式。

什么是JSONP

jsonp是英文为json with padding的简称。简单地来说jsonp就是script标签,通常的我们把script,link,img叫做资源标签,也就是能连接资源的意思。只要记住了jsonp就是script标签就好了。下面我们来说下一部分:

script标签怎么引入数据

我们如果知道操作系统并不是靠后缀名来识别一个文件的,是靠文件里面的内容来识别的,后缀名知识更利于第三方的软件进行查看。比如说我们把a.txt改为a.png那么我门用图片查看器打开的时候也是显示的图片不存在的(如果学过Linux的同学会更好的理解)。【有兴趣的同学可以尝试这把一个js文件的后缀改为其他格式再引入试试】。那么我们就解决的script如何引入数据的问题了,也就是说我们可以用script标签引用一个json或者.php的资源文件.

就算能引入资源,那么资源怎么使用呢

先举个简单地例子,比如我们在一个a.json定义了下面的一个变量

"text";

我们在HTML中去加载它,然后去执行,如下代码:

<script src="./a.json"></script>
<script>
alert(str); //text
</script>

这样是能正确执行了,但是我们也知道json数据中并没有定义什么变量和方法的,这个就好像下面的方式:

var str="text";

我们在HTML中去加载它,然后去执行,如下代码:

<script src="./a.json"></script>
<script>
alert(str); //error
</script>

这样显然是会报错的,那么跨域解决之后就要解决怎么使用这个资源的问题了。

我们先和后台定义一个方式,把所有的数据作为一个函数的参数去调用函数,当然这个函数是我们预先定义好的了,如下面的格式:

function solve(data){
//使用数据
}
<script src="./a.json"></script>

下面我们来看看a.json是怎么定义的

solve(100);
solve({});
//相当于a.json里面的数据作为参数传递到了solve函数里面,然后,在solve函数里面操作这个数据就可以了

资源里面要有几个方法

先看下面的例子,当我们引入一个PHP动态资源的时候

<?php
$t = isset($_GET['t']) ? $_GET['t'] : 'num';
$a = "111";
$b = "aaa";
if ($t == 'num') {
$data = json_encode($a);
} else {
$data = json_encode($b);
}
echo solve($data)

比如我们有两个按钮一个按钮执行的时候要求,收到$a另一个要求收到$b,那我们应该怎么搞?在pho文件中加一个solve()?这样虽然是可取的,如果有n种请求呢,只要加n个方法,这样肯定是不行的。我们怎么解决呢?有一个很好的方法就是在请求的时候就把函数名字加进去,例如下面的方式:

<?php
$t = isset($_GET['t']) ? $_GET['t'] : 'num';
$callback = isset($_GET['callback']) ? $_GET['callback'] : 'fn1';

$arr1 = array('111111','22222222','33333333','4444444','555555555555555555555');
$arr2 = array('aaaaaaaaaaaa','bbbbbbbb','cccccccccccc','ddddddddd','eeeeeeeeeeee');

if ($t == 'num') {
$data = json_encode($arr1);
} else {
$data = json_encode($arr2);
}

echo $callback.'('.$data.');';

这样就能很好的规避这个问题了。

好了,如果上面的东西你都连接了,那么你就差不多知道什么是跨域和怎么解决跨域了,那么光说不练还是不好的,我们就用百度的搜索API来简单联系一下。

当然啦,还有一个重要的问题,jsonp加载的时候应该是动态加载的,我们应该用代码创建。

jsonp跨域实现百度首页联想功能

主要思路是利用jsonp的跨域,使用百度后台接口,根据input框的内容,向后台拿数据,然后展示在搜索框下面,并且li使用的是a标签包裹,基本实现了和百度首页收缩然后跳转的功能

结果截图

<script>
   var timer = null // 防抖动
   var domInput = document.getElementById('input')
   var domul = document.getElementsByTagName('ul')[0]
   domInput.oninput = function (e) {
    clearTimeout(timer) //防抖动
    timer = setTimeout(function () {
     var domScript = document.createElement('script')
     domScript.src = 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd='+ e.target.value +'&cb=jsonpCb' // jsonp实现
     document.body.appendChild(domScript)
    }, 100)
   }
   function jsonpCb (data) { // jsonp的回调函数的实现
    let result = ''
    data.s.forEach(element => {
     result += '<li><a href= ' + 'https://www.baidu.com/s?wd=' + element + '>' + element +'</a></li>'
    });
    domul.innerHTML = result
   }
  </script>

jsonp跨域及实现百度首页联想功能的方法

可实现点击联想词跳转

jsonp跨域及实现百度首页联想功能的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 监听textarea中按键事件
Oct 08 Javascript
复制小说文本时出现的随机乱码的去除方法
Sep 07 Javascript
javascript实现文本域写入字符时限定字数
Feb 12 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
Mar 13 Javascript
原生js实现移动开发轮播图、相册滑动特效
Apr 17 Javascript
js带前后翻页的图片切换效果代码分享
Sep 08 Javascript
学习JavaScript设计模式(策略模式)
Nov 26 Javascript
深入理解ECMAScript的几个关键语句
Jun 01 Javascript
javascript中的try catch异常捕获机制用法分析
Dec 14 Javascript
Bootstrap 填充Json数据的实例代码
Jan 11 Javascript
解决jquery有正确返回值但不执行success函数的问题
Aug 20 jQuery
webpack常用构建优化策略小结
Nov 21 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
Aug 30 #Javascript
解决vue的变量在settimeout内部效果失效的问题
Aug 30 #Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
Aug 30 #Javascript
详解React native fetch遇到的坑
Aug 30 #Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
Aug 30 #Javascript
原生JS实现简单的倒计时功能示例
Aug 30 #Javascript
JavaScript fetch接口案例解析
Aug 30 #Javascript
You might like
PHP中session变量的销毁
2014/02/27 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
JavaScript 正则表达式中global模式的特性
2016/02/25 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
Python编程中NotImplementedError的使用方法
2018/04/21 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
汉森批发:Hansen Wholesale
2018/05/24 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
违反学校规则制度检讨书
2015/01/01 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
郭明义观后感
2015/06/08 职场文书
同学聚会感言一句话
2015/07/30 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
新手初学Java网络编程
2021/07/07 Java/Android
Python+pyaudio实现音频控制示例详解
2022/07/23 Python