【前端学习笔记】原生Javascript中通过JSONP(前端常用方法)进行跨域

Ajax跨域—————————————————————————-

跨域: 跨域名

一个域名下的文件去请求了和他不一样的域名下的资源文件,那么就会产生跨域请求

这是ajax的跨域限制问题

跨域的解决 : jsonp: json width padding
核心:
    1.script标签
    2.用script标签加载资源是没有跨域问题的
    3.script只认文件的实际内容,而不是后缀。只要内容是合法的js就能用
流程:
    1.在资源加载进来之前定义好一个函数,这个函数接受一个参数(要取的数据)
    ,而将要加载过来的文件里执行这个函数并将要取的数据作为参数来传递。

    2.在需要的时候,通过script标签加载对应远程文件资源,当远程资源被加载进来
    的时候,就会执行定义好的函数,并将要取的数据作为参数传递到当前文件。

原理拓展:
    动态地加载文件,例如点击以后才加载文件,就在点击事件里给body添加script标签
    然后让该sciprt的src为文件地址,用url后面的callback参数来控制调用方法的方法名。

实例:

以下代码需要在服务器环境下运行

布局代码

<body>
    <input type="button" value="加载数字" />
    <ul></ul>
    <input type="button" value="加载字母" />
    <ul></ul>
    <input type="button" value="加载数字" />
    <ul></ul>
</body>

JS代码

function fn0(data){
    var aUl = document.getElementsByTagName(‘ul‘);
    for(var i = 0; i < data.length; i++)
    {
        var oLi = document.createElement(‘li‘);
        oLi.innerHTML = data[i];
        aUl[0].appendChild(oLi);
    }

}
function fn1(data){
    var aUl = document.getElementsByTagName(‘ul‘);
    for(var i = 0; i < data.length; i++)
    {
        var oLi = document.createElement(‘li‘);
        oLi.innerHTML = data[i];
        aUl[1].appendChild(oLi);
    }

}
function fn2(data){
    var aUl = document.getElementsByTagName(‘ul‘);
    for(var i = 0; i < data.length; i++)
    {
        var oLi = document.createElement(‘li‘);
        oLi.innerHTML = data[i];
        aUl[2].appendChild(oLi);
    }

}
window.onload=function(){
    var aInput = document.getElementsByTagName(‘input‘);
    var aUl = document.getElementsByTagName(‘ul‘);
    for(var i=0;i<aInput.length;i++)
    {
        (function(i){
            aInput[i].onclick=function(){
                var oScript = document.createElement(‘script‘);
                oScript.src = ‘data.php?t=num&callback=fn‘+i;
                document.body.appendChild(oScript);
            }
        })(i);
    };

}

后端代码(php)

//data.php
<?php  

    $t = isset($_GET[‘t‘]) ? $_GET[‘t‘] :‘num‘;
    //前端告诉后端要输出哪个数据,这里是判断输出的数组是
    //$arr1还是$arr2
    $callback = isset($_GET[‘callback‘]) ? $_GET[‘callback‘] :‘fn0‘;
    //动态生成调用数据的方法,不必在后台写死,默认调用fn0

    //假设数据是两个不同数组
    $arr1 = array(‘111111‘,‘222222222‘,‘3333333333‘,‘44444444‘);
     $arr2 = array(‘aaaaaaaa‘,‘bbbbbbbb‘,‘ccccccccc‘,‘dddddddd‘);

    //按照前台的标志来判断返回的数据
     if($t == ‘num‘){

        $data = json_encode($arr1);
        echo $callback."(".$data.")";
    }
    else{
        $data = json_encode($arr2);
        echo $callback."(".$data.")";
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 00:25:21

【前端学习笔记】原生Javascript中通过JSONP(前端常用方法)进行跨域的相关文章

【前端学习笔记】Javascript中的正则表达式

复习字符串操作-------------------------– indexOf 查找字符 返回位置 charAt 查找位置 返回字符 substring 获取字符窜 split 分割字符串 正则表达式的概念和写法----------------- 正则 :也叫做规则,让计算机能够读懂人类的规则 正则都是操作字符串的. 正则的写法: var re = /a/; 和数组字符串区分开来 var re = newRegExp('a'); [正则默认] : 1.正则中是区分大小写的 不区分大小写在正则

web前端学习笔记:JavaScript数组

今天主要给大家介绍javascript中数组的操作方法及函数的介绍,数组在其中的主要作用是使用单独的变量名来存储一系列的值.下面通过一些简单的javascript实例为大家讲解数组,具体的javascript教程如下: 字符串, JavaScript 字符串就是用'' 和""括起来的字符表示. 字符字面量, \n 换行, \t 制表, \b 退格, \r 回车, \f 进纸, \\ 斜杠,\' 单引号(') ,\" 双号(") \xnn 以十六进制代码nn 表示的一

如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function (data) { $('#banner_right').html(data); } }); 服务端需要在WebApiConfig.Register()中添加如下的代码 public static class WebApiConfig { public static void Register(Ht

json学习笔记--在JavaScript中的使用

1.字符串转换为JavaScript对象 var txt = '{ "employees" : [' + '{ "firstName":"John" , "lastName":"Doe" },' + '{ "firstName":"Anna" , "lastName":"Smith" },' + '{ "firstNa

【前端学习笔记】JavaScript 常用方法兼容性封装

获取样式函数封装 function getStyle(ele,attr){ if(ele.currentStyle){ return ele.currentStyle[attr]; } else{ return window.getComputedStyle(ele,null)[attr]; } }; getClass()封装 function getClass(element, names){ //如果存在getElementsByClassName()方法,则直接获取元素. if(docum

【前端学习笔记】JavaScript 小案例合集

获取一个0-9的随机数: Math.round(Math.random()*9); 去除数组中重复的元素: var arr=[1,3,5,4,3,3,1,4] function editArr(arr) { var result=[]; for(var i=0; i<arr.length; i++){ if(result.indexOf(arr[i]) == -1){ result.push(arr[i]); } } console.log(result); } editArr(arr); +函

【前端学习笔记】JavaScript JSON对象相关操作

//JSON方法 //JSON.parse(); var json = '{"name":"zj","age":23}'; JSON.parse(json); //--> {name: "zj", age: 23} // IE6/7不兼容的写法 if(!window.JSON){ window.JSON = { parse:function(json){ return eval('(' + json + ')'); }

【前端学习笔记】JQuery的基本思想、常用方法

JQ思想------------------------ 1.模仿CSS获取元素 2.方法函数化,JQ以各种方法传参代替了JS的属性赋值操作 3.方法链式操作 4.和原生共存,写法不能混用 5.取值赋值合用一个方法,区别于加不加参数,当一组元素取值时, 取的是第一个元素的值,取出所有元素需要循环.而赋值时, 直接赋值给这组的每个元素 $()下的常用方法--------------------– has() 包含: 有包含的被选择,针对元素里面的东西 filter() 过滤: 满足条件的被选择,没

Yii框架学习笔记(二)将html前端模板整合到框架中

选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/topics/390807796 更多内容 百度:yii 前端 http://my.oschina.net/u/1472492/blog/221085 摘要 Yii框架学习笔记(二)将html前端模板整合到框架中 原文地址:http://www.ldsun.com/1309.html 上一节成功将Y