当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对象的属性。因此,在执行针对辅助窗口的脚本之前,主窗口中的浏览器将验证辅助窗口是否具有相同的域名。 有关跨域脚本安全限制的详细信息:

那么你的答案是

  • 因此,如果协议、主机名和端口对于除IE之外的所有浏览器都匹配,那么它是同一个域
  • 如果IE的协议和主机名匹配,则它是同一个域
  • 否则,您将受到限制

    编辑-真实答案

    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
       }
    })