Chr*_*nte 6 javascript ajax cross-domain
我想做这样的事情:
var w = window.open("javascript: makeAnAjaxRequest();");
Run Code Online (Sandbox Code Playgroud)
我的问题是,Ajax请求(在新窗口打开后执行)是否会被视为跨站点请求?同域策略是否适用于其页面创建窗口的原始域?
在回复你的一些评论时:
someAjaxFunction()只需要发出Ajax请求并能够对结果进行操作.我知道必须在我打开的窗口中定义该函数.没问题; 我有一个缩小的ajax函数,我正在使用它,我也可以注入到URL中.关键是要看看请求的限制是什么; 即,在哪个域下应用同域策略?
来自谷歌的一些信息:http://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_DOM_access
在没有附加限定符的情况下,术语“同源策略”最常指的是一种机制,用于控制 JavaScript 和其他脚本语言跨域访问 DOM 属性和方法的能力(参考)。本质上,该模型可归结为以下三步决策过程:
如果两个交互页面的协议、主机名和(对于 Microsoft Internet Explorer 以外的浏览器)端口号匹配,则授予访问权限,无需进一步检查。任何页面都可以将 document.domain 参数设置为其当前主机名的右侧完全限定片段(例如,foo.bar.example.com 可以将其设置为 example.com,但不能将其设置为ample.com)。如果两个页面明确且相互地将各自的 document.domain 参数设置为相同的值,并且满足其余的同源检查,则授予访问权限。如果以上条件都不满足,则拒绝访问。
来自 Mozilla 的信息
我无法访问新的辅助窗口的属性。我总是在 javascript 控制台中收到错误消息“错误:未捕获的异常:获取属性的权限被拒绝。为什么会这样?
这是因为跨域脚本安全限制(也称为“同源策略”)。从不同来源(域名)加载到窗口(或框架)中的脚本无法获取或设置另一个窗口(或框架)的属性或其来自另一个不同来源(域名)的任何 HTML 对象的属性。因此,在执行针对辅助窗口的脚本之前,主窗口中的浏览器将验证辅助窗口是否具有相同的域名。有关跨域脚本安全限制的更多阅读:http://www.mozilla.org/projects/secu...me-origin.html
所以你的答案是
否则,你就会受到限制。
编辑-真正的答案
window.open('javascript:doFunction()')除了打开一个新的空白窗口之外不会执行任何操作,该窗口由于doFunction未定义而无法执行任何操作。它需要在同一窗口中定义。
旁注我可以通过直接将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"); ');
Run Code Online (Sandbox Code Playgroud)
在 Firefox 中失败。我还没有在 MSIE 中测试过它。但
测试:
(失败)Chrome 7(控制台)来自http://stackoverflow.com:80
>>> x = window.open('http://google.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
TypeError: Cannot read property 'body' of undefined
Run Code Online (Sandbox Code Playgroud)
(成功)Chrome 7(控制台)来自http://stackoverflow.com:80
>>> x = window.open('http://stackoverflow.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
"test"
Run Code Online (Sandbox Code Playgroud)
(失败)Firefox 3.6(控制台)来自http://stackoverflow.com:80
>>> 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>.
Run Code Online (Sandbox Code Playgroud)
(成功)Firefox 3.6(控制台)来自http://stackoverflow.com:80
>>> x = window.open('http://stackoverflow.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
"test"
Run Code Online (Sandbox Code Playgroud)
(失败)Firefox 3.6(控制台)来自http://stackoverflow.com:80
$.ajax({
url:'http://bing.com',
success:function(data) {
alert(data) // blank alert
}
})
Run Code Online (Sandbox Code Playgroud)
(成功)Firefox 3.6(控制台)来自http://stackoverflow.com:80
$.ajax({
url:'http://stackoverflow.com',
success:function(data) {
alert(data) // success
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2581 次 |
| 最近记录: |