• JSONP跨域实现原理
  • 百度联想词跨域实现

一、JSONP跨域实现原理

1.Web页面使用<script>引入JS文件时不受同源策略的影响。准确的说,所有拥有src属性的标签都不受同源策略的影响,都具备跨域的能力。比如script、img、iframe。

2.JS脚本被加载后都会被浏览器内核从上到下解析执行一遍。

3.但是因为网络请求是浏览器内核异步执行,无法掌握异步加载的脚本的加载状况。所以,需要将资源传入一个立即执行的回调函数。

4.在全局JS资源上定义一个回调函数,用来处理传入的资源。

5.在通过src获取数据的时候,将全局JS上的回调函数名作为请求变量值传入。

6.后台将数据与回调函数名拼接成一个立即执行的字符串形式,当数据全部传送到后执行。

//处理jsonp数据的回调函数
var doJSONP = function(data){
console.log(data.a);
}
//采用添加script获取外部资源
function jsonp(){
var value = this.value;
var oScript = document.createElement("script");
oScript.src = "http:xxx.com/index.php?cb=doJSONP";
document.body.appendChild(oScript);
oScript.remove();
}

在后台数据拼接成字符串形式:

'doJSONP({a:"123"})'

二、百度联想词跨域实现

<input type="" name="" class="jsonpInput" />
<ul class="assList"></ul>
<script >
//添加事件的公共方法
function addEvent(elem,type,handle){
if(elem.addEventListener){
elem.addEventListener(type,handle,false);
}else if(elem.attachEvent){
elem.attachEvent('on' + type, function(){
handle.call(elem);
});
}else{
     type = type.substring(0,1).toUpperCase()+type.substring(1);
elem['on' + type] = handle;
}
}
//回调函数(拿到数据新增列表项)
var doJSONP = function(data){
var s = data.s || [];
assList.innerHTML="";
if(s.length > 0){
try{
s.forEach(function(ele,index){
var aNoHTML = document.createElement("a");
aNoHTML.href = "https://www.baidu.com/s?wd="+ ele;
aNoHTML.target = "_blank";
aNoHTML.innerHTML='<li>' + ele + '</li>';
addEvent(aNoHTML,"mouseup",function(){
assList.style.display = "none";
});
assList.appendChild(aNoHTML);
if(index > 3){
var a = aaaaa; //引用try报错机制跳出循环
throw new Error("ending");
}
});
}catch(e){ }
assList.style.display = "block";
}else{
assList.style.display = "none";
assList.innerHTML="";
}
}
//获取input、ul标签
var jsonpInput = document.getElementsByClassName("jsonpInput")[0];
var assList = document.getElementsByClassName("assList")[0];
//添加input事件
addEvent(jsonpInput,"input",function(){
var value = this.value;
var oScript = document.createElement("script");
oScript.src = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=" + value +"&cb=doJSONP";
document.body.appendChild(oScript);
oScript.remove();
}
); </script>

百度的连接可能会修改。

计算机网络之JSONP跨域的更多相关文章

  1. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  2. 借助node实战JSONP跨域

    一.前言: 浏览器安全是基于同源策略的.所谓同源策略就是三相同: 1.协议相同: 2.域名相同: 3.端口相同. 但,凡事都是有利弊,同源策略也导致了我们想用AJAX跨域请求,但NO!!为了规避这种限 ...

  3. jsonp跨域+ashx(示例)

    前言 做B/S项目的时候,我们一般使用jquery+ashx来实现异步的一些操作,比如后台获取一些数据到前台,但是如果ashx文件不在本项目下,引用的是别的域下的文件,这时候就访问不了.关于jsonp ...

  4. Jsonp跨域访问

    很早之前看过好几篇跨域访问的文章,然后做项目的时候基本没有遇到跨域访问的问题.不过该来的还是会来,前些天终于让我遇到了.于是重温了一下原理这些,再进行实战.于是现在也敢通过实战后的一些理解来和大家分享 ...

  5. jsonp 跨域请求

    背景: JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源 ...

  6. 我的jsonp跨域问题

    关于jsonp跨域问题,在这个方面也是了解一点点,先记录下来,主要作为以后查看,之前下载并安装过wampserver,了解到了jsonp和json的区别,现在谈谈跨域这个问题: 首先什么是跨域,简单地 ...

  7. jsonP跨域调用

    -------------------------------------jsonP跨域调用------------------------------------- <div class=&q ...

  8. JSONP跨域的原理解析( 一种脚本注入行为)

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制, 被称为“some-Origin Policy”(同源策略).这一策略对于Jav ...

  9. jsonp跨域问题

    JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式). 同源策略限制 ...

随机推荐

  1. sqlserver安装报错:an error was encountered 数据无效

    解决方法:下载的包损坏,重新下载包

  2. 【shell实例】定时21:00-21:05,循环调用DSQL脚本,其它时段自动退出

    1.功能描述: 每日21:00定时调起test.sh,循环调起DSQL脚本test.dsql,直到21:05程序自动退出,捕获日志到相应log文件中. 2.日志文件: (1)日期.log文件中含Err ...

  3. 【spring源码分析】IOC容器初始化(七)

    前言:在[spring源码分析]IOC容器初始化(六)中分析了从单例缓存中加载bean对象,由于篇幅原因其核心函数 FactoryBeanRegistrySupport#getObjectFromFa ...

  4. 使用jquery模拟请求,测试项目是否存在跨域限制

    1.Get 请求 <html> <head><script src="https://cdn.staticfile.org/jquery/1.10.2/jque ...

  5. 【html】使用img标签和背景图片之间的区别

    1.加载问题 背景图片会等到html结构加载完成才开始加载 img标签是网页结构的一部分,会在html结构加载的时候加载 在网页加载的过程中,背景图片会等到结构加载完成(网页的内容全部显示以后)才开始 ...

  6. 【憩园】C#并发编程之异步编程(一)

    写在前面 C#5.0中,对异步编程进行了一次革命性的重构,引入了async和await这两个关键字,使得开发人员在不需要深刻了解异步编程的底层原理,就可以写出十分优美而又代码量极少的代码.如果使用得当 ...

  7. Spring Boot与缓存

    ---恢复内容开始--- JSR-107.Spring缓存抽象.整合Redis 一.JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheMana ...

  8. 'python'不是内部或外部命令,也不是可运行程序或批处理文件

    配置两个环境变量: 我的电脑——属性——高级系统设置——环境变量——用户变量——path(新建) 1.配置python\python.exe所在的路径       path新建:C:\Users\Py ...

  9. plus调用android原生页面

    var main = plus.android.runtimeMainActivity(); var Intent = plus.android.importClass("android.c ...

  10. bzoj 3669: [Noi2014]魔法森林 (LCT)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3669 题面: 3669: [Noi2014]魔法森林 Time Limit: 30 Sec  ...