基于原生js的jsonp方法的实现

a正东      2022-02-10     172

关键词:

基于原生JS的jsonp方法的实现

jsonp,相信大家并不陌生,是在js异步请求中解决跨域的方法之一,原理很简单,有不清楚的同学可以google下,这里就补详细解释了。在Jquery库中,jQuery直接封装有jsonp的方法,很简便,只需在ajax请求的参数中加入datatype:jsonp,jsonp:jsonpcallback即可,这里写下用原生js实现jsonp的源码。

load= function (url, cfg, success) {
    var op = Object.prototype.toString;
    var head = doc.getElementsByTagName(‘head‘)[0] || doc.head || doc.documentElement;
    if (op.call(cfg) === ‘[object Function]‘) {
        success = cfg;
        cfg = {};
    }
    var type = cfg.type || ‘script‘,
        jsonpCallback = cfg.jsonpCallback || ‘fn‘;
    jsonp = type == ‘jsonp‘ ? (cfg.callbackName || ‘callback‘) : ‘‘, data = cfg.data || ‘‘, dataToParam = function (data) {
        var ret = [],
            key, e = encodeURIComponent;
        for (key in data) {
            ret.push(key + ‘=‘ + e(data[key]))
        }
        return ret.join(‘&‘);
    }, url = url + (/?/.test(url) ? ‘&‘ : (jsonp || data) ? ‘?‘ : ‘‘) + (jsonp ? (jsonp + ‘=‘ + jsonpCallback) : ‘‘) + (data ? ‘&‘ + dataToParam(data) : ‘‘);
    loadScript = function (url, callback) {
        var script = doc.createElement("script");
        script.type = "text/javascript";
        script.charset = "utf-8";
        if (script.readyState) { //IE
            script.onreadystatechange = function () {
                if (/loaded|complete/i.test(script.readyState)) {
                    script.onreadystatechange = null;
                    callback && callback.call(this);
                }
            };
        } else { //Others
            script.onload = function () {
                callback && callback.call(this);
            };
        }
        script.src = url;
        head.insertBefore(script, head.firstChild);
    }, removeScript = function () {
        var arg = arguments,
            script = arg[0],
            jsonpCallback = arg[1],
            type = Object.prototype.toString;
        //移除脚本
        if (script && /script/i.test(script.tagName)) {
            script.parentNode.removeChild(script);
        }
        //移除回调
        if (jsonpCallback && type.call(jsonpCallback) === ‘[object String]‘) {
            window[jsonpCallback] = null;
        }
        success();
    };
    var callback = window[jsonpCallback] = success;
    loadScript(url, function () {
        removeScript(this, jsonpCallback);
    });
}

调用方法:load(url,{"type":"script":"data":{}},calback);,原理和方法都很简单,但是jsonp方法只适合于GET方法儿不适合POST方法,这个还是需要注意的。

 

收藏了

http://lidongbest5.com/blog/20/

原生javascript里jsonp的实现原理

ajax不能跨域,jsonp可以跨域跨域的核心思想:     调用(拿到的接口),定义(jsonp核心处理器)分别是不同的script标签里面进行跨script取数据(只有get方式进行取数据) jsonp传进来的数据是{url:‘‘,data:{ ... 查看详情

原生javascript里jsonp的实现原理

ajax不能跨域,jsonp可以跨域跨域的核心思想:     调用(拿到的接口),定义(jsonp核心处理器)分别是不同的script标签里面进行跨script取数据(只有get方式进行取数据) jsonp传进来的数据是{url:‘‘,data:{ ... 查看详情

原生javascript实现jsonp的封装

JSONP即JSONwithPadding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接... 查看详情

json和jsonp的区别,以及使用方法

...流浏览器的跨域数据访问的问题。二、特点不同1、JSON:基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。2、JSONP:在客户端调用提供JSONP支持的URLService,... 查看详情

基于原生js的图片轮播效果简单实现

基本效果如下:实现了三张图片自动轮播+按键点击切换的效果。 基本思想:图片轮播的效果和老式电影院的胶片放映形式很相似,在老式的电影院放映中,使用长长的胶片记录影片,胶片上是按顺序排列的一系列图片,通... 查看详情

原生js取代一些jquery方法的简单实现

原生JS取代一些JQuery方法的简单实现下面小编就为大家带来一篇原生JS取代一些JQuery方法的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 1.选取元素//jQueryvarels=$(‘.el‘);//Nat... 查看详情

原生js实现查询天气的小应用

demo:https://zsqosos.github.io/weather/截图:实现功能:打开网页时显示用户所在城市的天气状况,在输入框输入城市可查询其它城市。实现过程:先调用百度地图的API来获取用户所在的城市,随后调用聚合数据的天气API将数据放在页... 查看详情

原生js实现查询天气的小应用

demo:https://zsqosos.github.io/weather/截图:实现功能:打开网页时显示用户所在城市的天气状况,在输入框输入城市可查询其它城市。实现过程:先调用百度地图的API来获取用户所在的城市,随后调用聚合数据的天气API将数据放在页... 查看详情

json.stringify()方法的原生js实现

...浏览器运行如下代码运行结果本文的JSON.stringify()方法的原生JS实现属于对javascript灵活应用的基本功。实现思路来自于笔者平日的工作与思考的总结。希望大家都能掌握以便在面试中脱颖而出。有需要前端学习资料的同学可以私... 查看详情

原生js实现ajax

...来说,大家可能都会习惯用JQuery提供的Ajax方法,但是用原生的js怎么去实现Ajax方法呢?  JQuery提供的Ajax方法:1$.ajax({2url:,3type:‘‘,4dataType:‘‘,5data:{67},8success:function(){910},11error:function(){1213}14})  原生js实现 查看详情

js怎样用原生js实现jquery的ready方法

Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,只是与window.onload方法还是有差别的。总的来说,window.onload()方法是必须等到页面内包含图片的全部元素载入完成后才干运行。$(document).ready()是DOM结构绘制完成... 查看详情

原生js发送ajax请求jsonp(代码片段)

一、JS原生AjaxAjax=异步Javascript+XML;ajax是一种数据请求的方式,不需要刷新整个页面。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。ajax的核心技术当然是XMLHttpRequest对象;ajax请求过程:创建XMLHttpReque... 查看详情

jsonp实现跨域请求

直接用原生ajax请求另一个域的资源,会被同源策略限制,而用<scriptsrc="url"></script>这种方式“引入url”,实际上引入了一个js代码,就不会被同源策略限制,可以请求到。用这个有一个前提就是对方网站后台的返回确实... 查看详情

js原生方法原理探究:如何实现object.assign()?

这是JS原生方法原理探究系列的第七篇文章。本文会介绍如何实现Object.assign()方法。Object.assign()的基本用法要实现Object.assign(),首先了解它的大概用法:接受的第一个参数表示目标对象(浅拷贝的结果),如果是null或者undefined,... 查看详情

javascript的jsonp

 目录索引:一、AJAX的概念二、POST&&GET三、原生实现AJAX简单示例  3.1实现代码  3.2重点说明四、框架隐藏域  4.1基本概念  4.2后台写入脚本  4.3JS主动判断Iframe的改变  4.4表单提交数据实战五、JQ的AJAX  ... 查看详情

js原生方法原理探究:如何实现instanceof?

这是JS原生方法原理探究系列的第五篇文章。本文会介绍如何实现instanceof方法。typeof操作符返回一个表示数据类型的字符串,它可以应付常规场景下的数据类型判断。对基本数据类型undefined、boolean、string、number、Symbol和引用数... 查看详情

浅谈用原生js实现数组的slice方法

slice方法有这几种情况:不传参、传一个参数、传两个参数。并且传参支持负数,具体每个情况的效果在这里就不说了。核心方法:通过for循环遍历调用此方法的数组,把要取出的内容放入新数组,然后将新数组返回。一切的条... 查看详情

浅谈用原生js实现函数的bind方法

bind的作用是让目标函数执行时候的this改为指定的上下文。一般情况下,this取决于调用者,谁调用函数this就是谁(自执行函数、定时器……之类的特殊情况除外)。有那么一句话,在JavaScript中,万物皆对象。1varwant=functionwant(){2... 查看详情