从零开始学 Web 之 Ajax(七)跨域

大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新......

github:https://github.com/Daotin/Web

微信公众号:Web前端之巅

博客园:

CSDN:https://blog.csdn.net/lvonve/

在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。现在就让我们一起进入 Web 前端学习的冒险之旅吧!

从零开始学 Web 之 Ajax(七)跨域

一、跨域

跨域这个概念来自一个叫 “同源策略” 的东西。同源策略是浏览器上为了安全考虑实施的非常重要的安全机制。

Ajax 默认只能获取到同源的数据,对于非同源的数据,Ajax是获取不到的。

什么是同源?

协议、域名、端口全部相同。

比如一个界面地址为: 这个网址,在这个地址中要去访问下面服务器的数据,那么会发生什么情况呢?

URL 结果 原因
https://www.example.com/dir/other.html   不同源   协议不同,https 和 http  
  不同源   域名不同  
:81/dir/other.html   不同源   端口不同  
  同源   协议,域名,端口都相同  
  同源   协议,域名,端口都相同  

如果使用 Ajax 获取非同源的数据,会报错,报错信息如下:

Failed to load ?uname=176: No \'Access-Control-Allow-Origin\' header is present on the requested resource. Origin \'http://localhost\' is therefore not allowed access. The response had HTTP status code 404.

那么。想要获取非同源地址的数据,就要使用跨域。不论是 Ajax 还是跨域,都是为了访问服务器的数据。简单的来说, Ajax 是为了访问自己服务器的数据,跨域是为了访问别人服务器的数据(比如获取天气信息,航班信息等)。

1、跨域的实现 1.1、引入外部 js 文件

我们可以通过 script 标签,用 script 标签的属性引入一个外部文件,这个外部文件是不涉及到同源策略的影响的。

<script src="http://www.example.com/dir/xxx.js"></script>

然后,这个外部文件中有一个或几个方法的调用,这些方法的定义在自己的界面文件中,而我们想要的是方法的参数,可以在自己定义的方法中拿到。这就是跨域的本质。

1.2、引入外部 PHP 文件

script 引入的应该是 js 文件,如果我们想要引入 php 文件的话,就需要在 php 代码中,返回 js 格式的代码。

<?php echo "var str = \'hello\'"; echo "func(\'123\')"; ?>

在我们 html 文件中:

<script> function func(data) { // 就为了获取参数 console.log(data); } </script> <script src="http://www.example.com/xxx.php"></script>

再进一步,如果我们在 PHP 地址中传入了参数:

<?php $city = $_GET["city"]; if($city == "beijing") { echo "func(\'获取到北京天气\')"; } else { echo "func(\'为获取到天气信息\')"; } ?>

html 文件:

<script> function func(data) { // 就为了获取参数 console.log(data); } </script> <script src="http://www.example.com/xxx.php?city=beijing"></script> 1.3、动态创建 script 标签

当然,如果只是手动的在php文件后面传入参数,就太固定了,那么我们可不可以根据用户的输入来获取不同城市天气信息呢?

答案是肯定的。我们可以采取动态创建 script 的方式来获取用户想要的信息。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>天气查询</h1><br> <input type="text" placeholder="请输入城市"><br> <input type="button" value="获取天气"> <script> function func(data) { console.log(data); } document.getElementById("btn").onclick = function () { var city = document.getElementById("txt").value; var script = document.createElement("script"); script.src = "http://hr.pcebg.efoxconn.com/checkUsername.php?city=" + city; document.getElementsByTagName("head")[0].appendChild(script); }; </script> </body> </html> 1.4、动态指定回调函数名称

还记得我们 html 中有个回调函数的定义吗?这个函数的名称是固定的,我们可不可以动态指定呢?答案也是肯定的,我们既然可以在 php 地址传递参数过去,就可以顺便把回调函数的名称也传递过去,动态的指定回调函数的名称。

//... function foo (data) { console.log(data); } script.src = "http://hr.pcebg.efoxconn.com/checkUsername.php?city=" + city + "&callback=foo"; //...

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwszf.html