使用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 CSS修改学习第二章 样式
Feb 19 Javascript
js 中 document.createEvent的用法
Aug 29 Javascript
jQuery :nth-child前有无空格的区别分析
Jul 11 Javascript
jquery创建一个ajax关键词数据搜索实现思路
Feb 26 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
Feb 24 Javascript
js换图片效果可进行定时操作
Jun 09 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
Jul 25 Javascript
什么是JavaScript注入攻击?
Sep 14 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
Mar 14 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
Apr 05 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
Jul 27 Javascript
js实现简单的秒表
Jan 16 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
杏林同学录(四)
2006/10/09 PHP
escape unescape的php下的实现方法
2007/04/27 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
Python中Numpy mat的使用详解
2019/05/24 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
python实现梯度下降法
2020/03/24 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
酒店员工职业生涯规划
2014/02/25 职场文书
庆国庆活动总结
2014/08/28 职场文书
教师学期末个人总结
2015/02/13 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
深入理解python多线程编程
2021/04/18 Python
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
对讲机的最大通讯距离是多少
2022/02/18 无线电