javascript 实现jsonp

jsonp原理其实也简单,虽然ajax不能跨域,但是通过src这个属性我们可以实现跨域,其实和我们引入第三方jquery调用它的方法一样的。

html:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>jsonp</title>
<meta name="description" content="">
<meta name="keywords" content="">
<script>
    function jsonp(data){
    	var oUl = document.getElementsByTagName(‘ul‘)[0];
		var aLi = oUl.getElementsByTagName(‘li‘);
		if(data.s.length){
			var htmlText = ‘‘;
			oUl.style.display = ‘block‘;
			for(var i  = 0 ; i < data.s.length; i++){
				htmlText += ‘<li><a target="_blank" href="http://www.baidu.com/s?wd=‘+data.s[i]+‘">‘+data.s[i]+‘</a></li>‘;
			}
			oUl.innerHTML = htmlText
		}else{
			oUl.style.display=‘none‘
		}
    }
    document.onclick = function(e){
    	console.log(e.target.nodeName)
    	if(e.target.nodeName.toLowerCase() != ‘input‘){
    		document.getElementsByTagName(‘ul‘)[0].style.display = ‘none‘
    	}
    }
	window.onload = function(){
		var oInput = document.getElementById(‘search‘);
		oInput.oninput = function(){
			var that= this;
			var scriptTag = document.getElementsByTagName(‘script‘);
			var tempScript =[];
			var reg = /http:\/\/suggestion\.baidu\.com\/su\?wd=(.*)&cb=jsonp/;
			if(scriptTag.length>1){
                for(var i=0 ;i<scriptTag.length;i++){
                	if(scriptTag[i].src && reg.test(scriptTag[i].src)){
                        document.body.removeChild(scriptTag[i]);
                        var oScript = document.createElement(‘script‘);
						oScript.src = ‘http://suggestion.baidu.com/su?wd=‘+this.value+‘&cb=jsonp‘;
						document.body.appendChild(oScript);
                	}
                }
			}else{
				var oScript = document.createElement(‘script‘);
				oScript.src = ‘http://suggestion.baidu.com/su?wd=‘+this.value+‘&cb=jsonp‘;
				document.body.appendChild(oScript);
			}
		}
	}
</script>
<style>
	input{
		width:200px;
		height:40px;
		line-height: 40px;
		text-indent: 5px;
		outline:none;
		border:1px solid #333;
	}
	ul{
		list-style: none;
		padding:0px;
		margin:0px;
		width:200px;
		border:1px solid #333;
		display: none;
	}
	ul li{
		padding: none;
		margin:0px;

	}
	ul li:hover{
		background:#f1f1f1;
	}
	ul li a{
		text-decoration: none;
		color:#333;
		height:40px;
		display: block;
		overflow: hidden;
		text-overflow: ellipsis;
		white-space: nowrap;
		width:100%;
		line-height: 40px;
	}
</style>
</head>
<body>
    <input type="text" id="search">
    <ul>
    </ul>
</body>
</html>

js:

<script>
    function jsonp(data){
    	var oUl = document.getElementsByTagName(‘ul‘)[0];
		var aLi = oUl.getElementsByTagName(‘li‘);
		if(data.s.length){
			var htmlText = ‘‘;
			oUl.style.display = ‘block‘;
			for(var i  = 0 ; i < data.s.length; i++){
				htmlText += ‘<li><a target="_blank" href="http://www.baidu.com/s?wd=‘+data.s[i]+‘">‘+data.s[i]+‘</a></li>‘;
			}
			oUl.innerHTML = htmlText
		}else{
			oUl.style.display=‘none‘
		}
    }
    document.onclick = function(e){
    	console.log(e.target.nodeName)
    	if(e.target.nodeName.toLowerCase() != ‘input‘){
    		document.getElementsByTagName(‘ul‘)[0].style.display = ‘none‘
    	}
    }
	window.onload = function(){
		var oInput = document.getElementById(‘search‘);
		oInput.oninput = function(){
			var that= this;
			var scriptTag = document.getElementsByTagName(‘script‘);
			var tempScript =[];
			var reg = /http:\/\/suggestion\.baidu\.com\/su\?wd=(.*)&cb=jsonp/;
			if(scriptTag.length>1){
                for(var i=0 ;i<scriptTag.length;i++){
                	if(scriptTag[i].src && reg.test(scriptTag[i].src)){
                        document.body.removeChild(scriptTag[i]);
                        var oScript = document.createElement(‘script‘);
						oScript.src = ‘http://suggestion.baidu.com/su?wd=‘+this.value+‘&cb=jsonp‘;
						document.body.appendChild(oScript);
                	}
                }
			}else{
				var oScript = document.createElement(‘script‘);
				oScript.src = ‘http://suggestion.baidu.com/su?wd=‘+this.value+‘&cb=jsonp‘;
				document.body.appendChild(oScript);
			}
		}
	}
</script>

  

时间: 2024-08-02 06:52:52

javascript 实现jsonp的相关文章

javascript笔记——jsonp

上篇博客介绍了同源策略和跨域访问概念,其中提到跨域常用的基本方式:JSONP和CORS. 那这篇博客就介绍JSONP方式.  JSONP原理 在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但img.iframe.script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据. 而JSONP就是通过script节点src调用跨域的请求. 当我们通过JSONP模式请求跨域资源时,服务器返回给客户端一段javascript代码,这段javascript代码自动调用

原生javascript实现jsonp的封装

JSONP即JSON with Padding.由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名.协议.端口)的资源.如果要进行跨域请求, 我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象. 这种跨域的通讯方式称为JSONP. 我们可以动态的去创建一个script标签,利用他的src属性没有跨域的限制来实现的,相当于我们引入一个js文件 附上源码: jsonp: funct

JavaScript的jsonp

目录索引: 一.AJAX的概念二.POST && GET三.原生实现AJAX简单示例 3.1 实现代码 3.2 重点说明四.框架隐藏域 4.1 基本概念 4.2 后台写入脚本 4.3 JS主动判断Iframe的改变 4.4 表单提交数据实战五.JQ 的 AJAX 5.1 load() 5.2 $.get() 5.3 $.post() 5.4 $.getScript() 5.5 $.getJson() 5.6 $.ajax() a. 常用的属性说明 b. 常用的事件说明 c. 全局事件说明

JavaScript实现jsonp&amp;&amp;CORS

(function (global) { var id = 0, container = document.head || document.getElementsByTagName('head')[0]; function jsonp(options) { if (!options || !options.url) return; var scriptNode = document.createElement("script"), url = options.url, data =

原生javascript里jsonp的实现原理

ajax不能跨域,jsonp可以跨域 跨域的核心思想: 调用(拿到的接口),定义(jsonp核心处理器)分别是不同的script标签里面进行跨script取数据(只有get方式进行取数据 ) jsonp传进来的数据是{url:'',data:{ cbName='cb',(根据接口制定的命名规范,有些事叫callback) wd='aaa', ......(之后的数据都要进行字符串拼接) },success:function(result){}} 一:设置默认状态(容错处理) json=json|

javascript实现jsonp跨域问题+原理

在工作中往往存在跨域的问题 ,跨域是什么概念就不在这里了,搜这类问题的肯定已经知道了.下面直接探讨jsonp跨域原理 jspon跨域原理: 1.动态创建一个script标签 var script = document.createElement("script"); 2.添加src属性,value也就是所谓的接口的写入(注:此处要返回的是一个回调函数callback:这里可以省略callback字段写成 script.src = "http://xxxx.com/?user=

javascript - 封装jsonp

jsonp牵扯到同源策略.跨域等问题,这里不细说了. 实现就是创建动态的script标签来请求后台地址: 示例: jsonp('xxx.php', { uid: 1 }, function (res) { console.log(res) }) 实例: jsonp('http://localhost/server.php', { uid: 1 }, function (res) { console.log(res) }) 1 function jsonp (url, params, callba

jsonp与cors跨域的一些理解(转)

CORS其实出现时间不短了,它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而这种访问是被同源策略所禁止的.CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求. 它是一个妥协,有更大的灵活性,但比起简单地允许所有这些的要求来说更加安全. 而W3C的官方文档目前还是工作草案,但是正在朝着W3C推荐的方向前进. 简言之,CORS就是为了让AJAX可以实现可控的跨域访问而生的. 浏览器的同源策

【跨域】#001 JSONP原理解析【总结】

一.JSONP 是什么? 1.1 概念 JSONP(JSON with Padding)是资料格式 JSON 的一种"使用模式",可以让网页从别的网域要资料.由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server2.example.com 的服务器沟通,而 HTML 的 <script> 元素是一个例外. 利用 <script> 元素的开源策略,从其他域 动态的获取 数据,这就是JSONP.(让使用者利用 script