【问题标题】:Ways to detect CTRL-N or when a user opens a new window检测 CTRL-N 或用户打开新窗口时的方法
【发布时间】:2010-10-12 12:52:04
【问题描述】:

我们如何检测用户何时打开新窗口。用户已通过身份验证,我们大量使用会话。

我们试图避免 Ctrl+N javascript 挂钩,但也许这是一种选择。

我假设请求是完全相同的 URL...与 Ctrl+N

【问题讨论】:

  • 有什么问题?会话将跨窗口维护。
  • 同上 - 无论如何你不能可靠地做到这一点,但据我所知,这不是问题

标签: javascript html new-window


【解决方案1】:

为什么?

而且无论如何你都无法检测到它。用户不仅可以使用 Ctrl+N 打开新窗口,还可以使用 File->New Window

【讨论】:

    【解决方案2】:

    是与否,

    如果控件具有焦点,您将始终看到它,否则事件会直接发送到浏览器并且页面上的代码永远不会听到它。

    根据我的经验,你不能劫持浏览器的快捷方式,你的里程可能会有所不同。您可能知道它发生了,但浏览器会做它的事情(原因很明显)

    在大多数浏览器中,Ctrl-N 的作用是在与旧窗口相同的 URL 处打开一个新窗口,并将其与相同的 sessionID 关联。

    如果可能的话,最好的办法是修改后端代码并允许这样的事情。破坏浏览器的功能从来都不是一件好事。

    【讨论】:

      【解决方案3】:

      我为解决这个问题所做的是当用户进行身份验证时,在有效登录时设置窗口名称。

      <script>
      
      window.name = 'oneWindow';
      
      </script>
      

      然后在母版页上做一个 javascript 检查:

      <script>
      
      if (window.history.length == 0 || window.name != 'oneWindow') 
      
      //history length to see if it's a new tab or opened in a new window  0 for IE, 1 for FF
      
      //window name to see if it's a CTRL + N new window
      
      </script>
      

      如果检查结果为真,则隐藏/删除页面的主要内容并显示一条消息,说明他们正在执行不受支持的操作。

      当您的登录页面未绑定到母版页时,此方法有效。

      如果您没有母版页,那么我建议您检查所有页面。

      【讨论】:

      • 只有在您右键单击链接并选择在新窗口/选项卡中打开它时才会出现这种情况 - 如果您从 MSIE 的文件菜单中选择“新窗口”则不会这样做
      • @symcbean 当我们为 MSIE 7 开发时,此代码在我们的应用程序上工作。我猜您的发现对于较新版本的 MSIE 是正确的。此后,我们重新设计了我们的应用程序以更好地处理会话的使用,并且不再使用此解决方案将用户限制为单窗口体验。
      【解决方案4】:

      您可以将窗口计数放入会话中,并在 window.onload 上增加它并在 window.onunload 上减少它。

      想象一下,如果你使用它,我会吐口水,从牙齿里吸出空气,然后说“你比我更好,老兄”。

      【讨论】:

        【解决方案5】:

        如果打开一个新窗口导致您的应用程序出现问题,那么您应该修复应用程序代码来处理它,而不是尝试应用不一致且不可靠的客户端“绷带”。这是我的看法。

        【讨论】:

          【解决方案6】:

          我们试图避免 ctrl-n javascript 钩子

          算了。虽然理论上您可以尝试使用 Control 键修饰符捕获“n”的按键事件,但还有许多其他方法可以打开更可能使用的新窗口或选项卡,但您将无法去抓。文件->新窗口/选项卡,中键单击或Shift单击链接,中键单击后退/前进按钮,右键单击-在新窗口中打开,在新选项卡中打开书签,双击浏览器图标...

          用户已通过身份验证,我们大量使用会话。

          这本身不应该是个问题。我猜你的意思是你的应用程序在会话中转储了它不应该有的各种特定于页面的数据,现在你发现当你打开多个窗口时应用程序会中断?好吧,同情和愉快的重写。

          与此同时,您所能做的就是告诉用户“请不要尝试在同一个应用程序上打开两个浏览器窗口”。有一些潜在的方法可以让 JavaScript 在一个页面上通知 JavaScript 同时在同一域中的另一个页面上运行,通常涉及使用 document.cookie 作为页面间通信管道。但这也有点脆弱。

          【讨论】:

            猜你喜欢
            • 2011-04-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多