当URL设置为运行JavaScript时,同一域策略如何在弹出窗口中工作?
我想这样做:当URL设置为运行JavaScript时,同一域策略如何在弹出窗口中工作?,javascript,ajax,cross-domain,Javascript,Ajax,Cross Domain,我想这样做: var w = window.open("javascript: makeAnAjaxRequest();"); 我的问题是,Ajax请求(在新窗口打开后执行)会被视为跨站点请求吗?相同的域策略是否适用于页面创建窗口的原始域 回应您的一些评论: someAjaxFunction()只需发出Ajax请求并能够对结果进行操作。我知道必须在我打开的窗口中定义函数。没问题;我有一个缩小的ajax函数,我正在使用它,我也可以将它注入URL。关键是看请求的限制是什么;i、 例如,相同的域策略
var w = window.open("javascript: makeAnAjaxRequest();");
我的问题是,Ajax请求(在新窗口打开后执行)会被视为跨站点请求吗?相同的域策略是否适用于页面创建窗口的原始域
回应您的一些评论:
someAjaxFunction()
只需发出Ajax请求并能够对结果进行操作。我知道必须在我打开的窗口中定义函数。没问题;我有一个缩小的ajax函数,我正在使用它,我也可以将它注入URL。关键是看请求的限制是什么;i、 例如,相同的域策略将应用于哪个域?来自谷歌的一些信息:
在没有附加限定符的情况下,“同源策略”一词通常指的是一种机制,它控制JavaScript和其他脚本语言跨域访问DOM属性和方法的能力(参考)。本质上,该模型归结为三步决策过程:
如果协议、主机名和(对于Microsoft Internet Explorer以外的浏览器)两个交互页面的端口号匹配,则无需进一步检查即可授予访问权限。
任何页面都可以将document.domain参数设置为其当前主机名的右侧完全限定片段(例如,foo.bar.example.com可以将其设置为example.com,但不能设置为ample.com)。如果两个页面明确且相互将各自的document.domain参数设置为相同的值,并且满足剩余的相同来源检查,则授予访问权限。
如果上述两个条件都不满足,访问将被拒绝
来自Mozilla的信息
我无法访问新辅助窗口的属性。我总是在javascript控制台中看到一个错误,上面写着“error:uncaughtexception:Permission denied to get property,这是为什么?”
这是因为跨域脚本安全限制(也称为“同源策略”)。从不同来源(域名)加载到窗口(或框架)中的脚本无法获取或设置另一个窗口(或框架)的属性或来自另一个不同来源(域名)的任何HTML对象的属性。因此,在执行针对辅助窗口的脚本之前,主窗口中的浏览器将验证辅助窗口是否具有相同的域名。
有关跨域脚本安全限制的详细信息:
那么你的答案是
window.open('javascript:doFunction()')
不会执行任何操作,除非打开一个新的空白窗口,该窗口无法执行任何操作,因为未定义doFunction
。它需要在同一窗口中定义
Sidenote我可以通过将ajax直接注入url来执行同源xhr请求,但它仍然容易受到相同域策略的影响
x = window.open('javascript:x = new XMLHttpRequest; x.open("GET", "http://medero.org", false); x.onreadystatechange = function(){ if ( x.readyState != 4 ) { return; }; alert(x); alert( x.responseText );}; try {x.send(null); } catch (e) { alert(e)}; alert("ok"); ');
它在Firefox中失败了。我还没有在MSIE中测试它。但是
测试:
(故障)来自的Chrome 7(控制台)
(成功)来自的Chrome 7(控制台)
(故障)Firefox 3.6(控制台)来自
(故障)Firefox 3.6(控制台)来自
(成功)Firefox 3.6(控制台)来自
新窗口将打开为about:blank,然后在该窗口的上下文中运行javascript。根据meder的评论,从该窗口发出AJAX请求将失败,因为协议不匹配,因此您将无法打开以连接到任何http:url
如果您提到您真正想做的事情,而不是仅仅出于好奇,您的问题可能会得到改进…好问题!但是,您知道,为了运行
someAjaxFunction(),您必须导入大量内容
,因为您将无法使用打开窗口的库?无论如何,我打赌出于同源性检查的目的,脚本的位置是未定义的
。这意味着什么?您希望AJAX调用获取新窗口的URL吗?还是AJAX调用应该检索新窗口内容?如果对于后者,除非你所做的是一篇文章,否则它没有多大意义。还要注意,实际上没有“javascript:”URL。你为什么要这样做?我想不出你为什么要调用window.open,向它传递一个javascript:URL…我“理解”它是如何工作的;什么是(多少)令人惊讶的是,浏览器在window.open()
调用中注意到了这一点。我想它在任何情况下都会这样做,就像更新URL栏一样,这是
标记有效地做的,或者显然是显式链接(bookmarklet)。我想不出任何方法来获取window.open()
以实际使用已执行Javascript的任何返回值,或用于除创建空的新窗口(或选项卡)以外的任何事情。无论我尝试做什么,Meder的评论都是正确的。感谢您的详细回答。我知道相同来源的规则,但不知道“Javascript:something()“计算为使用不同的协议。我想这意味着somesite.com
打开的窗口根本无法执行任何Ajax请求。这是因为Ajax请求将使用与我所研究的方法类似的方法启动,该方法被视为使用不同的协议,因此违反了相同的源策略。实际上,它看起来像是Chrome从初始url处理javascript:
。Firefox不允许这样做。很有趣。这是
>>> x = window.open('http://google.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
TypeError: Cannot read property 'body' of undefined
>>> x = window.open('http://stackoverflow.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
"test"
>>> x = window.open('http://google.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
Permission denied for <http://stackoverflow.com> to get property Window.document from <http://www.google.com>.
>>> x = window.open('http://stackoverflow.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
"test"
$.ajax({
url:'http://bing.com',
success:function(data) {
alert(data) // blank alert
}
})
$.ajax({
url:'http://stackoverflow.com',
success:function(data) {
alert(data) // success
}
})