使用 postMessage 将数据发送到另一个域






4.76/5 (4投票s)
在这篇文章中,我们将了解如何从我们的应用程序向另一个域发送数据。
在这篇文章中,我们将了解如何从我们的应用程序向另一个域发送数据。你可以简单地称之为跨域数据共享。在某些情况下,我们可能需要发送一些数据,这些数据对于我们的其他域或应用程序按预期工作是必需的。我在我的编程生涯中遇到过一些这样的情况。我使用 postMessage
方法完成了这个需求。window.postMessage
方法帮助我们启用跨域通信。希望你喜欢这篇文章。
背景
我被迫在我的第二个应用程序中每次维护一些 cookie。而且,我希望从我的第一个应用程序设置相同的 cookie。因此,我使用 window.postMessage
实现了这一点。为了演示目的,我在这里创建两个应用程序
CrossDomainDataSharing
Receiver
Using the Code
首先,我们将专注于 CrossDomainDataSharing
应用程序,在这个应用程序中我们将数据发送到 Receiver
应用程序。
首先,你需要将 jQuery 引用添加到你的页面。为了使这个应用程序更时尚,我添加了 Smart Alert 到我们的应用程序,你可以看到下面所需的引用和样式。
<script src="Scripts/jquery-2.2.0.min.js"></script>
<script src="js/alert.min.js"></script>
<link href="css/alert.min.css" rel="stylesheet" />
<link href="themes/dark/theme.css" rel="stylesheet" />
下一步是“调用窗口加载”函数。
window.onload = function () {
document.getElementById('btnSend').addEventListener('click', sendData);
};
这里,我们只是将一个点击事件添加到 id 为 btnSend
的按钮上。在添加事件之前,请确保你已经创建了一个按钮。
<button id="btnSend">Send Feedback</button>
下一步是创建一个 iframe 并将我们的第二个应用程序链接加载到其中,通过提供 src
值来实现。
<iframe id="ifrLoad"
src="https://:55592/Receiver/Cross-Domain-Data-Sharing-Receiver.html"
style="display: none;">
<p>Oops!. Your browser does not support iframes.</p>
</iframe>
你注意到我们调用了一个名为 sendData
的函数。让我们看看这个函数的作用。
function sendData(e) {
try {
$.alert.open('prompt', 'Please send your feedback!.', function (button, value) {
if (button == 'ok') {
e.preventDefault();;
var myIfr = window.frames['ifrLoad'].contentWindow;
myIfr.postMessage(value, 'https://:55592/Receiver/Cross-Domain-Data-Sharing-Receiver.html')
$.alert.open('Thank you so much for your feedback.' || 'No value has been entered');
}
});
} catch (e) {
console.log('Error: ' + e.message);
}
}
我们首先创建一个智能提示,如果用户说“Ok
”,我们将使用 postMessage
方法将给定的反馈传递到我们的第二个应用程序。实现非常简单,不是吗?
你可以按照以下方式设置你创建的按钮的样式
<style>
#btnSend {
margin-left: 11px;
border: solid 1px #000;
padding: 9px 22px 7px;
min-width: 32px;
font-weight: bold;
line-height: 13px;
color: #fff;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5);
background-color: #232323;
background-image: linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
background-image: -webkit-linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
background-image: -moz-linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
background-image: -o-linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
background-image: -ms-linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
-pie-background: linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
border-radius: 3px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-webkit-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-moz-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-ms-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-o-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
}
#btnSend:hover {
background-color: #404040;
background-image: linear-gradient(#515151 1%, #2e2e2e);
background-image: -webkit-linear-gradient(#515151 1%, #2e2e2e);
background-image: -moz-linear-gradient(#515151 1%, #2e2e2e);
background-image: -o-linear-gradient(#515151 1%, #2e2e2e);
background-image: -ms-linear-gradient(#515151 1%, #2e2e2e);
-pie-background: linear-gradient(#515151 1%, #2e2e2e);
box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-webkit-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-moz-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset,
0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-ms-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-o-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
}
</style>
现在发送部分就完成了,请在这里查看我们的第一个应用程序的完整代码。
<!DOCTYPE html>
<html>
<head>
<title>Cross Domain Data Sharing Demo - Sibeesh Passion</title>
<script src="Scripts/jquery-2.2.0.min.js"></script>
<script src="js/alert.min.js"></script>
<link href="css/alert.min.css" rel="stylesheet" />
<link href="themes/dark/theme.css" rel="stylesheet" />
<style>
#btnSend {
margin-left: 11px;
border: solid 1px #000;
padding: 9px 22px 7px;
min-width: 32px;
font-weight: bold;
line-height: 13px;
color: #fff;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5);
background-color: #232323;
background-image: linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
background-image: -webkit-linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
background-image: -moz-linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
background-image: -o-linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
background-image: -ms-linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
-pie-background: linear-gradient(#2b2b2b 1%, #1d1d1d 99%);
border-radius: 3px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-webkit-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-moz-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-ms-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-o-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
}
#btnSend:hover {
background-color: #404040;
background-image: linear-gradient(#515151 1%, #2e2e2e);
background-image: -webkit-linear-gradient(#515151 1%, #2e2e2e);
background-image: -moz-linear-gradient(#515151 1%, #2e2e2e);
background-image: -o-linear-gradient(#515151 1%, #2e2e2e);
background-image: -ms-linear-gradient(#515151 1%, #2e2e2e);
-pie-background: linear-gradient(#515151 1%, #2e2e2e);
box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-webkit-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-moz-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-ms-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
-o-box-shadow: 0 1px rgba(2, 3, 3, 0.5),
0 1px rgba(255, 255, 255, 0.07) inset, 0 0 0 1px rgba(255, 255, 255, 0.06) inset;
}
</style>
<script>
window.onload = function () {
document.getElementById('btnSend').addEventListener('click', sendData);
};
function sendData(e) {
try {
$.alert.open('prompt',
'Please send your feedback!.', function (button, value) {
if (button == 'ok') {
e.preventDefault();;
var myIfr = window.frames['ifrLoad'].contentWindow;
myIfr.postMessage(value,
'https://:55592/Receiver/Cross-Domain-Data-Sharing-Receiver.html')
$.alert.open('Thank you so much for your feedback.' ||
'No value has been entered');
}
});
} catch (e) {
console.log('Error: ' + e.message);
}
}
</script>
</head>
<body>
<button id="btnSend">Send Feedback</button>
<iframe id="ifrLoad"
src="https://:55592/Receiver/Cross-Domain-Data-Sharing-Receiver.html"
style="display: none;">
<p>Oops!. Your browser does not support iframes.</p>
</iframe>
</body>
</html>
现在我们将专注于我们的第二个应用程序 ‘Receiver
’。
我们将添加一个 window load
函数,并带有事件监听器,该监听器接受来自我们第一个应用程序的数据。请参阅以下代码以获取更多说明。
$(window).load(function () {
window.addEventListener('message', addData);
function addData(e) {
document.cookie = "myData=" + e.data;
};
});
这里,
myData
是 cookie 的名称。
你可以在这里查看我们的第二个应用程序的完整代码。
<!DOCTYPE html>
<html>
<head>
<title>Cross Domain Data Sharing Receiver - Sibeesh Passion</title>
<script src="Scripts/jquery-2.2.0.min.js"></script>
<script>
$(window).load(function () {
window.addEventListener('message', addData);
function addData(e) {
document.cookie = "myData=" + e.data;
};
});
</script>
</head>
<body>
</body>
</html>
现在是时候查看我们的输出了。
输出
在将数据发送到我们的第二个应用程序时。
在我们的第二个应用程序中接收数据时。
就这样。我们完成了。祝你编码愉快。
结论
我是否遗漏了你认为需要的任何内容?你是否曾经想过做这个需求?你觉得这篇文章有用吗?希望你喜欢这篇文章。请与我分享你宝贵的建议和反馈。
现在轮到你了。你有什么想法?
没有评论的博客不是一个博客,但请尽量保持主题相关。如果你有一个与这篇文章无关的问题,最好在 C# Corner、Code Project、Stack Overflow、ASP.NET 论坛上发布,而不是在这里评论。将问题的链接推特或发邮件给我,如果我能帮助你,我一定会尽力而为。