php跨域发送请求原理以及同步异步问题

本文介绍如何使用script标签实现异步加载及跨域请求处理,并通过JSONP实现跨域数据获取。探讨了同步与异步加载的区别,以及如何通过动态创建script标签的方式进行异步加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • <script async type="text/javascript" src="http://lisi.com/data.php?flag=1"></script>
    <script type="text/javascript">
    // script标签默认请求是同步的,也就是第一个标签没有得到服务器响应内容时,后续的的标签只能等待
    // 如果希望标签的请求变成异步的,可以给标签添加一个async属性
    console.log(abc);
    </script>

  • <script type="text/javascript">

/*

动态创建script标签,这种方式默认就是异步的

*/

var script = document.createElement('script');

script.src = 'http://lisi.com/data1.php?callback=abc';

var head = document.getElementsByTagName('head')[0];

head.appendChild(script);

// 这个函数由谁调用?后台返回的内容(js代码-函数调用)来调用

// 回调函数(不是自己调用,而是“别人”调用)

function abc(param){

console.log(param.username);

}

</script>

//跨域对应的文件夹

<?php
$flag=$_GET['callback'];
echo $flag.'({"username":"xiaobai","age":"18"})';//返回的内容是【函数调用】
?>

  • ajax方法既支持json也支持jsonp
    */
    function ajax(obj){
    // 默认值
    var defaults = {
    type : 'get',
    jsonp : 'callback',
    url : '#',
    data : {}
    }
    // 覆盖默认参数
    for(var key in obj){
    defaults[key] = obj[key];
    }

    if(defaults.dataType == 'jsonp'){
    // 跨域处理
    _ajax4Jsonp(defaults);
    }else{
    // ajax处理
    _ajax4Json(defaults);
    }
    }

    function _ajax4Json(obj){
    // 1、创建xhr对象
    var xhr = null;
    if(window.XMLHttpRequest){
    xhr = new XMLHttpRequest();
    }else{
    xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }
    // 处理参数
    var param = '';
    // 处理对象形式的参数
    // 把{username:'lisi',age:12,gender:'male'}
    // 转成username=lisi&age=12&gender=male
    for(var key in obj.data){
    // 拼接一个参数
    param += key + '=' + encodeURIComponent(obj.data[key]) + '&'
    }
    if(param){
    // 去掉最后一个字符
    param = param.substring(0,param.length - 1);
    }
    if(obj.type == 'get'){
    // 对于get请求要把参数拼接到url中
    obj.url += '?' + param;
    }
    // 2、配置发送参数
    xhr.open(obj.type,obj.url);
    // 3、执行发送动作
    var data = null;
    if(obj.type == 'post'){
    data = param;
    // 设置请求头
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    }
    xhr.send(data);
    // 4、处理响应(指定回调函数)
    xhr.onreadystatechange = function(){
    if(xhr.status == 200 && xhr.readyState == 4){
    // 获取服务器响应数据
    var result = xhr.responseText;
    if(obj.dataType == 'json'){
    // 如果要求是json格式,那么就把json字符串转成对象
    result = JSON.parse(result);
    }
    // 调用回调函数
    obj.success(result);
    }
    }
    }

    function _ajax4Jsonp(obj){
    // 业务参数转换
    // 把{"username":"lisi","age":"12"}格式的数据转成username=lisi&age=12
    var param = '';
    for(var key in obj.data){
    param += key + '=' + obj.data[key] + '&';
    }
    // if(param){
    // param = param.substring(0,param.length - 1);
    // }

    // 生成默认的回调函数的名称
    var cbName = 'jQuery' + ('v1.11.1' + Math.random()).replace(/\D+/g,'') + '_' + (new Date().getTime());
    if(obj.jsonpCallback){
    // 如果调用方法的时候传递了回调函数的名称就把默认的覆盖掉
    cbName = obj.jsonpCallback;
    }

    // 回调函数
    window[cbName] = function(data){
    obj.success(data);
    }
    // 后台返回的内容是函数调用
    // jQuery12312312312312321_43213123123(23123);

    // 创建script标签,然后追加到head标签中
    var script = document.createElement('script');
    script.src = obj.url + '?' + param + obj.jsonp + '=' + cbName;
    var head = document.getElementsByTagName('head')[0];
    head.appendChild(script);
    }

转载于:https://www.cnblogs.com/woniubushinide/p/6794769.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值