-1

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

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

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

4

6 回答 6

10

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

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

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

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

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

于 2009-03-10T20:39:47.523 回答
3

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

于 2009-03-10T20:51:23.080 回答
2

为什么?

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

于 2009-03-10T20:31:44.190 回答
1

您可以将窗口计数放入会话中,然后将其递增window.onload和递减window.onunload

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

于 2009-03-10T21:04:36.293 回答
1

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

<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>

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

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

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

于 2009-10-15T15:13:09.070 回答
0

是与否,

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

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

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

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

于 2009-03-10T20:36:15.457 回答