使用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 相关文章推荐
js注意img图片的onerror事件的分析
Jan 01 Javascript
Extjs TimeField 显示正常时间格式的代码
Jun 28 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
Jul 31 Javascript
node.js中的fs.truncateSync方法使用说明
Dec 15 Javascript
jquery制做精致的倒计时特效
Jun 13 Javascript
概述一个页面从输入URL到页面加载完的过程
Dec 16 Javascript
jQuery实现标签子元素的添加和赋值方法
Feb 24 jQuery
微信小程序实现点击按钮后修改颜色
Dec 05 Javascript
解决vue 退出动画无效的问题
Aug 09 Javascript
JavaScript实现多层颜色选项卡嵌套
Sep 21 Javascript
原生JS实现音乐播放器
Jan 26 Javascript
详解CocosCreator消息分发机制
Apr 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
PHP程序员编程注意事项
2008/04/10 PHP
PHP5函数小全(分享)
2013/06/06 PHP
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
php获取文件大小的方法
2014/02/26 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
jquery插入兄弟节点的操作方法
2016/12/07 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
Vue全家桶实践项目总结(推荐)
2017/11/04 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
收集前端面试题之url、href、src
2018/03/22 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
Vue Prop属性功能与用法实例详解
2019/02/23 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
详解小程序BackgroundAudioManager踩坑之旅
2019/12/08 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
Python爬虫实现(伪)球迷速成
2018/06/10 Python
python中scikit-learn机器代码实例
2018/08/05 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
pytorch SENet实现案例
2020/06/24 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
工作目标责任书
2014/07/23 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
同意报考公务员证明
2015/06/17 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python