窗口之间通信类

通信方式有很多种:

  • ajax 不支持跨域通信(XMLHttpRequest2 其实标准的浏览器也是可支持跨域,只要后端设置一下头部也是可以跨域的,设置header(Access-Control-Allow-Origin: http://mywebdomain.com) 
  • webSocket  支持跨域通信
  • JSONP 支持跨域通信
  • PostMessage 支持跨域通信
  • CORS   支持跨域也支持同源, 是一个新的通信协议标准

 

跨域通信的几种方式
  • JSONP
  • Hash
  • postMessage
  • WebSocket
  • CORS
  • 借助Nginx/Apache 。。。

 

今天先来看下窗口之间的通信方式:

一般窗口通信分为三种:

1. iframe嵌套:多个iframe之间通信。

  1. 父页面操作子页面元素:oFrame.contentWindow.document.body。
  2. 父页面调用子页面方法:oFrame.contentWindow.functionName()。
  3. 子页面调用父页面元素:window.top/parent/window

2. 用window.open()方法打开一个新的窗口。

 

  • 父页面操作子页面元素:window.open()打开子页面时,返回子页面窗口对象。
  • 子页面操作父页面元素:window.opener即为父窗口对象。

 

3. html5t提供的postMessage方法和message事件。(可以跨域通信)

  • postMessage():接收消息窗口对象.postMessage("发送的数据","接收的域"); 这里的域一定要带上协议
  • message事件:接收消息窗口监听message事件,事件对象中包含有origin属性和data属性。其中ev.origin可以获取发送数据的域,ev.data获取发送的具体数据。
  •  1 <!DOCTYPE html>
     2 <html>
     3     <head>
     4         <meta charset="UTF-8">
     5         <title></title>
     6     </head>
     7     <body>
     8         <iframe id="myFrame" src="http://localhost:63342/XChart/Iframe2.html" width="600px;"></iframe><br />
     9         <input type="button" value="向子窗口发送数据" id="btn" />
    10     </body>
    11 </html>
    12 <script type="text/javascript">
    13     window.onload = function(){
    14         var myFrame = document.getElementById("myFrame");
    15         var oBtn = document.getElementById("btn");
    16         
    17         oBtn.onclick = function(){
    18             myFrame.contentWindow.postMessage("testData","http://localhost:63342");
    19         }
    20     }
    21     function parentWindowHandler(){
    22         alert("这是父窗口的方法,可以被子窗口调用");
    23     }
    24 </script>
    postMessage
     1 <!DOCTYPE html>
     2 <html>
     3     <head>
     4         <meta charset="UTF-8">
     5         <title></title>
     6     </head>
     7     <body>
     8         <p>http://localhost:63342/XChart/Iframe2.html</p>
     9     </body>
    10 </html>
    11 <script type="text/javascript">
    12     window.onload = function(){
    13         window.addEventListener("message",function(ev){
    14             alert("父窗口向子窗口发送的数据是:" + ev.data);
    15             alert("数据来源是:" + ev.origin);
    16         })
    17     }
    18 
    19 </script>
    View Code
  1. 其中postMessage和Message可以实现跨域的窗口间的通信。
  1. 以上内容欢迎大家提出疑问,有问题可以随意提出,共同进步,共同学习!!

转载于:https://www.cnblogs.com/chenyajie/p/8928896.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C# 窗体应用程序中,可以使用多种方式实现窗体之间的数据通信,以下是几种常见的方式: 1. 使用委托:定义一个委托,将需要传递的数据作为参数,当需要传递数据时,调用该委托,如: ``` public delegate void DataDelegate(string data); // 定义委托变量 public DataDelegate dataDelegate; // 在窗体中调用委托 dataDelegate?.Invoke(data); // 在另一个窗体中将委托变量赋值为第一个窗体中的委托 form1.dataDelegate = form2.dataDelegate; ``` 2. 使用事件:定义一个事件,将需要传递的数据作为参数,当需要传递数据时,触发该事件,如: ``` public event EventHandler<DataEventArgs> DataEvent; // 触发事件,传递数据 DataEvent?.Invoke(this, new DataEventArgs(data)); // 在另一个窗体中订阅事件,接收数据 form1.DataEvent += (sender, e) => { string data = e.Data; }; ``` 3. 使用公共静态变量:在一个静态中定义一个公共静态变量,来存储需要传递的数据,如: ``` public static class DataHelper { public static string Data { get; set; } } // 在一个窗体中设置数据 DataHelper.Data = data; // 在另一个窗体中获取数据 string data = DataHelper.Data; ``` 4. 使用消息机制:使用 Windows API 中的 SendMessage 和 PostMessage 方法,将需要传递的数据封装在消息中,发送给另一个窗体,如: ``` [DllImport("user32.dll", EntryPoint = "SendMessage")] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", EntryPoint = "PostMessage")] public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); // 定义消息常量 public const int WM_MYMESSAGE = 0x0400; // 封装消息,将需要传递的数据作为 lParam 参数 var data = "hello"; var lParam = Marshal.StringToHGlobalAnsi(data); SendMessage(hwnd, WM_MYMESSAGE, IntPtr.Zero, lParam); ``` 以上是几种常见的窗体之间的数据通信方式,在实际应用中,可以根据具体情况选择适合的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值