Javascript 为什么jQuery.load()可以跨域工作,如果URL有;只有一行“HTML”吗;?
在我的网站上,我试图编写一个JavaScript脚本,在点击一个按钮时,从一些网站的HTML源中抓取数据,并在我的网站上显示解析/清理后的数据 读取时,显示jQuery.load()方法Javascript 为什么jQuery.load()可以跨域工作,如果URL有;只有一行“HTML”吗;?,javascript,jquery,html,ajax,Javascript,Jquery,Html,Ajax,在我的网站上,我试图编写一个JavaScript脚本,在点击一个按钮时,从一些网站的HTML源中抓取数据,并在我的网站上显示解析/清理后的数据 读取时,显示jQuery.load()方法 $(文档).ready(函数(){ $(“#驱动程序”)。单击(函数(事件){ $('#stage').load('/jquery/result.html'); }); }); 我决定在我的网站上试试。我将URL从相对URL更改为绝对URL--“”--令我惊讶的是,它实际上正在运行(单击提取数据)。这与我在
$(文档).ready(函数(){
$(“#驱动程序”)。单击(函数(事件){
$('#stage').load('/jquery/result.html');
});
});
我决定在我的网站上试试。我将URL从相对URL更改为绝对URL--“”--令我惊讶的是,它实际上正在运行(单击提取数据)。这与我在阅读了几十个SO线程以及jQuery.load()API后的理解相矛盾,即HTTP请求将遵循相同的源策略
由于浏览器的安全限制,大多数“Ajax”请求都受同源策略的约束;请求无法从其他域、子域、端口或协议成功检索数据~
当我将URL更改为类似的内容或脚本无法运行时
上述参考教程页面上的一行引起了我的注意:
这里load()向指定的URL/jquery/result.html文件发起Ajax请求。加载此文件后,所有内容都将填充到带有ID stage标记的内部假设我们的/jquery/result.html文件只有一行html
如果指定URL上的HTML文件只有一行,load()如何跨域工作?与文件或结构无关。这是关于启用的。如果相关服务器或请求具有以下标头:
Access-Control-Allow-Origin: *
这将使AJAX能够从跨域获取文件
实际上,例如,通过发送HTTP GET请求可以确认报头存在
我意识到函数不可能违反同源策略 通过以下原因向HTML页面发送GET请求: 得到 标题 *访问控制允许来源:* 内部
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;
}
这意味着它允许来自不同来源的请求,因此它与load()
完全无关,任何ajax请求都可以在该URL上正常工作,因为它不受相同来源策略的约束
跨源资源共享标准通过添加新的HTTP来工作
允许服务器描述所创建的源集的标头
允许使用web浏览器阅读该信息
这取决于服务器。如果服务器允许:
Access Control Allow Origin:
则它可以工作。请解释。我看不出我的问题有什么天生的问题。嘿,可能是因为他们的投票被锁定了。我对问题进行了编辑,并添加了投票。很快就要爆炸了。现在是0。是的。。。这就是我在回答中添加的内容<代码>:)
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;
}
Access-Control-Allow-Headers:X-Requested-With
Access-Control-Allow-Origin:*