使用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 相关文章推荐
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
Dec 25 Javascript
详解Angular2组件之间如何通信
Jun 22 Javascript
利用vue开发一个所谓的数独方法实例
Dec 21 Javascript
react-native android状态栏的实现
Jun 15 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
May 22 Javascript
pm2启动ssr失败的解决方法
Jun 29 Javascript
Vue中的循环及修改差值表达式的方法
Aug 29 Javascript
webpack的tree shaking的实现方法
Sep 18 Javascript
小程序如何获取多个formId实现详解
Sep 20 Javascript
jQuery 添加元素和删除元素的方法
Jul 15 jQuery
解决ant design vue 表格a-table二次封装,slots渲染的问题
Oct 28 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
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缩略图等比例无损压缩,可填充空白区域补充色
2011/06/10 PHP
基于Zend的Captcha机制的应用
2013/05/02 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
js实现文字垂直滚动和鼠标悬停效果
2015/12/31 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
javascript json对象小技巧之键名作为变量用法分析
2019/11/11 Javascript
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
python3实现磁盘空间监控
2018/06/21 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
Python字符串函数strip()原理及用法详解
2020/07/23 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
大学生创业计划书的格式要求
2013/12/29 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
Python pyecharts绘制条形图详解
2022/04/02 Python
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python