小编Tom*_*s M的帖子

标签或窗口之间的通信

我正在寻找一种方法,如何在浏览器中的多个选项卡或窗口之间进行通信(在同一个域上,而不是CORS),而不留痕迹.有几个解决方案:

  1. 使用窗口对象
  2. 的postMessage
  3. 饼干
  4. localStorage的

第一个可能是最糟糕的解决方案 - 你需要从当前窗口打开一个窗口,然后只要你打开窗户就可以进行通信.如果您在任何窗口中重新加载页面,则很可能会丢失通信.

第二种方法,使用postMessage,可能启用跨源通信,但遇到与第一种方法相同的问题.您需要维护一个窗口对象.

第三种方式,使用cookie,在浏览器中存储一些数据,这可以有效地看起来像向同一域上的所有窗口发送消息,但问题是你永远不知道所有标签是否已经读过"消息"打扫干净.您必须实现某种超时以定期读取cookie.此外,您受限于最大cookie长度,即4KB.

使用localStorage的第四种解决方案似乎克服了cookie的限制,甚至可以使用事件进行监听.接受的答案中描述了如何使用它.

编辑2018:接受的答案仍然有效,但现代浏览器有一个更新的解决方案,使用BroadcastChannel.有关如何使用BroadcastChannel在选项卡之间轻松传输消息的简单示例,请参阅其他答案.

javascript browser html5 ipc broadcast-channel

136
推荐指数
7
解决办法
7万
查看次数

如何粘贴点击?它适用于谷歌文档

我希望能够在用户点击时启动真正的粘贴事件.我可以理解这可能是一个安全问题,因为如果任何网页有权访问用户剪贴板,那就不好了.所以我认为所有浏览器都不允许访问剪贴板数据.

但是例如在谷歌文档(在类似文字的应用程序中),我可以从自定义上下文菜单粘贴(鼠标右键单击假装为上下文菜单的html元素),即使剪贴板数据已被复制到剪贴板中应用程序,如Microsoft Paint.这适用于Google Chrome浏览器,这是我感兴趣的浏览器.

我认为他们使用闪光灯,但即使我完全禁用闪光灯,它仍然有效.关于这个问题已经有了问题,但提到的答案并不正确.该问题的另一个答案表明谷歌正在使用Chrome扩展程序,但即使我禁用了Chrome中的所有扩展程序,它仍然有效.

如何在Windows中重现:

  • 在Chrome中禁用闪存,禁用所有扩展名
  • 重新开始
  • 转到谷歌文档并打开新的空写作文档(文档,而不是电子表格)
  • 在Windows中运行microsoft paint应用程序
  • 在microsoft paint中绘制一些东西,按Ctrl + A选择全部,按Ctrl + C进行复制
  • 切换回chrome到docs空白页面,然后右键单击空白页面
  • 选择人工上下文菜单粘贴(注意上下文菜单中是不是从Windows本机菜单,但它来自谷歌文档的Html网页)
  • 您将看到剪贴板图像已粘贴到docs文档(!)
  • 他们如何做到这一点?

如果用户在我的网页上按下Ctrl + V,我知道如何访问剪贴板数据,因为这会在当前窗口中触发粘贴事件.但是,如何在用户只需单击按钮或div时,在javascript(或使用jquery)中访问剪贴板数据启动实际剪贴板数据(例如,在mspaint中复制的位图)的粘贴

javascript clipboard jquery paste

30
推荐指数
2
解决办法
7638
查看次数

可见性:隐藏会慢慢传播给孩子吗?

我有一些带有“effect”类的嵌套元素,如下所示:

<style>
   .effect { transition: opacity 1s, visibility 1s; }
</style>

<div id=parent class=effect>
   <a href=#>aaaaaaaaaaaaa</a>
   <div id=child class=effect>
      <a href=#>bbbbbbbbbbbbbb</a>
      <div id=childofchild class=effect>
        <a href=#>cccccccccccc</a>
      </div>
   </div>
</div>
Run Code Online (Sandbox Code Playgroud)

通常我会调用以下命令来淡出父块(包括所有子块):

$('#parent').css({'opacity':0, 'visibility':'hidden'});
Run Code Online (Sandbox Code Playgroud)

但我注意到奇怪的行为(即使在所有内容都应该隐藏的情况下,某些链接仍然可以单击),因此我删除了不透明度更改以演示问题:

$('#parent').css({'visibility':'hidden'});
Run Code Online (Sandbox Code Playgroud)

这应该跳过不透明度更改并像以前一样运行 - 因此它应该在第一秒后隐藏父级(以及所有子级,正如我假设的那样),但它有点奇怪,它表明需要几秒钟才能隐藏子级顺序。

jsfiddle

看起来效果只有在完成到子元素后才会缓慢传播。如何在第一秒后隐藏包括所有子元素的元素,但不需要暂时删除所有子元素上的“效果”类?

javascript css jquery

5
推荐指数
1
解决办法
1067
查看次数

ShowWindow() SW_HIDE 窗口立即隐藏,无效果

在我的 C++ 应用程序中,我有以下代码:

ShowWindow(hDlg, SW_HIDE);
MakeScreenshot();
ShowWindow(hDlg, SW_SHOW);
Run Code Online (Sandbox Code Playgroud)

这应该捕获屏幕截图,而不需要当前应用程序窗口。然而有一个问题。SW_HIDE 需要一些时间,因为我的 Windows 8.1 配置为使用动画效果。因此,窗口的隐藏大约需要 400 毫秒,如果在此间隔期间捕获屏幕截图(事实确实如此),它还将包含应用程序本身的窗口,这是我不喜欢的。

有什么方法可以立即隐藏当前窗口,这样它就不会包含在创建屏幕截图函数中,该函数在它之后立即调用?如果没有,除了应用程序本身之外,还有其他首选方法如何截取 Windows 桌面的屏幕截图吗?在 MakeScreenshot 之前添加延迟并不是什么好的解决方案。谢谢。

c++ winapi

5
推荐指数
1
解决办法
5437
查看次数

Javascript 公钥/私钥加密

我想在javascript中生成一个公钥/私钥对,并使用公钥来加密消息和私钥来解密消息。

与外部库相比,我更喜欢本机浏览器支持。我怎样才能在 JavaScript 中做到这一点?

现代浏览器实现window.crypto.subtle.generateKey. 我可以用它来生成 ECDSA 私钥/公钥来签署/验证消息,这是有效的。但是我找不到如何使用它来生成公钥/私钥来加密/解密的方法。如果我为推荐的 AES-GCM 算法尝试 generateKey,它只会生成一个 cryptoKey,它可能可用于加密和解密。但我更喜欢得到一个密钥对(publib/private 密钥),而不仅仅是一个单一的密钥。有什么建议?

该表列出了当前支持的方法,但似乎没有一种绿色算法是我需要的:https : //diafygi.github.io/webcrypto-examples/

javascript encryption

5
推荐指数
1
解决办法
5292
查看次数