为用户提供快速隐蔽的网站退出方式

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 提供适合您旅程各个阶段的云产品。立即开始使用 价值 200 美元的免费积分!

一位读者提出了一个非常有趣且重要的问题。答案可能会让人免受伤害,甚至可能挽救生命。

我正在为家庭暴力受害者重新设计一个网站。该项目的负责人希望我在网站中加入一个按钮,以便受害者在被发现时可以点击隐藏窗口。我不知道关于这种事情有哪些可行的方案。有什么建议吗?

我首先想到的是技术上的东西:你是否可以通过点击按钮来关闭窗口?有一个 window.close() 方法,也许可以使用?

<button onclick="window.close();">Close Window</button>

不,我们不能指望它。这只会关闭用 JavaScript 打开的窗口,在典型的网站上并非如此。

但无论如何,我们真的想这样做吗?你有没有遇到过这样的人:你走到他们面前时,他们立刻关闭了浏览器窗口?即使是巧合,看起来也很可疑,不是吗?我认为在这种情况下,我们尤其要避免嫌疑。

一个更简单、更不引起怀疑的办法是将页面重定向到一些通用且无害的网站,比如 weather.com。另一个优势是,你可以确定它可以在任何浏览器中运行。

<button onclick="window.location = 'http://weather.com';">Go</button>

但我们可以做得更好。如果施暴者走进来,发现受害者突然切换网站看起来很可疑怎么办?也许他们会强迫受害者点击后退按钮查看他们之前在看什么,或者自己操作。为了避免这种情况,我们应该尽可能在新的标签页中打开链接,这样就不会有直接的浏览器历史记录。

如果我们开始将 JavaScript 与按钮本身分离,我们将得到

<button id="get-away">Go</button>
$("#get-away").on("click", function() {
  window.open("http://weather.com", "_newtab");
});

新的标签页不会有直接的浏览器历史记录,因此点击后退按钮不会跳转到任何页面。这很好,但打开一个新的标签页看起来与仅仅更改页面略有不同。如果施暴者注意到这一点,也许他们会点击回到上一个标签页,看看里面有什么。我们可以尝试通过更改原始页面的位置来防止这种情况

$("#get-away").on("click", function() {
  window.open("http://weather.com", "_newtab");
  window.location.replace('http://google.com');
});

通过替换原始页面上的 URL,它不会添加新的浏览器历史记录项目。因此,后退按钮将返回到之前的页面。如果受害者在原始网站上浏览过,后退按钮将不幸返回到那些页面。也许原始网站可以使用某种不影响浏览器历史记录的 Ajax 页面加载方式来防止这个问题。据我所知和研究,没有办法通过 JavaScript 完全清除浏览器历史记录。

另一个需要考虑的是这个“退出”按钮的位置、样式和内容。你已经可以手动清除浏览器历史记录、更改网站、打开新的标签页和关闭浏览器窗口。这里的重点是非常快地在紧急情况下执行这些操作。因此,在一个页面上的某个角落放一个小按钮没有太大用处,尤其是因为受害者并没有习惯快速找到这个按钮。他们更有可能使用更常用的控件,比如窗口关闭按钮。

从设计的角度来看,我认为最好的方案是使用大型、明显且持久的按钮。

那个大大的绿色条将是一个固定位置的全宽条。因此,无论如何它都会粘在页面的底部。文本“Go”简单、描述性且不引起怀疑(“go”这个词在网络上随处可见)。绿色与“Go”这个词相匹配,而不是危险的指示。

这里还有一个问号链接,它可以链接到一个页面,解释这个巨大的奇怪条的用途。

到目前为止,这已经很不错了,但尽管目标很大,但移动鼠标可能会有点笨拙和缓慢。也许受害者正在输入东西时施暴者走进来。我们可以提供一个键盘快捷键来完成与点击该条相同的操作。TheESCAPE键似乎很合适。

由于我们需要以两种不同的方式触发类似的操作(按键或点击),因此是时候将功能抽象到一个函数中,以避免重复代码。

function getAway() {
  // Get away right now
  window.open("http://weather.com", "_newtab");
  // Replace current site with another benign site
  window.location.replace('http://google.com');
}

$(function() {

  $("#get-away").on("click", function(e) {
    getAway();
  });

  $("#get-away a").on("click", function(e) {
    // allow the (?) link to work
    e.stopPropagation();
  });

  $(document).keyup(function(e) {
    if (e.keyCode == 27) { // escape key
      getAway();
    }
  });

});

新的按键“escape”在 Chrome 和 Opera 中的工作方式完全相同。在 Safari 中,会打开一个新的标签页并替换旧页面,但新标签页是空白的(显然,你不能在 Safari 中从按键中打开带有位置的新窗口)。Firefox 会立即替换当前页面,但默认情况下会阻止弹出窗口,除非你明确地在网站上允许它们。

请注意,我使用了“keyup”事件。使用“keydown”来使其更直接很诱人,但不幸的是,IE 在 Escape 键的 keydown 上不会触发值为 27 的 keyCode。

查看演示

你怎么看?这是否是我们所能提供的最好的解决方案?你是否有更好的想法,可以为家庭暴力受害者提供一种快速隐蔽的退出网站的方式?

评论中的好东西

  • 真实网站 使用退出方法。已下线。
  • 该网站在您启动退出时会隐藏整个主体(例如,$("body").hide();)。这样一来,隐藏就会立即发生,而不是等待下一个页面加载。
  • 教育用户如何私密浏览非常明智(例如,Chrome 的“隐身模式”)。
  • 更改页面上的文本(例如,从维基百科中提取随机内容)可能是一种不太明显的更改。假设重定向到的网站与原始网站相差太大,甚至可能发出更多/更少的屏幕亮度。
  • 在 iframe 中加载页面将防止添加到浏览器历史记录,但会影响可用性。
  • 如果您能够检测到闲置状态,请在合理的时间后自动重定向页面。如果受害者不小心在电脑上打开了页面。
  • 由于您无法擦除浏览器历史记录,因此您可能应该将大量无害的内容转储到浏览器历史记录中,以掩盖旧内容。