使用script的src实现跨域和类似ajax效果


Posted in Javascript onNovember 10, 2014

场景

假如有两个域名不同的服务器, a.com和b.com, 在b.com/b_return_js.php这个接口里, 可以获取一些数据。 当然,假如是b.com的页面里, 可以使用ajax, 直接请求这个接口, 但如果在a.com的页面里如果请求呢。

b_return_js.php的接口代码:

$a = array(

    array('username'=>'tony', 'age'=>25),

    array('username'=>'yimeng', 'age'=>23),

    array('username'=>'ermeng', 'age'=>22),

    array('username'=>'sanmeng', 'age'=>21),

);

shuffle($a);
echo 'var userdata = '.json_encode($a).';'; //一般如果是b.com的站内请求就直接返回json_encode($a)了, 但如果要用src属性实现跨域, 这里我们需要将该值赋给一个js变量, 保证在script标签加载后的页面里能获取到这个数据并使用。

简单实现

有一种简单的方法就是在a.com下的页面里, 直接

<script src="http://b.com/b_return_js.php"></script>

这样在a.com的页面里就能直接获取到这个接口里返回的数据了。
但这里有一个缺陷,这个数据只能在页面加载的时候获取到, 假如我们想要使用ajax那种可以随时获取新的接口数据的方式就不太适用了, 例如点击一个按钮, 从这个接口获取数据局部刷新, 这种方式就有一些不合适了。

类ajax实现

其实实现上面说的类ajax的思路就是在ajax条件触发的时候, 重新生成一遍上面的那个标签, 从而再次从接口获取数据, 但实际上实现起来还是略有难度(至少对我来说费了不少功夫)。

上代码:

假如a.com/scriptSrc.php页面下有一个按钮

<input type="button" id="ajax_request_from_b" value="来自B.com的请求"/>
每次点击都会从b.com/b_return_js.php接口获取数据, 类似ajax的实现代码:

function createScript()

{

    //console.log(ele);

    ele.src = 'http://b.com/b_return_js.php';

    ele.type = 'text/javascript';

    ele.language = 'javascript';

}
function getData()

{

    console.log(userdata);

}
$('#ajax_request_from_b').click(function(){
    //每次都需要重新加载这个script标签, 因此每次都要重新生成一个新的script标          签保证能从跨域服务器获取数据

    if(ele && ele.parentNode)

    {

        //ele.parentNode.removeChild(ele);  //这种删除不能将ele彻底从内存删除,只是移除了在dom中的位置

        for (var property in ele) {            

            delete ele[property];        //彻底删除

         } 

    }

    ele = document.createElement('script'); //这是一个新的ele

    createScript();

    document.getElementsByTagName("head")[0].appendChild(ele);

    ele.onload = function(){getData()};  //script元素加载后方可获取userdata, 每次获取的都是随机顺序的用户信息

});

这样你每次点击按钮, 都会重新从接口获取一遍数据, 效果就类似于ajax, 但这是一种js跨域的方法实现, 虽然有些吃力不讨好, 但不失为一种思路。

Javascript 相关文章推荐
javascript[js]获取url参数的代码
Oct 17 Javascript
Jquery CheckBox全选方法代码附js checkbox全选反选代码
Jun 09 Javascript
jquery用offset()方法获得元素的xy坐标
Sep 06 Javascript
JavaScript控制网页层收起和展开效果的方法
Apr 15 Javascript
js验证上传图片的方法
May 12 Javascript
基于OL2实现百度地图ABCD marker的效果
Oct 01 Javascript
jQuery改变form表单的action,并进行提交的实现代码
May 25 Javascript
Angular的自定义指令以及实例
Dec 26 Javascript
DWR3 访问WEB元素的两种方法实例详解
Jan 03 Javascript
微信小程序 后台登录(非微信账号)实例详解
Mar 31 Javascript
IE9 elementUI文件上传的问题解决
Oct 17 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
Dec 17 Javascript
jquery插件推荐 jquery.cookie
Nov 09 #Javascript
jquery插件推荐浏览器嗅探userAgent
Nov 09 #Javascript
Javascript限制网页只能在微信内置浏览器中访问
Nov 09 #Javascript
js闭包的用途详解
Nov 09 #Javascript
js闭包实例汇总
Nov 09 #Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 #Javascript
jQuery函数map()和each()介绍及异同点分析
Nov 08 #Javascript
You might like
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
文本框获得焦点和失去焦点的判断代码
2012/03/18 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
axios中cookie跨域及相关配置示例详解
2017/12/20 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
法国足球商店:Footcenter
2019/07/06 全球购物
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
机械绘图员岗位职责
2013/11/19 职场文书
教师新年寄语
2014/04/03 职场文书
贺卡寄语大全
2014/04/11 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
python实现大文本文件分割成多个小文件
2021/04/20 Python
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
MySQL中varchar和char类型的区别
2021/11/17 MySQL
Go语言基础map用法及示例详解
2021/11/17 Golang