【问题标题】:Calling window.open through port通过端口调用window.open
【发布时间】:2017-04-08 14:48:18
【问题描述】:

我正在实施社交身份验证。当用户点击一个按钮时,我会发送一个命令,这样我就可以调用window.open()

查看这个调用堆栈,我们可以看到端口处理程序在下一个事件循环中被调用:

由于window.open 没有在点击事件生命周期内被调用,因此像 safari 这样的浏览器不允许显示弹出窗口。

你的方法是什么?

【问题讨论】:

  • 你能在 Elm 中创建一个 iframe 覆盖层,并将 src 设置为相关的登录页面吗?
  • @SimonH 不,这是security concern
  • 您是否在使用某种事件批处理框架?通过单击处理程序中的端口调用 window.open 确实可以正常工作。

标签: elm


【解决方案1】:

这不是超级漂亮,但你可以做类似的事情

a 
    [ Html.Attributes.attribute "onClick" "window.open(this.href, this.target, 'width=800,height=600'); return false;" ]
    [ text "Click me" ]

【讨论】:

  • 直到我们控制命令是否应该等待下一个事件循环,这是最直接的方法
【解决方案2】:

这是处理这个问题的一种卑鄙的方式,并且不能 100% 严格保证在未来的 elm 版本中继续工作,但我在紧要关头做了不止一次:

https://medium.com/@prozacchiwawa/the-i-m-stupid-elm-language-nugget-7-8d3efd525e3e

DOM 节点类型上的属性 getter 可以在事件处理期间由 json 解码器触发。您可以运行任何您想要的代码作为访问它的副作用。 json 解码器访问的对象是事件处理程序堆栈上的真实事件对象,就像现在一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多