如果URL只有“一行HTML”,jQuery.load()如何工作跨域?

时间:2017-07-22 21:30:30

标签: javascript jquery html ajax

在我的网站上,我正在尝试编写一个JavaScript脚本,在单击按钮时,从一些网站的HTML源中删除数据并在我的网站上显示已解析/已清理的数据。

阅读TutorialsPoint's JQuery - Ajax page,其中展示了jQuery.load()方法,

<script type = "text/javascript" language = "javascript">
     $(document).ready(function() {
        $("#driver").click(function(event){
           $('#stage').load('/jquery/result.html');
        });
     });
</script>

我决定在我的网站上试一试。我将URL从相对的URL更改为绝对的 - “http://www.tutorialspoint.com/jquery/result.html” - 令我惊讶的是,它实际上正在运行(单击 EXTRACT DATA )。这与我的理解相矛盾,在阅读了几十个SO线程以及jQuery.load()API时,HTTP请求将受到同源策略的约束。

  

由于浏览器安全限制,大多数“Ajax”请求都遵循相同的原始策略;请求无法从其他域,子域,端口或协议成功检索数据。 〜API

当我将网址更改为http://google.com/http://www.example.com/之类的内容时,脚本无效。

上述教程页面上的一行引起了我的注意:

  

这里load()向指定的URL /jquery/result.html文件发起Ajax请求。加载此文件后,所有内容都将填充在标有ID阶段的内部。 假设,我们的/jquery/result.html文件只有一行HTML

如果指定网址的HTML文件只有一行,那么load()如何跨域工作?

3 个答案:

答案 0 :(得分:2)

这与文件或结构无关。这是关于启用Cross Origin Request Sharing。如果相关服务器或请求具有以下标头:

Access-Control-Allow-Origin: *

这将使AJAX也能够从跨域获取文件。

实际上,例如,通过Hurl.it发送HTTP GET请求会确认标头存在。

Request picture

答案 1 :(得分:1)

内部load()只是$.ajax的快捷方式,load()的代码是

function load(url, params, callback) {
    // ... some checks and stuff
        jQuery.ajax({
            // settings
        }).done(function (responseText) {
            self.html(selector ?
            jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) : responseText);
        }).complete(callback && function (jqXHR, status) {
            self.each(callback, response || [jqXHR.responseText, status, jqXHR]);
        });
    }
    return this;
}

在这种情况下,服务器返回CORS requests的正确标头,如果查看请求,响应标头包括

Access-Control-Allow-Headers:X-Requested-With
Access-Control-Allow-Origin:*

意味着它允许来自不同来源的请求,因此它与load()完全无关,任何ajax请求都可以正常工作到该URL,因为它不受同源政策的约束

  

跨域资源共享标准通过添加新HTTP来工作   允许服务器描述原始集合的标头   允许使用网络浏览器阅读该信息。

答案 2 :(得分:0)

我意识到该功能无法违反同源政策。

通过Hurl.It向HTML页面发送GET请求产生了原因:

  

获取http://www.tutorialspoint.com/jquery/result.html

     

     

...

     

* Access-Control-Allow-Origin:*

     

...