首页 > web前端 > js教程 > JSONP如何解决jQuery的跨域AJAX通信问题?

JSONP如何解决jQuery的跨域AJAX通信问题?

DDD
发布: 2024-12-22 18:40:10
原创
508 人浏览过

How Can JSONP Solve jQuery's Cross-Domain AJAX Communication Problems?

jQuery AJAX 跨域通信挑战

当遇到跨域 AJAX 请求时,来自一个域的 HTML 文档尝试创建一个请求到不同的域,就会出现困难。让我们探讨一个包含两个 PHP 文件 test.php 和 testserver.php 的场景:

test.php:

<script src="scripts/jq.js" type="text/javascript"></script>
<script>
  $(function() {
    $.ajax({
      url: "testserver.php",
      success: function() {alert("Success")},
      error: function() {alert("Error")},
      dataType: "json",
      type: "get"
    });
  });
</script>
登录后复制

testserver.php:

<?php
$arr = array("element1", "element2", array("element31", "element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>
登录后复制

当两个文件托管在同一服务器上时,AJAX 请求成功了。但是,当它们放置在不同的服务器上时,请求会失败,从而触发“错误”警报。这是由于浏览器的同源策略(SOP)限制了跨域数据共享。

解决方案:利用 JSONP

要克服 SOP,我们可以使用 JSONP(带填充的 JSON)。 JSONP 允许将数据作为函数调用发送,从而规避 SOP 施加的限制。

jQuery:

$.ajax({
  url: "testserver.php",
  dataType: 'jsonp', // Notice! JSONP < - P (lowercase)
  success: function(json){
    // do stuff with json (in this case an array)
    alert("Success");
  },
  error: function(){
    alert("Error");
  }
});
登录后复制

PHP:

<?php
$arr = array("element1", "element2", array("element31", "element32"));
$arr['name'] = "response";
echo $_GET['callback'] . "(" . json_encode($arr) . ");";
?>
登录后复制

在此修改后的代码中,JavaScript 请求包含 'dataType: 'jsonp'' 表示使用 JSONP。 PHP 脚本通过“$_GET['callback']”检索 jQuery 发送的回调函数名称,并使用它来形成输出。 PHP 脚本中的输出应显示为回调函数,后跟 JSON 数据,确保数据作为函数调用进行传输。

或者,jQuery 提供 $.getJSON() 方法,这是处理的简写JSONP 请求。但是,它要求 URL 包含“callback=?”作为 GET 参数,jQuery 动态插入自己的回调方法。

以上是JSONP如何解决jQuery的跨域AJAX通信问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板