Javascript 从Rails设置document.domain的干燥方式
我有一个Rails应用程序,它使用两个子域,希望用JavaScript进行通信。有效设置Javascript 从Rails设置document.domain的干燥方式,javascript,ruby-on-rails,cors,cross-domain,Javascript,Ruby On Rails,Cors,Cross Domain,我有一个Rails应用程序,它使用两个子域,希望用JavaScript进行通信。有效设置document.domain=mydomain.com的最简单方法是什么 使其不那么直截了当的条件 在域为localhost的开发或测试环境中,这应该不是问题 这也需要在某些不加载主JavaScript文件的页面上设置 条件1让我觉得我要么想要依赖一个正则表达式,它从location.host解析根域,要么在erb中进行切换 条件2让我觉得最好写一次,并将其放入资产管道中,必要时将其包括在内 最佳势解 创建
document.domain=mydomain.com
的最简单方法是什么
使其不那么直截了当的条件
localhost
的开发或测试环境中,这应该不是问题1
让我觉得我要么想要依赖一个正则表达式,它从location.host
解析根域,要么在erb
中进行切换
条件2
让我觉得最好写一次,并将其放入资产管道中,必要时将其包括在内
最佳势解
创建一个类似于domain\u setter.js.erb
(以下内容)的文件,将其添加到预编译列表中,并将其包含在所有必要的位置(清单中的\\=require domain\u setter
或javascript\u include\u标记“domain\u setter”
,用于没有清单的页面)
tl;博士
使用Rails设置多个页面的
document.domain
是一种干巴巴的方法吗?我认为您正在寻找跨源资源共享(CORS)。这允许javascript跨不同的域发出AJAX$.get/post
请求
下面是一个rails库,让您开始学习:
您需要将
origins
属性设置为yoursubdomain.herokuapp.com
我想您正在寻找跨源资源共享(CORS)。这允许javascript跨不同的域发出AJAX$.get/post
请求
下面是一个rails库,让您开始学习:
您需要将
origins
属性设置为yoursubdomain.herokuapp.com
这与CORS密切相关,但我没有在两个不同的域之间通过Ajax进行通信,而是在不同的子域上寻找两个页面,通过JavaScript进行通信。举个小例子,在任何页面上打开控制台,然后进入window.open('/')
。在刚刚打开的窗口中,在控制台中输入window.opener.console.log('back to your original page')
,您将在原始窗口的控制台中看到该输出。这是不可能跨子域的,除非它们的域设置得更低。啊,你看过PostMessageAPI了吗?我只是看了一下,它非常有用,特别是对于与其他领域的通信。我觉得当两个窗口都有相同的document.domain
时,直接调用参数会更安全、更方便。这与CORS密切相关,但我不是在两个不同的域之间通过Ajax进行通信,而是在不同的子域上寻找两个页面通过JavaScript进行通信。举个小例子,在任何页面上打开控制台,然后进入window.open('/')
。在刚刚打开的窗口中,在控制台中输入window.opener.console.log('back to your original page')
,您将在原始窗口的控制台中看到该输出。这是不可能跨子域的,除非它们的域设置得更低。啊,你看过PostMessageAPI了吗?我只是看了一下,它非常有用,特别是对于与其他领域的通信。我觉得当两个窗口都有相同的document.domain
时,直接调用参数会更安全、更方便。要添加一些背景,这是允许同一个域的不同子域上的两个页面能够通过JavaScript进行通信。i、 e.我希望foo.mydomain.com
和bar.mydomain.com
进行通信,这要求它们都有一个较低的域集mydomain.com
。为了添加一些背景,这是为了允许同一域的不同子域上的两个页面能够通过JavaScript进行通信。i、 e.我希望foo.mydomain.com
和bar.mydomain.com
进行通信,这要求两者都有一个较低的域集mydomain.com
。
<%- if Rails.env.production? %>
document.domain = 'mydomain.com';
<%- end %>
(function() {
var domain = /^(?:https?\:\/\/)?.*?([^.]+\.[^.]+?)(?:\:\d+)?$/.exec(location.host);
if (domain == null) {
document.domain = 'localhost';
} else {
document.domain = domain[1];
}
})();